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数据类型
字符串
字符串是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 的值设为 value -
HMSET 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 中指定字段加上增量 increment -
HSCAN 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命令在线操作地址
如果这篇文章对你有帮助,请点个赞哈,感谢











网友评论