缓存使用常见思路及问题

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

使用方式分类:

一,只读缓存。

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

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

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

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

二,读写缓存。

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

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

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

三,缓存分级。

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

常见问题:

一,缓存雪崩

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

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

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

二,缓存击穿

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

三,缓存穿透

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

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

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

四,缓存预热

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

相关推荐
知识即是力量ol6 小时前
基于 Redis 实现白名单,黑名单机制详解及应用场景
数据库·redis·缓存
fengxin_rou8 小时前
Redis 从零到精通:第一篇 初识redis
数据库·redis·缓存
陌上丨11 小时前
Redis内存使用率在95%以上,请问是什么原因?如何解决?
数据库·redis·缓存
dawdo22212 小时前
自己动手从头开始编写LLM推理引擎(9)-KV缓存实现和优化
缓存·llm·transformer·qwen·kv cache
小北方城市网13 小时前
RabbitMQ 生产级实战:可靠性投递、高并发优化与问题排查
开发语言·分布式·python·缓存·性能优化·rabbitmq·ruby
陌上丨13 小时前
什么是Redis的大Key和热Key?项目中一般是怎么解决的?
数据库·redis·缓存
小园子的小菜13 小时前
深入剖析HBase HFile原理:文件结构、Block协作与缓存机制
数据库·缓存·hbase
廋到被风吹走14 小时前
【缓存优化】缓存穿透:布隆过滤器(Guava/RedisBloom)
缓存·guava
Moshow郑锴14 小时前
Spring Boot Data API 与 Redis 集成:KPI/图表/表格查询的缓存优化方案
spring boot·redis·缓存
小马爱打代码14 小时前
MyBatis:缓存体系设计与避坑大全
java·缓存·mybatis