Redis核心数据结构应用场景

字符串string 哈希hash 列表list 集合set 有序集合zset

1.String

常用操作

 set key value //储存字符串键值对
 mset key value[key value...]  //批量储存字符串键值对
 setnx key value //存入一个不存在的字符串key
 get key value // 获取一个字符串键值对
 mget key [key...] //批量获取字符串键值
 del key [key...] 删除键
 incr key //将该key的值原子加1
 decr key //将该key的值原子减1
 incrby key increment//为key储存的值加上增量increment 如果不存在则初始化为0
 decrby key decrement //为key储存的值减去增量increment

应用场景

对象缓存
1)set user:1 value(json数据格式)
2)mset user:1:name abin user:1:age 185		//推荐使用第二种
	 mget user:1:name user:1:age

分布式锁
setnx product:100 true //插入一个键返回一表示成功返回0表示识别
del product:100 //删除该键
set product:100 true  ex  10  nx //为product:100 设置一个超时时间,配合业务代码手动释放,存在10秒业务未完成问题

计数器
incr articlere:readcount:{id} //记录某文章转发量,点赞量
分布式系统全局序列号
incrby id 100 //某服务记录id到100

2.Hash

常用操作

hset key field value //存储一个哈希表为key键值
hsetnx key field value //存储一个不存在的哈希表为key的键值
hmset key field value [field value...] //在一个哈希表key中存储多个键值
hget key field //  获取哈希表key中field的值
hmget key field [field...] // 获取哈希表key中多个field的值
hlen key //返回哈希表key中field的数量
hdel key field [field...] //删除哈希表key中的field键值
hgetall key //返回哈希表key中所有键值
hincrby key field increment //为哈希表key中field键存储的值加上增量increment

应用场景

对象缓存
hmset user {userId}:name abin {userId}:age 18
hmget user {userId}:name {userId}:age
hmset user 1:name abin 1:age 18
hmget user 1:name 1:age
购物车
1)以用户id为key
2)商品id为field
3)商品数量为value
操作
1)hset cart:100 10086 1 //添加商品
2)hincrby cart:100 10086 1 //增加10086商品的数量
3)hincrby  cart:100 10086 -1 //减少10086商品的数量
4)hgetall cart:100 //获取购物车所有商品
5)hlen cart:100  //获取商品总数
6)hdel cart:100 10086 //删除商品

hash数据结构
优点
1.同类数据归类整合存储,方便业务,方便数据管理
2.相比string操作内存与cpu的代价更小
3.相比string更节省空间
缺点
1.过期功能不能用在某个field上只能用在key上
2.在RedisCluster集群架构模式下不适合大规模使用,例如某个商品热点商品的信息都在某个槽位

3.List

常用操作

lpush key value [value...]  //将一个或多个值插入key列表的表头(左边)
rpush key value [value...] //将一个或多个值插入key列表的表尾(右边)
lpop key  //从表头(左边)移除并拿元素
rpop key //从表尾(右边)移除并拿元素
lrange key start stop //返回列表key中指定区间的元素,从左到右,start stop指定偏移量
blpop key [key...] timeout //从key表头左边弹出一个元素,如果没有则阻塞timeout秒 如果timeout=0则一直阻塞	
brpop key [key...] timeout//从key表头右边弹出一个元素,如果没有则阻塞timeout秒 如果timeout=0则一直阻塞

常用数据结构
Stack(栈) =LPUSH + LPOP 或RPUSH + RPOP
Queue(队列)= LPUSH + RPOP 或 RPUSH + LPOP
Blocking Queue(阻塞队列) = LPUSH + BRPOP 或 RPUSH + BLPOP
在这里插入图片描述
应用场景
微信公众号消息订阅和微博订阅同理

在这里插入图片描述
例如:
我关注了笔吧测评室
1.笔吧测评室发消息 消息ID为1010
发布则是 lpush msg:{xx-id} 1010
拿则是 lpop msg:{xx-id}
因为订阅号都是最新消息在上,估可以看做是一个栈结构
查看最新的消息直接从左侧拿
lrange msg:{xx-id} 0 1

4.set集合

常用操作

sadd key member [member...]   //  往一个key集合里面存入元素,若元素存在则忽略,key不存在则新建
smembers key // 获取当前key集合的所有元素
scard key  // 获取当前集合的个数
sismember key member  // 判断当前集合是否存在某元素
srem key member [member...] // 删除key集合的某些元素
spop key [count] // 从当前集合中随机选出count个元素,并从key集合中删除
srandmember key [count] // 从当前集合中随机选出count个元素,不删除

sinter key [key]... // 交集运算
sunion key [key...] // 并集运算
sdiff key [key...] // 差集运算
sinterstore destination key [key...] // 把交集运算的结果组成一个新的集合
sunionstore destination key [key...] // 把并集运算的结果组成一个新的集合
sdiffstore destination key [key...] // 把差集运算的结果组成一个新的集合

应用场景

抽奖程序

1.点击参与抽奖加入集合
sadd key {userId}
2.查看参与抽奖的所有用户
smembers key
3.抽取count名奖品
srandmember key [count] / 可重复获奖
spop key [count] / 不可重复获奖

点赞功能

1.点赞
sadd like:{消息ID} {用户ID}
2.取消点赞
srem like:{消息ID} {用户ID}
3.检查用户是否点过赞
sismember like:{消息ID} {用户ID}
4.获取点赞的用户列表
smembers like:{消息ID}
5.获取该消息点赞的用户数
scard like:{消息ID}

实现常见的账号关注功能

1.我关注的人
binset --> {user1,user2,user3}
2.user关注的人
userset–>{user4,user5,user1}
3.user1关注的人
user1set–>{user,bin,user3,user6,user7}
4.我跟user共同关注的人
sinter binset userset–> {user1}
5.我关注的人也关注他
sismember binset user1
sinter binset user1set -->{user3}
6.我可能认识的人
sunionstore newset binset userset --> newset{user1,user2,user3,user4,user5}
sdiff newset binset --> {user4,user5}

实现一个搜索功能
在这里插入图片描述
sadd brand:iPhone iphone14
sadd brand:huawei P50
sadd brand:oppo Reno8
sadd rom:512GB iphone14 P50
sadd ram:768MB P50 Reno8
sinter rom:512GB ram 768MB–>P50 //搜索rom为512GB ram为768MB的产品

5.zset有序集合

常用操作

zadd key score member[ [score member] ...] // 往有序集合key中添加带分值的元素
zrem key member [member...] // 从有序集合key中删除元素
zscore key member // 返回有序集合key中元素member的分值
zcard key  // 返回有序集合key中的元素个数
zincrby key increment member // 为有序集合key中元素member的分值加上increment 
ZRANGE key start stop [WITHSCORES]	//正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES]	//倒序获取有序集合key从start下标到stop下标的元素
ZUNIONSTORE destkey numkeys key [key ...] 	//并集计算
ZINTERSTORE destkey numkeys key [key …]	//交集计算

应用场景

1.微博热搜
在这里插入图片描述
1.zet集合实现排行榜

1.点击新闻
ZINCRBY  hotNews:20220923 1  端牢中国人的饭碗
2.展示当日排行前十
ZREVRANGE  hotNews:20220923 0  9  WITHSCORES 
3.七日搜索榜单计算
ZUNIONSTORE  hotNews:20220917-20220923 7 
hotNews:20220917 hotNews:20220918 ... hotNews:20220923  
4.展示七日排行前十
ZREVRANGE hotNews:20220917-20220923  0  9  WITHSCORES
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值