文章目录
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、借助setnx 实现分布式锁
setnx key value,当key不存在时将值设为value,返回1;若给定的key已经存在,则setnx不做任何操作,返回0
## 返回1 说明获取锁成功
127.0.0.1:6380> setnx orderId:1001 true
(integer) 1
## 返回0 说明获取锁成功
127.0.0.1:6380> setnx orderId:1001 true
(integer) 0
若想释放锁,只需del key
。锁只有被释放了,才会被其他线程获取锁
127.0.0.1:6380> setnx orderId:1001 true
(integer) 1
127.0.0.1:6380> del orderId:1001
(integer) 1
127.0.0.1:6380> setnx orderId:1001 true
(integer) 1
也可以为锁设置超时时间,避免出现锁释放不了的情况
set key value [expiration EX seconds|PX milliseconds] [NX|XX]
下面的例子是给锁增加一个20s的超时时间
127.0.0.1:6380> set orderId:1001 true ex 20 nx
OK
127.0.0.1:6380> setnx orderId:1001 true
(integer) 0
127.0.0.1:6380> setnx orderId:1001 true
(integer) 0
127.0.0.1:6380> setnx orderId:1001 true
(integer) 0
127.0.0.1:6380> setnx orderId:1001 true
(integer) 1
发现在超时时间内,其他线程不能再获取锁。
2、计数器
利用INCR实现文章阅读数的增加
## 文章阅读数加1
127.0.0.1:6380> incr article:1001
(integer) 1
## 文章阅读数加1
127.0.0.1:6380> incr article:1001
(integer) 2
## 查看文章阅读数
127.0.0.1:6380> get article:1001
"2"
3、分布式全局ID
如果是单机系统,生成ID可以直接利用数据库自增ID来实现,但是涉及到分布式系统的话,数据会涉及到分库分表,所以仅仅利用数据库自增是无法解决问题的。
因此,可借助于Redis的incr
命令实现全局ID,例如
incr orderId
每执行一次,orderId便加1。
list
由于List是有序的,因此可以用来做基于时间的消息流,如微博消息,朋友圈消息等
基于时间的消息
以微博为例,如果我关注的微博账号发了一篇文章
lpush {weiBoId}:{userId} {content}
其中content代表文章内容,weiBoId代表我关注的微博账号,userId代表用户我
127.0.0.1:6380> LPUSH 1001:10001 "content 1"
(integer) 1
127.0.0.1:6380> LPUSH 1001:10001 "content 2"
(integer) 2
127.0.0.1:6380> LPUSH 1001:10001 "content 3"
(integer) 3
127.0.0.1:6380> LRANGE 1001:10001 0 3
1) "content 3"
2) "content 2"
3) "content 1"
使用lpush,我们知道最新的内容在最左边。因此可以实现最新的消息展示在最上面。
hash
可以借助hash实现电商的购物车相关功能,假设cart:1001 表示用户1001的购物车
将商品1添加到购物车
## 给用户1001添加一个商品product1
HSET cart:100 product1 1
## 给用户1001添加一个商品product2
HSET cart:100 product2 1
增加1个购物车中商品1的数量(对应于上图中+、-按钮功能)
HINCRBY cart:100 product1 1
若要减少1个商品1的数量 HINCRBY cart:100 product1 -1
查看用户购物车的商品种类总数(对应上面图片汇总购物车的脚标)
HLEN cart:100
若需要将商品从购物车删除
## 将商品2从购物车删除
HDEL cart:100 product2
获取用户购买的所有商品和数量(对应全选按钮)
HGETALL cart:100
set
set是无序集合
1、朋友圈、微博的点赞和与之类似的喜欢、关注等功能
假设以朋友圈点赞为例,key是moments:{userId}:{msgId},value 是朋友的id,其中msgId代表哪条朋友圈消息,userId代表谁发的朋友圈
假设朋友1002、1003、1004、1005为用户1001的文章1点赞了
SADD moments:1001:1 1002
SADD moments:1001:1 1003
SADD moments:1001:1 1004
SADD moments:1001:1 1005
后来,用户1003又取消了点赞
SREM moments:1001:1 1003
查看这条朋友圈的点赞总数
SCARD moments:1001:1
查看这条朋友圈的点赞用户列表
127.0.0.1:6380> SMEMBERS moments:1001:1
1) "1002"
2) "1004"
3) "1005"
查看用户1006是否点赞了这个朋友圈消息
## 返回0 说明没点赞过
127.0.0.1:6380> SISMEMBER moments:1001:1 1006
(integer) 0
2、基于无序性实现抽奖功能
假设key=lottery:{activityId},其中activityId 指代哪个活动,这里假设activityId=1
添加参与者到这个活动中
## 将用户1001 1002 1003 1004 1005 1006 添加进活动
SADD lottery:1 1001 1002 1003 1004 1005 1006
查看参与活动的人
127.0.0.1:6380> SMEMBERS lottery:1
1) "1001"
2) "1002"
3) "1003"
4) "1004"
5) "1005"
6) "1006"
开始抽象,随机抽不重复的2个人
127.0.0.1:6380> SPOP lottery:1 2
1) "1005"
2) "1003"
SRANDMEMBER key count 任意选出count个用户id,不会剔除用户
3、实现基于社交软件的关注模型
假如有三个用户,分别是剑圣、亚索、剑魔,他们各自的关注列表如下
剑圣set ==>{亚索、剑姬、诺克、瑞兹}
亚索set==>{剑魔、诺克、提莫、安妮}
剑魔set==>{剑姬、EZ}
若想查看剑圣与亚索共同关注的好友
SINTER 剑圣set 亚索set ==>诺克,是他们的共同好友
若剑圣访问了亚索的主页,查看我关注的人也关注了他,那要怎么实现呢?
实际上是查看剑圣(我)关注的人也关注了亚索(他)
SISMEMBER 亚索set 亚索
SISMEMBER 剑姬set 亚索
SISMEMBER 诺克set 亚索
SISMEMBER 瑞兹set 亚索
若剑圣访问了亚索的主页,查看了**我可能认识的人
**,那要怎么实现呢?
实际上是把亚索关注的而剑圣(我)没关注的人列出来
SDIFF 亚索set 剑圣set==>剑魔、提莫、安妮
4、电商商品筛选
假设以内存、屏幕大小、品牌作为筛选条件
## 内存64G的集合
SADD rom:64 iphon11 iphone12 iphoneXS
## 品牌是iphone的集合
SADD brand:iphone iphone8 iphone11 iphoneXS
## 屏幕大小是6.7寸的集合
SADD screen:6.7 iphon11Max iphoneXS
需求:筛选6.7寸,内存是64G的苹果手机
SINTER rom:64 brand:iphone screen:6.7
==>iphoneXS
zset
可以借助其score属性实现热搜榜或排行榜功能
热搜榜
假设每个新闻点击阅读了一次,热度加1
初始化两条新闻
ZADD hotnew 0 new1
ZADD hotnew 0 new2
阅读一次,热度加1
ZINCRBY hotnew 1 new1
ZINCRBY hotnew 1 new1
ZINCRBY hotnew 1 new1
ZINCRBY hotnew 1 new2
展示当前热搜的前10名
127.0.0.1:6380> ZREVRANGE hotnew 0 10 withscores
1) "new1"
2) "3"
3) "new2"
4) "1"
如果想做一个7日热搜排名呢?
假设7日中每日热搜新闻key为hotnew-{day},例如第一日hotnew-1,第七日hotnew-7
首先需要合并这七日热搜到集合hotnew1-3中
SUNIONSTORE hotnew1-7 7 hotnew-1 hotnew-2 hotnew-3 hotnew-4 hotnew-5 hotnew-6 hotnew-7
然后展示七日新闻热搜前10名
ZREVRANGE hotnew1-7 0 10 withscores