美文网首页
Redis实战场景设计

Redis实战场景设计

作者: 若熙笔记 | 来源:发表于2021-05-12 13:37 被阅读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           #总共上课次数
    

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

    image.png

    相关文章

      网友评论

          本文标题:Redis实战场景设计

          本文链接:https://www.haomeiwen.com/subject/aiggdltx.html