Redis简介
Redis是一款开源免费、高性能的非关系型数据库
非关系型数据库(Not Only SQL): 简称是NoSQL,一般我们习惯解释成非关系型数据库,其实应该理解成不止是关系型数据库,或者超关系型数据库。一般用来存储不规范、复杂的数据形式。相比关系型数据库,非关系型数据库性能更好,扩展性更强,但是对于财务,金融,银行等规模巨大,流程规范,数据格式统一的行业来讲,使用关系数据库更佳。
Redis特点
- 数据类型丰富
- 支持
master-slave
模式的数据备份 - 支持数据持久化,可将内存中的数据保存在磁盘
- 性能极高
- 所有操作都是原子性操作
原子性操作: A账户有3000块钱,B账户有2000块钱,现在从A账户向B账户转1000块钱,要做如下两个操作: 1. 从A账户中减去1000块钱,那么A账户现在有2000块钱;2. B账户加上1000块钱, 那么B账户现在有3000块钱。如果在A账户减去1000块钱的时候,忽然发生了意外,比如停电、断网之类的,导致转账这个操作中止了,此时A账户的钱已经减去了,但是B账户没有增加1000块钱,那么我们就称这个操作失败了,要进行回滚。回滚就是回到没转账之前的状态,此时A账户照常有3000块,B账户有2000块。
这种要么一起成功(A账户减少1000块,B账户增加1000块),要么一起失败(A、B账户都回到原来状态,A有3000块钱,B有2000块钱)的操作就叫原子性操作。
Redis安装
-
下载Redis源码
-
解压
tar xzvf redis-3.2.1.tar.gz
-
编译安装
cd redis-3.2.1
make && make install
ps:遇上 `Hint: It's a good idea to run 'make test';` ,我们可以先安装tcl工具 `yum install tcl` ,然后执行 `make test` 进行检测。得到 `\o/ All tests passed without errors!` 的提示,就说明安装成功。
-
默认安装的路径
Redis客户端:
/usr/local/bin/redis-cli
Redis服务端:
/usr/local/bin/redis-server
-
启动Redis
启动Redis服务:[root@CentOS6 /]# redis-server
Redis配置密码
-
不重启Redis,设置密码
127.0.0.1:6379> config set requirepass 123456 OK 127.0.0.1:6379> 127.0.0.1:6379> config get requirepass (error) NOAUTH Authentication required.
-
修改配置文件,设置密码
在
redis.conf
配置文件中修改密码,#requirepass foobared
, 去掉前面的注释,并设置自己的密码,保存配置文件并重启ps:重启的时候一定需要指定修改后的配置文件,否则密码设置不起效
Redis数据类型
字符串
字符串是Redis最基本的数据类型,一个key对应一个value,一个key最大能存储512MB。
常用字符串命令
-
SET key value
设置指定 key 的值 -
SETX key timeout value
设置指定 key 的值及过期时间 -
GET key
获取指定 key 的值 -
GETRANGE key start end
截取key中的字符串 -
GETSET key value
重置key的值,并返回key的旧值(key没有旧值时,返回nil) -
SETBIT key offset value
设置key所存储的字符串,offset位上的值(offset上的值为0或1) -
GETBIT key offset
获取key所存储的字符串,offset位上的值 -
STRLEN key
返回 key 所存储的字符串的长度 -
INCRBY key increment
将 key 所存储的值加上特定的增量 increment -
DECRBY key decrement
将 key 所存储的值减去特定的减量值 decrement -
APPEND key value
如果 key 已经存在,并且是一个字符串,APPEND命令将 value 追加到原value的末尾
特点
- 自增、自减
- 位运算
常用应用场景
- 利用
setbit、getbit、bitcount
统计用户签到、活跃用户(注意:bitcount的start、end参数指的是字符串的位置,不是对应位的位置) - 利用
INCR
做原子计数器,生成唯一序列号 - 设置 key 有效期,上操作锁或者防止短时间内频繁发送短信验证
哈希
一个哈希数据,里面包含了N对键值对
常用哈希命令
HSET key field value
将哈希表 key 中的字段 field 的值设为 valueHMSET key field1 value1 field2 value2
将多个 field-value(域-值)对设置到哈希表 key 中HSETNX key field value
当字段 field 不存在时,设置哈希表字段值HLEN key
获取哈希表中字段的数量HKEYS key
获取哈希表中所有的字段HGET key field
获取存储在哈希表中指定字段的值HMGET key field1 field2
获取所有给定字段的值HGETALL key
获取哈希表 key 中,所有的字段和值HVALS key
获取哈希表中所有的值HEXISTS key field
查看哈希表 key 中,指定的字段是否存在HINCRBY key field increment
为哈希表 key 中指定字段加上增量 incrementHSCAN key cursor [MATCH pattern] [COUNT count]
分批次遍历哈希表 key 中的键值对,cursor为0时表示开始一次新的遍历,每次遍历返回来的cursor,作为下次遍历的cursor,直至遍历返回的cursor为0时,代表刚好结束一次完整的key遍历(cursor类似接力棒,从0到0代表一次完整的遍历。HSCAN
命令并且有match
匹配功能HDEL key field1 field2
删除一个或多个字段
特点
- 数据结构有明显的层级关系
常用应用场景
- 存储有层级关系,并且部分数据需要变更的,如用户信息
列表
一个列表,包含了N个字符串
-
LPUSH key string1
往列表左侧插入一个或多个值 -
RPUSH key string1
往列表右侧插入一个或多个值 -
LINSERT key BEFORE/AFTER oldString newString
在列表指定元素前(后)插入一个值(元素不存在或列表不存在,则不执行任何操作) -
LSET key index string
通过索引设置列表元素的值 -
LINDEX key sindex
通过索引获取列表中的元素 -
LLEN key
获取列表的长度 -
LRANGE key start stop
获取列表指定范围内的元素 -
LPOP key
移出列表中的第一个元素,并返回移出的元素 -
RPOP key
移出列表中的最后一个元素,并返回移出的元素 -
BLPOP key time
移出列表中的第一个元素,并返回移出的元素,如果列表为空,则在time
秒之后弹出nil
-
BRPOP key time
移出列表中的最后一个元素,并返回移出的元素,如果列表为空,则在time
秒之后弹出nil
-
BRPOPLPUSH key1 key2 time
将key1
最右侧的元素弹出到key2
的最左侧,如果key1
没有元素,则等待time
秒后,弹出nil
-
LREM key count string
移除列表中与string
相等的元素,共移除count
个,如果count
大于0,则从表头向表尾搜索,如果count
小于0,则从表尾向表头搜索 -
LTRIM key start stop
只保留start
到stop
区间的元素,其余元素均移除
特点
- 有序,自由实现堆、栈的功能
- 轮询监控
- 索引取区间
常用应用场景
- 利用
LTRIM key start stop
获取网站最后5个访问用户、最新消息排行榜 - 利用
PUSH
POP
当成队列,进行多任务处理 - 利用
BRPOPLPUSH key1 key1 time
,使用相同的key作为BRPOPLPUSH的两个参数,无限循环整个列表,比如:一个服务器监控程序,并行检查一组网站,确保网站的可访问性 - 利用
BRPOP key time
进行事件提醒,在新元素到达时立即处理,新元素未到达一直阻塞住,避免轮询占用资源
集合(Set)
一个集合(key),包含了N个集合成员(value)。集合成员是无序的,且是唯一的,一个集合最多可以有2^32 - 1个成员
-
SADD key value1 value2
向集合添加一个或多个成员 -
SMEMBERS key
获取一个集合中所有的成员 -
SCARD key
获取集合的成员数 -
SISMEMBER key member
判断member
是否是集合key
的成员 -
SPOP key
移除并返回集合中的一个随机元素 -
SRANDMEMBER key [count]
返回集合中一个或多个随机元素 -
SREM key member1 [member2]
移除集合中一个或多个成员 -
SDIFF key1 key2
返回key1
相对于key2
的差集(key1
有,key2
没有) -
SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中(key1
有,key2
没有) -
SINTER key1 [key2]
返回给定所有集合的交集 -
SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中 -
SUNION key1 [key2]
返回所有给定集合的并集(key1
Ukey2
) -
SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中 -
SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合 -
SSCAN key cursor [MATCH pattern] [COUNT count]
分批次遍历集合 key 中的键值对,cursor为0时表示开始一次新的遍历,每次遍历返回来的cursor,作为下次遍历的cursor,直至遍历返回的cursor为0时,代表刚好结束一次完整的key遍历(cursor类似接力棒,从0到0代表一次完整的遍历。SSCAN
命令并且有match
匹配功能
特点
- 唯一性
- 差集、并集
常用应用场景
- 利用交并集操作,可以查找共同好友、好友推荐
- 利用差集操作,可以求出新增用户(例: 利用Redis集合(Set)统计新增用户和次日留存率)
- 利用唯一性,可以统计网站UV
有序集合(sorted set)
和集合相似(一个key
,N个value
,value
唯一),不同点是每个元素都会关联一个double类型的分数,Redis通过分数为集合成员进行排序
-
ZADD key score1 value1 [score2 value2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数 -
ZCARD key
获取有序集合的成员数 -
ZCOUNT key min max
计算在指定区间内的成员数 -
ZINCRBY key increment value
对指定成员加上增量increment -
ZINTERSTORE newKey numbers key1 key2
将key1``key2
的交集存入newKey
中,newKey
中元素的分数是key1
和key2
中分数之和(使用时一定要指定正确的 Key Number) -
ZLEXCOUNT key min max
当元素的分数都相等时,此命令返回指定字符区间之内的元素(如:ZLEXCOUNT z1 [a [c
在z1
有序集合所有元素分数相同的情况下,返回z1
中a~c之间的元素) -
ZRANGE key start stop
返回指定索引区间的元素(下标参数start``stop
都以0为底) -
ZRANGEBYLEX key min max
返回指定字典区间内的元素(例:ZRANGEBYLEX Z1 [a [b
返回集合Z1
中a
到b
之间的元素) -
ZRANGEBUSCORE key min max
返回指定分数之间的元素 -
ZRANK key value
返回有序集合中指定元素的索引 -
ZREM key value
移除有序集合中的指定成员 -
ZREMRANGEBYLEX key min max
删除指定字典区间的元素 -
ZREMRANGEBYRANK key start stop
删除指定索引区间内的元素 -
ZREMRANGEBYSCORE key min max
删除指定分数区间的所有元素 -
ZREVRANGE key start stop
返回指定索引区间内的成员,分数从高到低 -
ZREVRANGEBYSCORE key max min
返回指定分数区间的成员,分数从高到低 -
ZREVRANK key member
返回有序集合中指定元素的排名(排名由分数值从大到小排列,分数最大的元素排名为0) -
ZSCORE key value
返回指定元素的分数 -
ZUNIONSTORE newKey numkeys key [key ...]
计算给定的有序集合的并集,并存储在newKey
中 -
ZSCAN key cursor [MATCH pattern] [COUNT count]
分批次遍历有序集合 key 中的键值对,cursor为0时表示开始一次新的遍历,每次遍历返回来的cursor,作为下次遍历的cursor,直至遍历返回的cursor为0时,代表刚好结束一次完整的key遍历(cursor类似接力棒,从0到0代表一次完整的遍历。ZSCAN
命令并且有match
匹配功能
特点
- 可以按照索引、字典区间、分数区间3个不同的维度取数据、删数据
- 可以自定义数据的顺序
- 可求并集、交集
应用场景
- 带权重的队列(List只是按照时间排序的队列,有序集合可以实现自定义权重的队列)
- 列出游戏中前100名高分的选手
- 利用区间取值和排序的功能,可以用做分页
附上一个Redis命令在线操作的地址 Redis命令在线操作地址
如果这篇文章对你有帮助,请点个赞哈,感谢