Redis实战场景设计

一、字符串

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           #总共上课次数

Redis分布式锁的正确操作方式

image.png

你可能感兴趣的:(Redis实战场景设计)