【具体代码笔记查看note.md】
旅行伴侣是⼀个⼤量使⽤Redis的项⽬,具有以下功能:
- 短信登录:使用redis共享session来实现
- 旅游城市查询缓存:理解缓存击穿,缓存穿透,缓存雪崩等问题
- 车票秒杀:Redis的计数器功能, 结合Lua完成高性能的redis操作,同时学会Redis分布式锁的原理,包括Redis的三种消息队列
- 点赞:基于List来完成点赞列表的操作,同时基于SortedSet来完成点赞的排行榜功能
- 好友关注:基于Set集合的关注、取消关注,共同关注等等功能
- 附近城市:利用Redis的GEOHash来完成对于地理坐标的操作
- 用户签到:使用Redis的BitMap数据统计功能
- UV统计:使用Redis来完成统计功能
实现逻辑:
实现逻辑:橙色为修改部分
实现逻辑:
实现逻辑:
问题出现:
是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
解决逻辑:
问题出现:
同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
解决逻辑:
- 给不同的Key的TTL添加随机值(key失效)
- 给业务添加多级缓存(key失效)
- 利用Redis集群提高服务的可用性(redis宕机)
- 给缓存业务添加降级限流策略(redis宕机)
问题出现:
一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击
解决逻辑:
实现逻辑:
解决逻辑:乐观锁判断版本号
boolean success = seckillVoucherService.update()
.setSql("stock= stock -1")
.eq("voucher_id", voucherId).update().gt("stock",0); //where id = ? and stock > 0
问题出现:
解决逻辑:在获取锁时存入线程标示(可以用UUID表示),一致放锁,不一致不放锁
解决思路: Lua脚本解决多条命令原子性问题
实现逻辑:
lua保证原子性
set的intersect
方法查询交集,传入两个key查找交集value
Set<String> intersect = stringRedisTemplate.opsForSet().intersect(userKey, otherKey);
实现逻辑:
stringRedisTemplate.opsForHyperLogLog().add("testHyperLogLog", values);