redis 缓存一致性,缓存穿透,缓存雪崩,缓存击穿

2024-05-05 07:04

本文主要是介绍redis 缓存一致性,缓存穿透,缓存雪崩,缓存击穿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.缓存一致性:

缓存一致性就是通过各种方法保证缓存与数据库信息一种,其中最多的办法就是想尽一切办法对过期key进行清除,以保证redis和数据库信息一只,其中就包括了这篇文章中提到的内存淘汰策略,过期key的清除等等,当然也包括在代码中进行手动清除过期key,不过手动清除时需要注意要保证数据库的更新和redis的清除都成功完成,可以使用的方法包括,使用事务,使用相关服务将redis和数据库进行整合,或者只操作redis,再由redis操作数据库等等。

当我们选择手动事务更新数据库和redis保证其一致性时需要注意以下几点:

当我们更新数据库后,应该选择删除redis缓存,而不是更新,因为更新操作收益不大,并且操作繁琐容易出错。并且应该先更改数据库在删除缓存,因为更改操作耗时更长,如果先删除再修改,容易造成在修改过程中,数据被其他线程读取,然后向缓存中写入修改前的数据,而后删除则可以避免这种情况。

在高一致性的要求下可以采用手动更新数据库和redis,而低一致性的情况下可以使用redis自带的内存淘汰机制

2.缓存穿透

缓存穿透是指当一个数据为空时,缓存无法命中,数据库也无法命中,数据库无法命中导致无法写入redis,这样所有的请求都会涌入数据库,这就叫缓存穿透

解决方法分两种

1.返回null

当数据库没有数据时可以使redis缓存null值并且设置过期时间,这样便可以避免请求进入数据库,确实是会造成额外的性能损耗,以及当数据库存入数据时,在null过期时间之内无法访问到,会造成短时间内的数据不一致

2.布隆过滤

布隆过滤是将有可能会造成数据穿透的数据保存在一个极长的二进制数中,他会将这个数据经过十六个哈希函数的运算,最终映射到二进制数上

当再次请求这个数据时会先经过布隆过滤的十六个哈希函数,判断是否映射在了二进制数上,如果有则去访问,没有则不允许访问。当数据增多时,布隆过滤会造成误判,有可能将不存在的数据判定为存在,因为1过多,映射容易重复,不过概率极低

3.缓存雪崩

缓存雪崩是指同一时间大量key失效,或redis服务器宕机,导致大量请求涌入数据库。

解决方法包括:

1.设置不同的过期时间

通常,当我们设置缓存时,可能会给所有的缓存项设置相同的过期时间。这样做的问题在于,如果大量缓存同时过期,那么这些请求都会同时转到数据库上,可能会导致数据库瞬间压力过大。为了避免这种情况,我们可以对每个缓存项的过期时间添加随机的几分钟,这样缓存项的过期时间就会分散开来,避免同一时刻大量请求打到数据库。

2. 设置缓存重试策略

当缓存失效后,如果所有请求都立即转向数据库,数据库可能会处理不过来。我们可以设置一种机制,让这些请求不是立即都发送,而是通过一些延迟和重试的策略(比如,第一次失败后等待100毫秒,第二次失败后等待200毫秒),这样可以避免在极短的时间内给数据库带来过大的压力。

3. 使用熔断器

熔断器是一种自动开关机制,当检测到对数据库的请求过多时,它会暂时“断开”,阻止进一步的请求,以保护数据库。这可以防止在缓存失效后,大量请求直接涌向数据库造成的崩溃。

4. 预热缓存

预热缓存指的是在缓存正式到期和被删除前,系统自动地刷新缓存数据。这样,即使缓存条目过期,新的数据已经被加载并准备好,请求仍然可以从缓存中获取数据,而不需要去数据库中查询。

5. 使用分布式缓存

通过将缓存扩展到多个Redis服务器或使用其他分布式缓存系统,可以降低单个Redis实例出问题导致的影响。分布式缓存通过多个节点协作,即使某个节点出现故障,其他节点仍能提供服务。

6. 限流

限流是指对来自客户端的请求速率进行控制,确保系统在高流量时不会被过度负载。通过限制每秒处理的请求量,可以保护后端数据库不被过多的请求同时击垮。

4缓存击穿

缓存击穿是指一个用于大量高并发访问,并且缓存重建业务复杂的key失效,大量请求涌入数据库

解决方法分为两种

1.互斥锁

在线程访问redis失败,访问数据库的途中添加互斥锁,只有拥有锁的线程才能使用数据库数据并且重新构建缓存,其他线程只能等待该线程构建redis后使用缓存数据

2.逻辑过期

逻辑过期是互斥锁的加强版,他不在设置key的过期时间,而是通过字段的方式存储key过期时间,这样只有我们的代码特意查看时才会发现该key过期,而redis则不知道还会继续保留该key,而当一个线程发现过期时会获取锁并且重新构建redis,在这个过程中,其他没有获取锁的线程会继续用旧值完成业务。

这篇关于redis 缓存一致性,缓存穿透,缓存雪崩,缓存击穿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961076

相关文章

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

利用Frp实现内网穿透(docker实现)

文章目录 1、WSL子系统配置2、腾讯云服务器安装frps2.1、创建配置文件2.2 、创建frps容器 3、WSL2子系统Centos服务器安装frpc服务3.1、安装docker3.2、创建配置文件3.3 、创建frpc容器 4、WSL2子系统Centos服务器安装nginx服务 环境配置:一台公网服务器(腾讯云)、一台笔记本电脑、WSL子系统涉及知识:docker、Frp

为什么要做Redis分区和分片

Redis分区(Partitioning)和分片(Sharding)是将数据分布在多个Redis实例或多个节点上的做法。这种技术用于提高性能、可扩展性和可用性。以下是执行Redis分区和分片的主要原因: 1. **提高吞吐量**:    - 通过将数据分散到多个节点,可以并行处理更多的操作,从而提高整体吞吐量。 2. **内存限制**:    - 单个Redis实例的内存是有限的。分区允许数据

如何理解redis是单线程的

写在文章开头 在面试时我们经常会问到这样一道题 你刚刚说redis是单线程的,那你能不能告诉我它是如何基于单个线程完成指令接收与连接接入的? 这时候我们经常会得到沉默,所以对于这道题,笔者会直接通过3.0.0源码分析的角度来剖析一下redis单线程的设计与实现。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源

服务器雪崩的应对策略之----SQL优化

SQL语句的优化是数据库性能优化的重要方面,特别是在处理大规模数据或高频访问时。作为一个C++程序员,理解SQL优化不仅有助于编写高效的数据库操作代码,还能增强对系统性能瓶颈的整体把握。以下是详细的SQL语句优化技巧和策略: SQL优化 1. 选择合适的数据类型2. 使用索引3. 优化查询4. 范式化和反范式化5. 查询重写6. 使用缓存7. 优化数据库设计8. 分析和监控9. 调整配置1、

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”,意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相关依赖 <?xml version

设置Nginx缓存策略

详细信息 Nginx服务器的缓存策略设置方法有两种:add_header或者expires。 1. add_header 1)语法:add_header name value。 2)默认值:none。 3)使用范围:http、server、location。 配置示例如下: add_header cache-control "max-age=86400";#设置缓存时间为1天。add

redis切换数据库的方法【jedis】

package com.test;import redis.clients.jedis.Jedis;public class readredis {public static void main(String[] args) {// 连接本地的 Redis 服务Jedis jedis = new Jedis("127.0.0.1", 6379);jedis.select(10);String v

Redis 高性能基本操作

单元素操作是基础 单元素操作,是指每一种集合类型对单个数据实现增删改查 例如,Hash 类型的 HGET、HSET 和 HDEL,Set 类型的 SADD、SREM、SRANDMEMBER 等这些操作的复杂度由集合采用的数据结构决定,例如,HGET、HSET 和 HDEL 是对哈希表做操作,所以它们的复杂度都是 O(1)Set 类型用哈希表作为底层数据结构时,它的 SADD、SREM、SRAN

redis高级用法

redis 慢日志查询 配置参数 slowlog-log-slower-than 10000 #单位微秒 slowlog-max-len 选项指定服务器最多保存多少条慢查询日志 redis-cli slowlog get #获取慢日志1) 1) (integer) 4 # 日志的唯一标识符(uid)2) (integer) 1378781447 # 命令执