缓存使用常见思路及问题

缓存是我们用来减少数据库访问的常见操作,里面的一些常见思路及问题这里总结下。下面以redis举例。

使用方式分类:

一,只读缓存。

只读缓存时,会先看redis里有无数据,有则直接返回。没有则走数据库查询一次,将查询到的数据放入redis并给个过期时间,然后将数据返回给前端。对于数据变更来说,直接更新或删除数据库,然后调下redis的删除接口。这样下次请求发现没数据则会从新加载数据。

1,这里删除可能失败,但是失败概率极低。如果要处理的话,想办法重试就可以了。

2,如果并发发现缓存中数据没有,则会将并发请求打到数据库中。这会造成数据库压力。这里可以将数据加载接口加锁,拿到锁后再检查下是否有数据。(缓存击穿场景)

3,如果并发量极大。通过这种被动加载数据方式其实效率不行的。可以考虑主动加载方式。外部请求只到缓存,永远到不的到数据库层。数据的加载与更新都是通过其他任务来执行的。(缓存击穿场景)

二,读写缓存。

读写缓存的意思是不仅读直接到缓存层,写也会直接更新缓存层。一般不用这种方案,除非你对写入性能极其看中。

1,写入redis的操作不是很可靠,存在丢失数据风险,所以考虑同步写入缓存和数据库,等都成功时才叫成功。不过这个方案性能肯定不行,毕竟数据库容易是瓶颈。

2,写入redis后给数据打个标记,其他任务根据标记批量获取存到数据库中。这种方案性能很好,但是数据存在延迟同步的问题,而且数据容易丢失部分,这取决于你同步的频率。

三,缓存分级。

缓存分级其实是对上面使用的延续,将缓存使用在不同地方叫不同级别。比如本地hashMap缓存叫一级缓存,redis叫二级缓存,存放在远程客户端的叫三级缓存。用的地方越多,维护越麻烦,数据同步更是越复杂。不是极端优化,没必要用这么多。

常见问题:

一,缓存雪崩

缓存雪崩的意思是突然缓存没了,导致大量请求到数据库中。

1,比如缓存同时过期,导致用户同时要去查数据库,负载突然拉高。这个问题我生产遇到过。这种问题在设置过期时间时随机下就不会同时过期了。

2,缓存服务挂了,导致请求到达数据库。这种问题要分场景,大并发场景下肯定不能失败时打到数据库中。应该从缓存高可用和降级上考虑。如果小业务下,倒是可以到达数据库。

二,缓存击穿

缓存击穿上面提到过(缓存击穿),一种是加锁处理,一种是直接限制无法穿透到数据库层。

三,缓存穿透

缓存穿透的意思是数据库本来就没有的数据,缓存中肯定也就没有,那么每次查询势必会再次走到数据库层。

1,直接在缓存中保存没查到的值,但是要看业务场景而给一个过期时间,不然就永远曾的不存在了。

2,使用布隆过滤器来判断是否存在。

四,缓存预热

缓存预热的意思是我们预先知道了哪些数据是热点数据,如果等用户请求来了再加载数据的话,也可能把数据库负载拉起来。那么我们何不预先就先把数据加载到缓存中呢?这就是预热的意思。

相关推荐
夜影风17 小时前
Nginx反向代理与缓存实现
运维·nginx·缓存
编程(变成)小辣鸡19 小时前
Redis 知识点与应用场景
数据库·redis·缓存
菜菜子爱学习1 天前
Nginx学习笔记(八)—— Nginx缓存集成
笔记·学习·nginx·缓存·运维开发
魏波.1 天前
常用缓存软件分类及详解
缓存
yh云想2 天前
《多级缓存架构设计与实现全解析》
缓存·junit
白仑色2 天前
Redis 如何保证数据安全?
数据库·redis·缓存·集群·主从复制·哨兵·redis 管理工具
浩浩测试一下2 天前
02高级语言逻辑结构到汇编语言之逻辑结构转换 if (...) {...} else {...} 结构
汇编·数据结构·数据库·redis·安全·网络安全·缓存
ycchenG72 天前
缓存元数据损坏操作步骤(lvmcache修复)
linux·缓存
2301_793086872 天前
Redis 03 redis 缓存异常
数据库·redis·缓存
hj10433 天前
redis开启局域网访问
数据库·redis·缓存