redis实际应用随记
- string
- 缓存
- 分布式锁
- value整数还可以计数
- list
- 栈
- 队列
- 平均分配,从队头取部分放到结尾,并返回这部分。
- hash
- hash和string用途类似,操作方式也类似,适合存储一个对象
- set
- 有去重效果,可以存储中奖用户id,保证一个用户不会中2次奖
- zset
- 滑动窗口做限流
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
- 用户打卡 key的级别根据打卡的要求来定,可以是月,可以是年
- 手机号除重,前三位为一个号码段,后八位用bitmap(一个号码段占用12m)
- bloom filter
- 对于只增不减的表可以用bloom filter提前知道数据在不在表里,提高查询性能
- 防御恶意缓存穿透
- hyperloglog
- uv,pv统计,精准度99%,占用16k以下,有去重效果
- 秒杀系统-redis检查是否可以买,mq来异步落库
- 用一个java本地变量flag=true标识是否卖完,如果true直接返回无库存
- 发一个事务消息,用lua检查是否有库存,无库存返回1,有库存但这个用户已买过返回2,可以的话买库存-1,把userId放入set中表示购买成功。
- 无库存更新本地flag=true
- 事务消息回调逻辑:if(set.size=总量&&userId不在redis set中) return rollback,else if(set.size<总量&&userId不在redis set中) return later,else if(userId在redis set中) return success
- 消费者消息可见,异步落库