Redis数据结构应用
1. String
-
字符串常用操作
SET key value //存入字符串键值对 MSET key value [key value ...] //批量存储字符串键值对 SETNX key value //存入一个不存在的字符串键值对 GET key //获取一个字符串键值 MGET key [key ...] //批量获取字符串键值 DEL key [key ...] //删除一个键 EXPIRE key seconds //设置一个键的过期时间(秒)
-
原子加减
INCR key //将key中储存的数字值加1 DECR key //将key中储存的数字值减1 INCRBY key increment //将key所储存的值加上increment DECRBY key decrement //将key所储存的值减去decrement
1.1 单值缓存
-
SET key value GET key value
1.2 对象缓存
-
SET user:1 value(json格式)
1.3 分布式锁
-
SETNX product:10001 true //返回1代表获取锁成功 SETNX product:10001 true //放回0代表获取锁失败 。。。执行业务操作 DEL product:10001 //执行完业务释放锁
-
SETNX product:10001 true ex 10 nx //防止程序意外终止导致死锁
1.4 计数器
-
INCR article:readcount:{文章id} GET article:readcount:{文章id}
1.5 分布式系统全局序列号
-
INCRBY orderId 100 //redis批量生成序列号id提升性能
2.Hash
-
Hash常用操作
HSET key field value //储存一个哈希表key的键值 HSETNX key field value //存储一个不存在的哈希表key的键值 HMSET key field value [key value ...] //在一个哈希表中存储多个键值对 HGET key value //获取哈希表key对应的field键值 HMGET key field [field ...] //批量获取哈希表key对应的field键值 HDEL key field [field ...] //删除哈希表key中的field键值 HLEN key //返回哈希表key中的field的数量 HGETALL key //返回哈希表key中所有的键值
HINCRBY key field increment //为哈希表key中field键的值加上增量increment
2.1 对象缓存
-
HMSET user {userId}:name zhuge {userId}:balance 1888 HMSET user 1:name zhuge 1:balance 1888 HMSET user 1:name 1:balance
2.2 电商购物城
- 以id为key
- 商品id为field
- 商品数量为value
-
购物车操作
1) 添加商品->hset cart:1001 10088 1 2) 增加数量->hincrby cart:1001 1008 1 3) 商品总数->hlen cart:1001 4) 删除商品->hdel cart:1001 10088 5) 获取购物车所有商品->hgetall cart:1001
3. List
-
List常用操作
LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边) RPUSH key value [value ...] //将一个或多个值value插入到key列表否尾部(最右边) LPOP key //移除并返回key列表的头元素 RPOP key //移除并返回key列表的尾元素 LRANGE key start stop //返回列表key中指定区间的元素,区间以偏移量start和stop指定
BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0则一直阻塞 BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0则一直阻塞
3.1 常用分布式数据结构
- Stack(栈) = LPUSH + LPOP =FILO
- Queue(队列) = LPUSH + RPOP
- Blocking MQ(阻塞队列) = LPUSH + BRPOP
3.2 微博消息和微信公众号消息
诸葛关注了Caoz,备胎说车等大V
1)Caoz发微博,消息ID为10018
LPUSH msg:{诸葛-ID} 10018
2)备胎说车发微博,消息ID为10086
LPUSH msg:{诸葛-ID} 10086
3)查看最新微博消息
LRANGE msg:{诸葛-ID} 0 4ß
4.Set
-
Set常用操作
SADD key member [member ...] //往集合key中存入元素,元素存在则忽略,若key不存在则新建 SREM key member [member ...] //从集合key中删除元素 SMEMBERS key //获取集合key中所有元素 SCARD key //获取集合key的元素个数 SISMEMER key member //判断member元素是否存在于集合key中 SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除 SPOP key [count] //从集合key中选出count个元素,元素从key中删除
-
Set运算操作
SINTER key [key ...] //交集运算 SINTERSTORE destination key [key ...] //将交集结果存入新集合destination中 SUNION key [key ...] //并集运算 SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中 SDIFF key [key ...] //差集运算 SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
4.1 微信抽奖小程序
1)点击参与抽奖加入集合
SADD key {userID}
2)查看参与抽奖所有用户
SMEMBERS key
3)抽取count名中奖者
SRANDMEMBER key [count] / SPOP key [count]
4.2 微信微博点赞,收藏,标签
1)点赞
SADD like:{消息ID} {用户ID}
2)取消点赞
SREM like:{消息ID} {用户ID}
3)检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID}
4)获取点赞的用户列表
SMEMBERS like:{消息ID}
5)获取点赞用户数
SCARD like:{消息ID}
4.3 集合操作实现微博微信关注模型
1)诸葛关注的人
zhugeSet -> {zhuangzhou, xushu}
2)楼兰关注的人
loulanSet -> {zhuge, baiqi, zhuangzhou, xushu}
3)庄周关注的人
zhuangzhouSet -> {zhuge, loulan, baiai, xushu, xunyu}
4)诸葛和楼兰共同关注
SINTER zhugeSet loulanSet -> {zhuangzhou, xushu}
5)诸葛关注的人也关注他(楼兰)
SISMEMBER zhuangzhouSet loulan
SISMEMBER xushuSet loulan
6)诸葛可能认识的人
SDIFF loulanSet zhugeSet -> {zhuge, baiqi}
5.ZSet
-
ZSet常用操作
ZADD key score member [[score member]...] //往有序集合key中加入带分值元素 ZREM key member [member ...] //从有序集合key中删除元素 ZSCORE key member //返回有序集合key中元素member的分值 ZINCRBY key increment member //为有序集合key中元素member的分值加上increment ZCARD key //返回有序集合key中元素个数 ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素 ZRAVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
-
ZSet集合操作
ZUNIONSTORE destkey numkeys key [key ...] //并集计算 ZINTERSTORE destkey numkeys key [key ...] //交集运算
5.1 ZSet集合操作实现排行榜
1)点击新闻
ZINCRBY hotNews:20200819 1 总经理记者会
2)展示当日排行前十
ZREVRANGE hotNews:20200819 0 9 WITHSCORES
3)七日搜索榜计算
ZUNIONSTORE hotNews:20200813-20200819 7 hotNews:20200813 hotNews:20200814 ... hotNews:20200819
4)展示七日排行前十
ZREVRANGE hotNews:20200813-20200819 0 9 WITHSCORES