logo头像

一路过来,不过游牧自己。。

Redis小趣


关于Redis,应该是非常好用的一个NOSql数据库了,学习完之后真的感慨太强大了,特别是他的数据表达方式,特别适合数据量大的时候的思维方式,而且提供的方法也非常实用于数据处理!来看看怎么学习他

一、Redis初探

(1)简介

使用C语言编写的,基于内存的且支持持久化的,高性能的KEY-Value的 NOsql数据库,开源(BSD协议:没有那么多限制)
支持数据类型丰富:如字符串,散列(hashs),列表(lists),集合(sets),有序集合(sorted sets)与查找范围,bitmaps,hyperloglogs和空间,地理索引半径查询(例如微信附近的人,嘀嘀打车的范围内车辆等)
丰富的支持主流语言的客户端,c,c++,python等
用途:缓存(stackoverFLow)、数据库(微博),消息中间件(微博)内容存到mysql,关系技术存在mysql,整合使用

(2)NOsql分类

kv存储:Redis,memcached,简介:使用key快速查到values,memcached支持String类型的value,Redis支持String,set\hash、sortset list等类型
文档存储:MongoDB,CouchDB,简介:使用json或者类似JSON的BJSOn结构,存储内容为文档型,能实现部分关系型数据库的功能
列存储:HBase,Cassandra 简介:按照列进行存储,便于存储结构化和半结构化(例如日志)的数据,方便做数据压缩
图存储:Neo4J,FlockDB,简介:图形关系的存储,能很好弥补关系型数据库存储图片数据的不足
对象的存储:Db4o,Versant,简介:通过类似面向对象的语言操作数据库,通过对象的方式存储
XML数据库:BaseX,Berkeley DB XML,简介:高效存储XML数据,支持XML内部的查询语法,如XQuery, Xpath

注意:Redis一般偶数结尾的都是稳定版本

(3)优点、特点:

A:存在内存,不存在硬盘,所以不受io限制
B:独特的键值对模型
WHY?我们知道很多数据库只能处理一种数据结构:
SQL数据库—表格
Memcached—键值对数据库,键值都是字符串
文档数据库(MongoDB,CouchDB)—-由json\bson组成的文档
当然不是说他们不好,只是说一旦数据可提供的数据结构并不适合去做某些事的话,程序写起来就会麻烦和不自然
C:redis其值可以是五种数据结构中的任一种,方便你解决问题!

(4)其他

数据库有两种:存硬盘,存内存
硬盘:把值存在硬盘,在内存中建立存储索引
基于内存的直接不用建索引,直接找值,读写不受硬盘io速度的限制

(5)附加功能:

持久化功能:将数据存储在内存里面的数据保存到硬盘里面,保证数据安全,方便进行数据备份和恢复
发布和订阅功能:将消息同时分发给多个客户端,用于构建广播系统
过期键功能:为键设置一个过期时间,让他在指定的的时间后被删除
事务功能:原子的执行多个操作,并提供乐观锁功能,保证数据处理的安全性
Lua脚本功能:在服务端原子的执行多个操作,形成复杂功能,并减少客户端与服务端之间的通信往返次数
复制:为指定的redis服务器创建一个或多个复制品,用于提升数据安全,分担请求负载
Sentinet:
监控Redis服务器的状态,并在服务器发生故障时,自行进行故障转移
集群:创建分布式数据库,每个服务器分别执行一部分写操作和读操作
简单,有完善文档,易学

示例:
twitter用redis来存储用户时间线,usertimeline
StackOverFlow用Redis来进行缓存和消息分发
Github用Redis来作为持久化的键值对数据库
新浪用Redis,集群规模32Tb,使用Redis来实现计数器,反向索引,排行榜、消息队列,并存储用户关系
知乎用Redis进行计数,缓存,消息分发和任务调度

二、安装

学习环境:centos,redis2.8版本
安装命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
tar xf redis-2.8.18.tar.gz(解压安装)
cd redis-2.8.18
yum install gcc tcl -y
make(编译)
mkdir -p /usr/redis
make PREFTX=/usr/redis install (指定安装路径)
这时候redis里面就只有bin
cd redis-2.8.18/src
cp redis-sentinel /usr/redis/bin
vim ~/.bash_profile
进去profile之后,要修改:
export REDIS_HOME=/usr/redis
export PATH=$PATH:$REDIS_HOME/bin

source ~/.bash_profile

测试:redis-sever --help
做成后台daemon
cd redis-2.8.18/utils/
./install sever.sh
把编译好的redis作为一个服务,把6379.conf放到了/etc/init.d/redis_6379
cd /etd/init.d
mv redis_6379 redisd
(chkconfig --add redisd)
service redisd start
ss -tanl(看端口判断是否有启动)

redis-cli --help(通过redis-cli练上去)
-h 连上哪台机器
-p 一台机子上有多个redis服务,多个端口对应多个服务,新浪至少开四个
-n database number 多个数据库,默认16个库(在/etc/redis/6379.conf中 database 16),每个库相互隔离
vim /etc/redis/6379.conf
redis-cli(链接)
redis-cli -n 0
set mykey 123(写了一个键,建:mykey 值:123)
get mykey

select 15(0-15,切换到第16个数据库)

如果在这个数据库中get mykey 会返回 nil(数据库与数据库之间是隔离的)

三、命令

1、字符串数据类型String(指值)

set msg “goodbye” nx(nx是不存在的时候才往里写,如果存在了就不写,就不会覆盖原来的值)
set msg “goodbye” xx(键不存在的时候不能设置)
set key value [ex seconds] [px milliseconds]
例:set temp “temp” ex 10 (表示10秒之后自动删除。px是毫秒,设置过期时间)缓存
mset key value [key ….value] 表示可以获得多个值
mset a 1 b 2 c 3
mget a b c

msetnx key value [key…value] 如果至少有一个是存在的,则不执行任何设置操作,具有原子性
key * 可以看所有的键
getset key new-value 将字符串的键的值设置为new-value ,并返回字符串键所设新值之前的值
append key value :将值value插入到字符串键key已存储内容的末尾:set myphone “nokia” append myphone “1000” get myphone —-nokia1000
strlen key :所对应的值的长度
字符串索引和范围操作
字符串索引从0开始,从末尾开始从-1开始

setrange key index value ,值从index值开始替换
getrange KEY ;例如:getrange msg -1 -5

2、数字的操作

redis 可以存储数字,redis有一些命令可以专门处理这些数字的值,只要存储在字符串键里面的值可以被解释为64位整数,那就可以用命令
去对数字进行操作
条件:(1)是数字(2)64位以内 (3)不支持科学计数

减少或增加整数数字的值:INCRBY增加值,DECRBY减少值,若key原先不存在,则会先生成一个key为键,value为0的键值对,再进行增减操作
INCRBY num 100
DECRBY num 19
增1减1这种操作很普遍,所以用 INCR表示增1,DECR表示减1: INCR NUM ,DECR num(例如微博点赞数)
减少或增加浮点数数字的值:INCRBYFLOAT NUM 3.14,但是没有减的版本,所以传入负数达到效果:INCRBYFLOAT NUM -3.14

注意事项:即使存储的值是数字,他也可以执行APPEND,STRLEN,SETRANGE和GETRANGE,当用户针对数字执行这些命令时会将数值转化为字符串,然后
再执行命令

3、键的命名:

因为Redis的数据库不能出现两个同名的键,所以我们通常使用file1::file2::file3 这样的格式来区分同一类型的多个字符串键
例如:fang::email fang::hphonenumber userA::10086::info
news::sport::cache 这个就有可能是体育新闻分类的一个缓存

要看命令的操作要看:help @string ,help @sadd 等
redis key值是二进制安全的,这意味着可以用任何一个二进制序列作为key值,从字符串,到PJPEG文件内容都可以,空字符串也是有效key值
key取值原则:
(1)不要太长,消耗内存,查找成本高
(2)不宜过短,可读性较差
不要太多键,会带很多附属空间,所以能存更少的数据value,这也是它比memcache更好的原因,它可以存列表,散列等

字符串是最基本的Redis值类型,Redis字符串是二进制安全的,这意味着Redis字符串能包含任意类型的数据,例如:一张JPEG格式的图片或者序列化的
Ruby对象
一个字符串类型的值最多能存储512M字节的内容

Redis有库的概念,没有表的概念
图形界面客户端:Redis Desktop Manager–connnection(name host port等test connection)
通过pip install redis 就可以安装最新的redist

在pyDEV中
测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 import redis
r=redis.Redis(host="192.168.80.21",port=6379,db=0)
r.set("testbin",0b01100010)//0b表示二进制
print r.get("testbin")
rset("tb",0x62)//0x表示16进制
print r.get("tb")
//这里都是等价的
r.set(0b0011,0b01100011)
print r.get(0b0011)
print r.get(3)
print r.get('3')

print bin(int(r.get(3)))//bin函数表示转化成二进制
print bin(int(r.get('3')))

print
pritn r.key("*")

结果:

1
2
3
4
5
6
7
98
98
99
99
0b1100011
0b1100011
['testbin','tb','msg','b']

flushdb(删除所有键值,清空了)

多走路,多思考,越努力,越幸运!
———————————————YoungerFary

微信打赏

赞赏是不耍流氓的鼓励