Redis基本使用
前言:
Redis有五种的数据结构分别是:(字符串)string、(哈希)hash、(列表)list、(集合)set、(有序集合)zset
一:Sting结构
字符串常用操作:
- 存入字符串键值对:set key value
- 批量存储字符串键值对:mset key value [key1 value1 …]
- 存入一个不存在的字符串键值对:setnx key value
- 获取一个字符串键值:get key
- 批量获取字符串键值:mget key [key1…]
- 删除一个键:del key [key1…]
- 设置一个键的过期时间(秒):expipe key seconds
原子加减:
- 将key中存储的数字值加1:incr key
- 将key中存储的数字值减1:decr key
- 将key中所存储的值加上increment:incrby key increment
- 将key中所存储的值减去increment:decrby key increment
操作实例:
- 单值缓存
- 对象缓存
set name:2 value(json格式数据)
mset user:1:username 相当于关系数据库中 操作 user 表的id为1的username字段值赋值为 zhugeling;把user表id为1的age字段赋值为2000
应用场景:
微信文章阅读量,每次打开文章,阅读量都会+1
计数器:
incr key
二:Hash结构
Hash常用操作:
- 存储一个哈希表key的键值:hset key field value
- 存储一个不存在的哈希表key的键值:hsetnx key field value
- 在一个哈希表key中存储多个键值对:hmset key field value [field1 value1 …]
- 获取哈希表key对应的field键值:hget key field
- 批量获取哈希表key中多个field键值对:hmget key field [field1 …]
- 删除哈希表key中field键值:hdel key field [field1 …]
- 返回哈希表key中field的数量:hlen key
- 返回哈希表key中所有键值:hgetall key
- 为哈希表key中field键的值增加increment:hincrby key field increment
操作实例:
- 存储结构为:
应用场景:
电商购物车:以用户id为key,商品id为field,商品数量为value
购物车操作:
- 添加商品:hset user:1001:cart 82001 1
- 增加商品数量:hincrby user:1001:cart 82001 1
- 商品总数:hlen user:1001:cart
- 删除商品:hlen user:1001:cart 82001
- 获取购物车所有商品:hgetall user:1001:cart
优点:
- 同类数据归类整合存储,方便数据管理
- 相比string操作消耗内存与cpu更小
- 相比string存储更节省空间
缺点:
- 过期功能不能使用在field上,只能使用在key上
- Redis 集群架构下不适合大规模使用
三:List结构
List常用操作:
- 将一个或者多个值value插入到key列表的表头(最左边):lpush key value [value1 …]
- 将一个或者多个值value插入到key列表的表尾(最右边):rpush key value [value1 …]
- 移除并返回key列表的头元素:lpop key
- 移除并返回key列表的尾元素:rpop key
- 返回列表key中指定区间内的元素,区间以偏移量start和stop指定:lrange key start stop
- 从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待:blpop key [key …] timeout
- 从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待:blpop key [key …] timeout
Stack(栈) = lpush + lpop -> FILO
Queue(队列) = lpush + rpop
Blocking MQ(阻塞队列) = lpush + brpop
应用场景:
微博消息、微信公众号消息
13. 微信公众号发送消息,消息id为:32001
lpush msg:{人员id} 32001
14. 查看最新消息:lrange msg{人员id} 0 5
四:Set 结构
Set常用操作:
- 往集合key中存入元素,元素存在则忽略,若key不存在则新建:sadd key member [member …]
- 从集合key中删除元素:srem key member [member …]
- 获取集合key中所有元素:smembers key
- 获取集合key的元素个数:scard key
- 判断member元素是否存在于集合key中:sismember key member
- 从集合key中随机选出count个元素,元素不从key中删除:srandmember key [count]
- 从集合key中随机选出count个元素,元素从key中删除:spop key count
Set 运算操作
- 交集运算:sinter key [key …]
- 将交集结果存入新集合destination中:sinterstore destination key [key …]
- 并集运算:sunion key [key …]
- 将并集结果存入新集合destination中:sunionstore destination key [key …]
- 差集运算:sdiff key [key …]
- 将差集结果存入新集合destination中:sdiffstore destination key [key …]
应用场景:
微信抽奖小程序:
- 点击参与抽奖加入集合:sadd key {userId}
- 查看参与抽奖的所有用户:smembers key
- 抽取count名中奖者:srandmember key [count] / spop key [count]
微信微博点赞收藏标签:
- 点赞:sadd like:{消息id} {用户id}
- 取消点赞:srem like:{消息id} {用户id}
- 检查用户是否点过赞:sismember like:{消息id} {用户id}
- 获取点赞的用户列表:smembers like:{消息id}
- 获取点赞用户数:scard like:{消息id}
集合操作:
- sinter set1 set2 set3 -> {c}
- sunion set1 set2 set3 -> {a,b,c,d}
- sdiff set1 set2 set3 -> {a}
集合操作实现微博微信关注模型: - 张飞关注的人:zhangfeiSet -> {liubei,guanyu,zhaoyun,sunce}
- 关羽关注的人:gaunyuSet -> {zhangfei,liubei,zhaoyun,sunce,caocao}
- 刘备关注的人:liubeiSet-> {zhangfei,guanyu,zhaoyu,sunce}
- 张飞和关羽共同关注的人:sinter zhangfeiSet guanyuSet -->{liubei,zhaoyun,sunce}
- 刘备关注的人也关注了孙策:
sismember guanyuSet sunce
sismember zhangfeiSet sunce
五:ZSet有序集合结构
ZSet常用操作:
- 忘有效集合key中加入带分值元素:zadd key score member [[score member] …]
- 从有序集合key中删除元素:zrem key member [member …]
- 返回有序集合key中元素member的分值:zscore key member
- 为返回有序集合key中元素member的分值加上increment:zincrby key increment member
- 返回有序集合key中的元素:zcard key
- 正序获取有序集合key从start下标到stop下标的元素:zrange key start stop [withscores]
- 倒叙获取有序集合key从start下标到stop下标的元素:zrevrange key start stop [withscores]
ZSet 集合操作:
- 并集计算:zunionstore destkey numkeys key[key1 …]
- 交集计算:zinterstore destkey numbers key[key1 …]
应用场景:
Zset集合操作实现排行榜:
- 点击新闻:zincrby hotNews:20200913 1 守护香港
- 展示当日排行前十:zrevrange hotNews:20200913 0 10 withscores
- 七日搜索榜单计算:zunionstore hotNews:20200907-20200913 7
hotNews:20200907 hotNews:20200908 hotNews:20200909 …hotNews:20200913 - 展示七日排行前十:zrevrange hotNews:20200907-20200913 0 10 withscores