什么是缓存
缓存是数据交换的缓冲区,是存储数据的临时地方一般读写性能较高。在web开发中从硬件cpu到服务器tomcat都会有自己的缓存。
缓存的作用
降低数据库压力,提高读写效率。
缓存的更新策略
内存淘汰
redis会利用自身内存机制,当内存不足时进行数据taot
超市剔除
在往redis插入数据时往往会设置key的存在时间,当存在时间到期后会进行自动剔除
手动更新
当数据库发生改变时手动删除redis的缓存。注意一定要先操作数据库在操作缓存
缓存穿透问题
- 什么是缓存穿透:当一个请求在缓存和数据库层都不存在时,如果有人故意为之则会频繁访问数据库不会访问缓存从而导致数据库崩溃问题
- 解决
- 缓存空对象:缺点是可能造成短期与数据库数据不一致
- 布隆过滤:缺点是不
3 实现:当一个请求去访问数据库值为空时,将null写入redis中以保证多次执行该请求访问的是缓存而不是数据库。并且当另外一个请求访问缓存时如果发现缓存里面没有并不是直接访问数据库而是要先进行判断当前是否为空值。
缓存雪崩
- 雪崩是指同一时段大量的key同时失效或者redis宕机,那么会导致大量请求都会访问数据库
- 解决:当从数据库导入redis时不要把TTL都设置为一样的时间。还可以添加多级缓存。利用redis集群
缓存击穿
- 问题:也称热点key问题,如果优惠价秒杀同一时间高并发访问并且缓存重建业务较复杂的key失效了,无数请求会直接访问数据库
- 解决:
- 互斥锁:当有多个线程来访问时如果发现未命中那么要去获取排斥锁并且访问数据库来写入缓存,其他线程访问时会休眠并且重试,直到锁释放这个机制可以利用setnx来实现。这样意味着性能会差
- 逻辑过期:给数据添加一个过期字段。当一个线程查询缓存时发现逻辑过期了则会该线程会单开一个线程并且加锁,查询数据库写入缓存然后释放锁,在释放锁之前其他线程如果发现逻辑过期后会先返回过期数据库,这也就会导致短期数据库与缓存信息不一致