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数据类型字符串
字符串是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个访问用户、最新消息排行榜 - 利用
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命令在线操作地址
如果这篇文章对你有帮助,请点个赞哈,感谢
网友评论