Redis实战场景设计
2021-05-12 本文已影响0人
若熙笔记
一、字符串
setnx
设置成功时返回1,设置失败返回0,只可以进行设置,不可以进行修改
可以实现分布式锁:
setnx key value
问题:
(1)死锁。
获取锁,超时了,引出了另一个命令 expire 设置锁的过期时间,后续执行完后,进行锁的释放,del。
但是,setnx 设置锁和expire设置锁的过期时间并不是一个原子性的操作,执行过程中可能出现异常情况,导致expire在设置锁的过期时间失败。从而无法保证无死锁的原子发生。
解决方式:使用 set命令 set stock ex 10 nx,保证了redis分布式锁的无死锁的原子性操作完成了。
(2)使用set ex nx 保证了redis分布式锁无死锁的原子性操作,一般也会存在如下问题。
情景:
A拿到了redis的锁,设置了10秒的过期时间,但是A的业务执行了20秒才完成。而B不断的尝试进行获取锁,到10秒的时候发现A原理获取的锁释放了,从而B也获得了锁,B也执行B的业务,等到20秒的时候,A的业务执行完成,执行了del删除锁的命令。
原因:业务的执行时间大于锁的时间,没有满足锁的互斥性。
解决方式:
(1)充分的预估业务的执行时间;
(2) 锁块到期了,业务没有执行完成,(可以开守护线程,将锁重新进行续时操作,确保锁的时间大于业务的执行时间),如果业务的确执行超时了,不能无限制的进行重试续时。保障重试次数。
(3)在删除锁的时候出现误删的情况,需要判断是不是自己的锁。
set命令
set key value [ex seconds][nx]
场景:网站618限流。IP访问网站50次,禁止访问了,明天可以访问。
incr 自增
expire 有效期定义到24点
incrby
ID生成器--集成环境下,ABC三台redis集群,A机器从1开始,B机器从2开始,C机器从3开始,每次增长长度为3
二、hash*
hset 设置单个,hmset设置多个
存储的是结构化的存储方案。
三、list
简单场景:简单的消息队列。。
左进右出,先进先出。
延时队列。。
四、集合
集合中不能存在重复值。集合中的值无序且唯一
场景1:年会抽奖。
sadd choujiang xrj wzs fjf
srandmember
smembers choujiang 集合元素
spop choujiang 1 集合中弹出1个元素
场景2:点赞、收藏、转发
sadd like:520 xrj fjf wzs #喜欢520这篇文章的人
srem like:520 xrj #某个用户取消点赞
smembers like:520 #查看谁点赞了
scard liek:520 #统计这篇文章一共多少人点赞
sismember like:520 xrj #查看某个元素是否在指定的集合中
场景3:set运算
sinter key #返回一共集合的全部成员,该集合是所有给定集合的交集
sunion key #并集
sdiff key #差集
五、zset有序集合
场景:有两个门店卖水果,统计水果的销售量
今天那个水果卖的好。
zadd meidian1 10 pingguo 20 juzi 30 putao #门店1卖了10斤的苹果,20斤的橘子,30斤的葡萄
zadd meidian1 15 boluo #忘记了统计菠萝
zrange mendian1 0 -1 #查看门店1中的所有数据
zrange mendian1 0 -1 withscore #查看门店1中的所有数据,带权重值
zadd meidian2 30 lizhi 20 xigua 15 shanzhu #门店1卖了30斤的荔枝,20斤西瓜,15斤山竹
两个门店一共统计
zunionstore mendianall 2 mendian1 mendian2 #zunionstore将两个集合进行合并,合并后的集合为mendianall,一共有2个门店,分别为mendian1和门店2
zrange mendian1ll 0 -1 #查询所有的数据,从小到大
zrange mendianall 0 -1 withscore #查看门店中的所有数据,带权重值
zrevrange mendianall 0 -1 withscore #查看门店中的所有数据,带权重值,进行倒叙,从大到小
六、bitmaps
bitmaps在string的基础上延伸出来的,单个key的存储大小为512M,如果超出了512M,会有什么情况?
防止大value,kv大小大于10Kb的称为大value,如果大value的存在,要进行value拆分。
情景:
统计一下,今年有多少用户登录了网站?
统计一下,连续上课3天的同学?
统计用户学习一年达到200天,赠送一门?
对于以上情景,就是2种状态,非1即0
setbit ke 10010 1 #用户10010来上课了
setbit ke 10011 1 #用户10011来上课了
setbit ke 10012 1 #用户10012来上课了
getbit ke 10010 #看看10010上不是上课了
strlen ke #查看这个key占用多大空间
setbit lianxu0610 10010 1 #连续上课的时间6月10号
setbit lianxu0610 10011 1 #连续上课的时间6月11号
setbit lianxu0610 10012 1 #连续上课的时间6月12号
setbit lianxu0611 10010 1 #连续上课的时间6月10号
setbit lianxu0611 10011 1 #连续上课的时间6月11号
setbit lianxu0612 10010 1 #连续上课的时间6月10号
bitop and lianxu lianxu0610 lianxu0611 lianxu0612 #连续三天上课的用户
bitcount ke 0 -1 #总共上课次数