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-cliRedis服务端:
/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个访问用户、最新消息排行榜 - 利用
PUSHPOP当成队列,进行多任务处理 - 利用
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]返回所有给定集合的并集(key1Ukey2) -
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命令在线操作地址
如果这篇文章对你有帮助,请点个赞哈,感谢