Redis内存回收与缓存问题
内存回收:
1.过期key处理
通过expire命令给key设置ttl
Redis本身是KV型数据库,所有数据都存在RedisDB结构体中,其中有两张哈希表
dict:用于存放KV(这里K是K,V是V)
expires:保存Redis中所有的设置了过期时间的KEY以及到期时间TTL(这里K是K,V是TTL)
过期KEY有两种删除策略:
- 惰性删除,有命令需要操作key时,检测key是否还活着,过期则删除
- 周期删除,通过一个定时任务,周期性抽样带有TTL的key,过期则删除
- slow模式:默认频率10/s,每次执行时长不超过25ms,受server.hz参数影响
- fast模式:频率不固定,跟随内部IO事件循环执行。两次任务之间间隔不低于2ms,执行时长不超过1ms
2.内存淘汰策略
当Redis内存使用达到阈值的时候,Redis会主动挑选一部分key进行删除
什么时候检查是否达到阈值:在每次处理操作的时候都会进行
推荐使用volatile-lfu,其中的lfu与lru都记录在RedisObject中的unsigned lru:LRU_BITS

缓存问题.
缓存一致性
- 数据库双写,具有侵入性。(常用)
- 缓存与数据库整合为一套服务,开发的时候直接调接口。
- CRUD直接基于缓存,然后异步实现数据持久化。性能好,但是流程复杂,而且没有强一致性
低一致性的最佳实践:设一下TTL
高一致性的最佳实践

Q:为什么增删改都只是删除Redis中的数据
A:为了方便,反正我们查询的时候也会重新把数据写入Redis
Q:为什么删除的时候要先操作数据库,再操作Redis?
A:如果先操作Redis会出现线程安全问题:我们首先删除了Redis中的data,接下来进行数据库的操作,这个操作往往被认为是比较慢的。如果这时候同时有别的线程执行了读操作,就会导致Redis中写入了旧的数据,产生了缓存不一致
Q:延迟双删是什么
A:上述操作仍有极低概率造成线程安全问题。我们为了解决这个问题引入了延迟双删:在删除Redis数据之后的一段时间,我们再进行一次删除,确保数据的一致性
缓存穿透
客户端请求的数据在数据库里根本不存在,导致请求穿透缓存直接打到数据库上
解决方案:
- 缓存空对象:给不存在的数据建立缓存null。会额外消耗内存

- 布隆过滤:基于过滤器判断数据是否存在,如果根本不存在,拒绝请求

什么是布隆过滤器:一种数据统计的算法,用于检索一个元素是否存在于集合中。并且布隆过滤器无需存储元素到集合,而是把元素映射在一个很长的二进制数位上。存在一定误差。
缓存雪崩
同一时段Redis内大量key同时失效,或者Redis突然宕机。大量请求打到数据库,带来巨大压力
解决方案:
- 给不同的key的ttl随机设值
- 利用集群提高服务可用性
- 给缓存业务添加降级限流策略
- 给业务添加多级缓存:网页缓存/NGINX缓存/JVM缓存
缓存击穿

也称热点key问题,一个被高并发访问且缓存重建业务较复杂的key突然失效了,无数请求访问会瞬间打在数据库上造成压力
解决方案:
- 互斥锁:问题:性能比较差

- 逻辑过期:

java如何实现互斥锁?
public synchronized void test() {
// 通过关键字修饰方法或代码块
}
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//通过Lock接口
private final Lock lock=new ReentrantLock();
public void test() {
lock.lock();
try { }catch (){ }finally {
lock.unlock();
}
}
Redis内存回收与缓存问题的更多相关文章
- Redis内存回收机制
为什么需要内存回收? 原因有如下两点: 在 Redis 中,Set 指令可以指定 Key 的过期时间,当过期时间到达以后,Key 就失效了. Redis 是基于内存操作的,所有的数据都是保存在内存中, ...
- Redis内存回收策略
如果使用Redis的时候,不合理使用内存,把什么东西都放在内存里面,又不设置过期时间,就会导致内存的堆积越来越大.根据28法则,除了20%的热点数据之外,剩余的80%的非热点或不怎么重要的数据都在占用 ...
- Redis内存回收:LRU算法
Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...
- redis内存回收
1.定时过期expilre expire key TTL 10定时器 主动淘汰 2.惰性过期 被动淘汰 3getCommand expireIfNeed() 设置内存上线 set memory 上线 ...
- Redis的内存回收原理,及内存过期淘汰策略详解
Redis 内存回收机制Redis 的内存回收主要围绕以下两个方面: 1.Redis 过期策略:删除过期时间的 key 值 2.Redis 淘汰策略:内存使用到达 maxmemory 上限时触发内存淘 ...
- 深入了解Redis(5)-内存回收
了解redis内存回收之前,需要先了解过期键删除策略. 过期键删除策略 1.定时删除 在设置键的过期时间的同时,创建一个timer,在定时器在键的过期时间到达时,立即执行对键的删除操作.内存友好型策略 ...
- redis内存监控与回收
Redis有自己的内存分配器,当key-value对象被移除时,Redis不会马上向操作系统释放其占用内存.redis之所以这样的设计有两个原因. OS可能会将释放内存交换到虚拟内存,但OS的虚拟内存 ...
- Redis 系列(04-2)Redis原理 - 内存回收
目录 Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 1. 过期策略 1.1 定时过期(主动淘汰) 1.2 惰性过期(被动淘汰) 1.3 定期过期 2. 淘汰策略 2. ...
- redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换
一. 概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1 ...
- Redis的内存回收机制
Redis的内存回收机制 2018年01月16日 17:11:48 chs007chs 阅读数:1172 Redis的内存回收机制主要体现在一下两个方面: 删除过期时间的键对象 删除过期键对象 : ...
随机推荐
- 恭喜PaddleOCRSharp开源项目通过PaddleOCR社区常规赛优秀项目首次评选
PaddleOCR优秀社区项目推荐: PaddleOCR社区常规赛首次评选结果已于日前出炉,本次优秀项目推广为大家带来的是[部署篇]:️ PaddleOCR的.NET调用库:包含文本识别.文本检测.基 ...
- golang interface 和 struct 添加方法的区别
在 Go 语言中,struct 和 interface 都可以关联方法,但它们的方式不同: 1. struct 添加方法: 结构体(struct)本身不直接包含方法,但可以通过定义一个指向该结构体类型 ...
- jquery的全局函数 多库并存
// jQuery的全局函数 , 也称钩子函数 // 所谓的钩子函数 是 与 其他函数绑定的函数 // 作用是 监听 函数的执行 当函数执行到某个状态时 ...
- STM32 + RT-Thread + LVGL
一.基本信息 MCU:STM32F103ZET6 RT-Thread:5.0.2 LVGL:8.3.11 LCD:ST7735s 编译环境:RTThread studio 二.LVGL 移植要求 16 ...
- Idea克隆检出git项目
1.我这里假设你已经安装好了Idea和Git环境 2. .
- 盘点 Spring Boot 解决跨域请求的几种办法
熟悉 web 系统开发的同学,对下面这样的错误应该不会太陌生. 之所以会出现这个错误,是因为浏览器出于安全的考虑,采用同源策略的控制,防止当前站点恶意攻击 web 服务器盗取数据. 01.什么是跨域请 ...
- Unity网络通信系统设计
Unity网络通信系统设计 Buffer报文 BufferEntity类作为报文基类的作用包括: 封装数据:BufferEntity类可以用来封装网络通信中的数据,方便在网络传输中进行处理和管理. 提 ...
- OSI七层网络模型和TCP/IP四层模型
OSI七层网络模型 OSI: 开放系统互连参考模型是ISO制定的一个用于计算机或通信系统间互联的标准体系 OSI七层模型功能: 物理层: 七层模型的最底层,主要是物理介质传输媒介(网线或者无线),在不 ...
- mysql数据迁移-8.0.25
本文只简单描述一些逻辑迁移的问题,而且主要是针对开发过程中,小批量数据(例如100m之下的). 这几天装了个新的mysql8.0.25 64bit windows版本的. -- 看的出来oracle公 ...
- golang如何使用指针灵活操作内存?unsafe包原理解析
Hi 你好,我是k哥.一个大厂工作6年,还在继续搬砖的后端程序员. 我们都知道,C/C++提供了强大的万能指针void*,任何类型的指针都可以和万能指针相互转换.并且指针还可以进行加减等算数操作.那么 ...