地方网站发展,wordpress主机转移,服装生产erp管理软件,城阳网站建设培训缓存是我们用来减少数据库访问的常见操作#xff0c;里面的一些常见思路及问题这里总结下。下面以redis举例。
使用方式分类#xff1a;
一#xff0c;只读缓存。 只读缓存时#xff0c;会先看redis里有无数据#xff0c;有则直接返回。没有则走数据库查询一次#xff… 缓存是我们用来减少数据库访问的常见操作里面的一些常见思路及问题这里总结下。下面以redis举例。
使用方式分类
一只读缓存。 只读缓存时会先看redis里有无数据有则直接返回。没有则走数据库查询一次将查询到的数据放入redis并给个过期时间然后将数据返回给前端。对于数据变更来说直接更新或删除数据库然后调下redis的删除接口。这样下次请求发现没数据则会从新加载数据。 1这里删除可能失败但是失败概率极低。如果要处理的话想办法重试就可以了。 2如果并发发现缓存中数据没有则会将并发请求打到数据库中。这会造成数据库压力。这里可以将数据加载接口加锁拿到锁后再检查下是否有数据。缓存击穿场景 3如果并发量极大。通过这种被动加载数据方式其实效率不行的。可以考虑主动加载方式。外部请求只到缓存永远到不的到数据库层。数据的加载与更新都是通过其他任务来执行的。缓存击穿场景
二读写缓存。 读写缓存的意思是不仅读直接到缓存层写也会直接更新缓存层。一般不用这种方案除非你对写入性能极其看中。 1写入redis的操作不是很可靠存在丢失数据风险所以考虑同步写入缓存和数据库等都成功时才叫成功。不过这个方案性能肯定不行毕竟数据库容易是瓶颈。 2写入redis后给数据打个标记其他任务根据标记批量获取存到数据库中。这种方案性能很好但是数据存在延迟同步的问题而且数据容易丢失部分这取决于你同步的频率。
三缓存分级。 缓存分级其实是对上面使用的延续将缓存使用在不同地方叫不同级别。比如本地hashMap缓存叫一级缓存redis叫二级缓存存放在远程客户端的叫三级缓存。用的地方越多维护越麻烦数据同步更是越复杂。不是极端优化没必要用这么多。
常见问题
一缓存雪崩 缓存雪崩的意思是突然缓存没了导致大量请求到数据库中。 1比如缓存同时过期导致用户同时要去查数据库负载突然拉高。这个问题我生产遇到过。这种问题在设置过期时间时随机下就不会同时过期了。 2缓存服务挂了导致请求到达数据库。这种问题要分场景大并发场景下肯定不能失败时打到数据库中。应该从缓存高可用和降级上考虑。如果小业务下倒是可以到达数据库。
二缓存击穿 缓存击穿上面提到过缓存击穿一种是加锁处理一种是直接限制无法穿透到数据库层。
三缓存穿透 缓存穿透的意思是数据库本来就没有的数据缓存中肯定也就没有那么每次查询势必会再次走到数据库层。 1直接在缓存中保存没查到的值但是要看业务场景而给一个过期时间不然就永远曾的不存在了。 2使用布隆过滤器来判断是否存在。
四缓存预热 缓存预热的意思是我们预先知道了哪些数据是热点数据如果等用户请求来了再加载数据的话也可能把数据库负载拉起来。那么我们何不预先就先把数据加载到缓存中呢这就是预热的意思。