写点什么

缓存 | Redis 缓存避坑指南

发布于: 3 小时前
缓存 | Redis 缓存避坑指南

作者:马功伟 青云科技软件开发工程师

目前从事青云数据库管理平台开发工作,一直从事 Server 端开发工作。


高并发业务场景下,常使用缓存技术缓解数据库压力,可极大的提升用户体验和系统稳定性。由于 Redis 自身的诸多特性,很适合用来做缓存。下面是一个常见的缓存查询流程。


缓存查询流程


虽然缓存带来了较多数据库使用性能方面的提升,也会带来一些缓存使用问题。


本文将为大家介绍并区分 缓存穿透,缓存击穿,缓存雪崩 三个常见缓存问题,并针对不同问题提供相应解决思路。

| 缓存击穿

查询请求下发后,缓存层中没有查询内容,数据库中有。在高并发场景下,某热点 Key 突然失效,所有请求都打到数据库上,导致数据库压力过大。


查询击穿

解决思路

永不失效


这里分两种情况:


  • 对缓存数据的 Redis Key 不设置过期时间,在数据库写入后进行刷新缓存;

  • 另起异步任务在 Redis Key 将要过期的时候来更新缓存。


使用互斥锁


业界常使用 mutex 。简单说,就是只允许一个线程重建缓存,其他线程等待重建缓存完成,再从缓存获取数据即可。

| 缓存穿透

查询下发后,缓存层和数据库层都没有数据的情况。由于存储层查不到,导致无数据缓存。不存在的数据请求每次都要到存储层去查询,在高并发场景下,导致数据库压力过大。


查询穿透

解决思路

缓存空值


对于缓存中没有并在数据库中查询不到的数据,可以缓存空值,并设置较短的有效期。


接口层进行校验


类似 ID=-1 这样的请求,可以在接口层增加参数和发性校验,对于校验不通过的请求直接 Return。


通过 IP 限流


对单一 IP 进行限流,比如 10 次/ 2 秒。虚拟货币交易所使用该解决方案。


布隆过滤器


当要查询一个数据时,使用 K 个哈希函数对元素值进行 K 次计算,得到 K 个哈希值,根据得到的哈希值,检查对应的 K 个比特值。

| 缓存雪崩

高并发场景下,同一时间大面积的缓存失效,所有的请求打到数据库上,导致数据库压力过大。与缓存击穿不同的是,缓存击穿是并发查询同一条数据,缓存雪崩是大量的缓存失效


查询雪崩

解决思路

随机生成 Redis Key 的过期时间


在写入缓存时随机生成 Key 的过期时间,比如随机在 1-10 之间生成秒数。


加锁排队


与缓存击穿解决思路一致。


缓存预热


系统上线时将相关数据写入缓存,这样可以避免在系统上线初期的高并发访问。


永不失效


和缓存击穿解决思路一致。


对于加锁排队方案可以减轻数据库压力,但是会降低吞吐量,分布式系统中,还要考虑分布式锁的问题,并且在高并发情况下,可能会导致用户等待超时,对系统并发能力并没有显著作用。

总结

对以上提及的解决思路,也存在如下一些缺点。



故针对不同的业务系统,需要根据不同的业务场景具体分析,对症下药

关于 RadonDB

RadonDB 开源社区 是一个面向云原生、容器化的数据库开源社区。为数据库技术爱好者提供围绕主流开源数据库(MySQL、PostgreSQL、Redis、MongoDB、ClickHouse 等)的技术分享平台,并提供企业级 RadonDB 开源产品及服务。


目前 RadonDB 开源数据库系列产品已被 光大银行、浦发硅谷银行、哈密银行、泰康保险、太平保险、安盛保险、阳光保险、百年人寿、安吉物流、安畅物流、蓝月亮、天财商龙、罗克佳华、升哲科技、无锡汇跑体育、北京电信、江苏交通控股、四川航空、昆明航空、国控生物 等上千家企业及社区用户采用。


RadonDB 可基于云平台与 Kubernetes 容器平台交付,不仅提供覆盖多场景的数据库产品解决方案,而且提供专业的集群管理和自动化运维能力,主要功能特性包括:高可用主从切换、数据强一致性、读写分离、一键安装部署、多维指标监控 &告警、弹性扩容 &缩容、横向自由扩展、自动备份 &恢复、同城多活、异地灾备 等。RadonDB 仅需企业及社区用户专注于业务层逻辑开发,无需关注集群高可用选型、管理和运维等复杂问题,帮助企业及社区用户大幅度提升业务开发与价值创新的效率!


GitHub:https://github.com/radondb


微信群: 请搜索添加群助手微信号 radondb

发布于: 3 小时前阅读数: 5
用户头像

https://radondb.com 2021.06.21 加入

一个面向云原生、容器化的数据库开源社区!

评论

发布
暂无评论
缓存 | Redis 缓存避坑指南