一.简介
缓存就是数据交换的缓冲区(称作Cache [ kæʃ ] ),是存贮数据的临时地方,一般读写性能较高
二.添加Redis缓存
三.缓存更新策略
1.主动更新策略
Cache Aside Pattern(推荐)
需要调用者自己编码,但可控性高
Read/Write Through Pattern
优点:方便调用者
缺点:维护这样的服务成本较高
Write Behind Caching Pattern
优点:效率较高
缺点:要维护异步任务较复杂,并且难以保证一致性,甚至如果缓存出现宕机,数据将全部丢失
2.操作缓存
删除缓存与更新缓存
如何保证缓存与数据库的操作的同时成功或失败
单机系统可使用Spring的@transactional事务注解
如:
线程安全问题
①先删除缓存,再操作数据库
正常情况:
异常情况:
由于读写缓存的速度远高于更新数据库的速度,所以该问题发生概率较高
②先操作数据库,再删除缓存(推荐)
正常情况:
异常情况:
该问题发生概率较低,如果发生了,可以在写入缓存时设置超时时间
3.总结
四.三大热点问题
1.缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。如果有很多恶意的类似请求会给数据库带来很大的压力。
解决方案:①缓存空对象
优点: 实现简单,维护方便
缺点: ①额外的内存消耗(即缓存过多的空对象,可以通过设置过期时间TTL缓解)
②可能造成短期的不一致(缓存空对象时,恰好数据库插入了这么一条数据,当然可以通过插入后更新缓存来解决)
解决方案:②布隆过滤
原理:实际上是一个字节数组存了很多二进制位,把数据经过某种Hash算法转成Hash值,再把这些Hash值转成二进制位保存到布隆过滤器中,用0,1表示是否存在
优点:内存占用较少,没有多余key
缺点: ①实现复杂
②布隆过滤器是一种概率统计,存在误判可能 ,可能布隆过滤器判断存在实际并不存在,有穿透风险
我们采用方案一来解决商户查询缓存:
其他方案:
- 增加数据复杂度,做好数据基础格式校验
- 加强用户权限校验
- 做好热点参数的限流