Redis数据结构常见使用场景

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值