redis实际应用随记

  • string
  1. 缓存
  2. 分布式锁
  3. value整数还可以计数

 

  • list
  1. 队列
  2. 平均分配,从队头取部分放到结尾,并返回这部分。

 

  • hash
  1. hash和string用途类似,操作方式也类似,适合存储一个对象

 

  • set
  1. 有去重效果,可以存储中奖用户id,保证一个用户不会中2次奖

 

  • zset
  1. 滑动窗口做限流
    public boolean limiter(String userId,String action,int period,int max) {
        String key = userId+action;
        long now = System.currentTimeMillis();
        client.zadd(key,now,uuid);//value保证唯一,score取当前事件戳
        client.zremrangeByScore(key,0,now-period*1000);//只保留窗口内的值
        long count = client.zcard(key);
        client.expire(key,period+1);//+1是留一点缓冲余地
        return count<max;
    }

 

 

  • bitmap
  1. 用户打卡 key的级别根据打卡的要求来定,可以是月,可以是年
  2. 手机号除重,前三位为一个号码段,后八位用bitmap(一个号码段占用12m)

 

  • bloom filter
  1. 对于只增不减的表可以用bloom filter提前知道数据在不在表里,提高查询性能
  2. 防御恶意缓存穿透

 

  • hyperloglog
  1. uv,pv统计,精准度99%,占用16k以下,有去重效果

 

  • 秒杀系统-redis检查是否可以买,mq来异步落库
  1. 用一个java本地变量flag=true标识是否卖完,如果true直接返回无库存
  2. 发一个事务消息,用lua检查是否有库存,无库存返回1,有库存但这个用户已买过返回2,可以的话买库存-1,把userId放入set中表示购买成功。
  3. 无库存更新本地flag=true
  4. 事务消息回调逻辑:if(set.size=总量&&userId不在redis set中) return rollback,else if(set.size<总量&&userId不在redis set中) return later,else if(userId在redis set中) return success
  5. 消费者消息可见,异步落库

 

posted @ 2021-07-26 21:42  扶不起的刘阿斗  阅读(24)  评论(0编辑  收藏  举报