内存回收:

1.过期key处理

通过expire命令给key设置ttl

Redis本身是KV型数据库,所有数据都存在RedisDB结构体中,其中有两张哈希表

  dict:用于存放KV(这里K是K,V是V)

  expires:保存Redis中所有的设置了过期时间的KEY以及到期时间TTL(这里K是K,V是TTL)

过期KEY有两种删除策略:

  1. 惰性删除,有命令需要操作key时,检测key是否还活着,过期则删除
  2. 周期删除,通过一个定时任务,周期性抽样带有TTL的key,过期则删除
    1. slow模式:默认频率10/s,每次执行时长不超过25ms,受server.hz参数影响
    2. fast模式:频率不固定,跟随内部IO事件循环执行。两次任务之间间隔不低于2ms,执行时长不超过1ms

2.内存淘汰策略

  当Redis内存使用达到阈值的时候,Redis会主动挑选一部分key进行删除

  什么时候检查是否达到阈值:在每次处理操作的时候都会进行

  推荐使用volatile-lfu,其中的lfu与lru都记录在RedisObject中的unsigned lru:LRU_BITS

缓存问题.

缓存一致性

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

低一致性的最佳实践:设一下TTL

高一致性的最佳实践

Q:为什么增删改都只是删除Redis中的数据

A:为了方便,反正我们查询的时候也会重新把数据写入Redis

Q:为什么删除的时候要先操作数据库,再操作Redis?

A:如果先操作Redis会出现线程安全问题:我们首先删除了Redis中的data,接下来进行数据库的操作,这个操作往往被认为是比较慢的。如果这时候同时有别的线程执行了读操作,就会导致Redis中写入了旧的数据,产生了缓存不一致

Q:延迟双删是什么

A:上述操作仍有极低概率造成线程安全问题。我们为了解决这个问题引入了延迟双删:在删除Redis数据之后的一段时间,我们再进行一次删除,确保数据的一致性

缓存穿透

客户端请求的数据在数据库里根本不存在,导致请求穿透缓存直接打到数据库上

解决方案:

  1. 缓存空对象:给不存在的数据建立缓存null。会额外消耗内存

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

什么是布隆过滤器:一种数据统计的算法,用于检索一个元素是否存在于集合中。并且布隆过滤器无需存储元素到集合,而是把元素映射在一个很长的二进制数位上。存在一定误差。

缓存雪崩

同一时段Redis内大量key同时失效,或者Redis突然宕机。大量请求打到数据库,带来巨大压力

解决方案:

  • 给不同的key的ttl随机设值
  • 利用集群提高服务可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存:网页缓存/NGINX缓存/JVM缓存

缓存击穿

也称热点key问题,一个被高并发访问且缓存重建业务较复杂的key突然失效了,无数请求访问会瞬间打在数据库上造成压力

解决方案:

  • 互斥锁:问题:性能比较差

  • 逻辑过期:

java如何实现互斥锁?

  1. public synchronized void test() {
  2.   // 通过关键字修饰方法或代码块
  3. }
  1. import java.util.concurrent.locks.Lock;
  2. import java.util.concurrent.locks.ReentrantLock;
  3. //通过Lock接口
  4. private final Lock lock=new ReentrantLock();
  5. public void test() {
  6. lock.lock();
  7. try {
  8.  
  9. }catch (){
  10.  
  11. }finally {
  12. lock.unlock();
  13. }
  14. }

Redis内存回收与缓存问题的更多相关文章

  1. Redis内存回收机制

    为什么需要内存回收? 原因有如下两点: 在 Redis 中,Set 指令可以指定 Key 的过期时间,当过期时间到达以后,Key 就失效了. Redis 是基于内存操作的,所有的数据都是保存在内存中, ...

  2. Redis内存回收策略

    如果使用Redis的时候,不合理使用内存,把什么东西都放在内存里面,又不设置过期时间,就会导致内存的堆积越来越大.根据28法则,除了20%的热点数据之外,剩余的80%的非热点或不怎么重要的数据都在占用 ...

  3. Redis内存回收:LRU算法

    Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...

  4. redis内存回收

    1.定时过期expilre expire key TTL 10定时器 主动淘汰 2.惰性过期 被动淘汰 3getCommand expireIfNeed() 设置内存上线 set memory 上线 ...

  5. Redis的内存回收原理,及内存过期淘汰策略详解

    Redis 内存回收机制Redis 的内存回收主要围绕以下两个方面: 1.Redis 过期策略:删除过期时间的 key 值 2.Redis 淘汰策略:内存使用到达 maxmemory 上限时触发内存淘 ...

  6. 深入了解Redis(5)-内存回收

    了解redis内存回收之前,需要先了解过期键删除策略. 过期键删除策略 1.定时删除 在设置键的过期时间的同时,创建一个timer,在定时器在键的过期时间到达时,立即执行对键的删除操作.内存友好型策略 ...

  7. redis内存监控与回收

    Redis有自己的内存分配器,当key-value对象被移除时,Redis不会马上向操作系统释放其占用内存.redis之所以这样的设计有两个原因. OS可能会将释放内存交换到虚拟内存,但OS的虚拟内存 ...

  8. Redis 系列(04-2)Redis原理 - 内存回收

    目录 Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 1. 过期策略 1.1 定时过期(主动淘汰) 1.2 惰性过期(被动淘汰) 1.3 定期过期 2. 淘汰策略 2. ...

  9. redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

    一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1 ...

  10. Redis的内存回收机制

    Redis的内存回收机制 2018年01月16日 17:11:48 chs007chs 阅读数:1172   Redis的内存回收机制主要体现在一下两个方面: 删除过期时间的键对象 删除过期键对象 : ...

随机推荐

  1. MVCC(多版本并发控制)详解

    在 MySQL InnoDB存储引擎下,RC.RR 基于 MVCC 进行并发事务控制, MVCC 是基于"数据版本"对并发事务进行访问 用一个例子来解释一下,下面是一张事务执行流程 ...

  2. C# .NET 6 使用WorkFlow Core 创建工作审批流

    1,背景 工作流思想在上世纪60年代就有人提出过:70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现:80年代才出现第一批成功的工作流系统:90年代工作流技术走向了第一个发展高 ...

  3. 知乎x-zse-96逆向分析

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6 ...

  4. 鼠标悬浮显示鼠标停留数据的内容 elementui + vue

    先看效果图 直接上代码 <el-tabs v-model="activeName" @tab-click="handleClick"> <el ...

  5. vue导航固定 吸顶效果

    吸顶效果 如何得到滚动条滚动的距离,document.documentElement.scrollTop 通过onscroll事件来完成滚动事件监听,达到吸顶值后,进行样式更换

  6. [SWPUCTF 2021 新生赛]include

    打开我们可以看到让我们传入一个file,会出现一串代码,我们去分析一下: 当看到ini_set("allow_url_include","on");设置为on, ...

  7. #define 用法解法

    宏的优点是能整理代码 缺点是宏替换来的代码需要人工解除宏后才能暴漏源代码 改底层时候是需要解一解的 它可以做到main函数中只有一个宏字母 这个宏定义时候,定义成了几个函数的源代码 所以main里面就 ...

  8. 实战分析Java的异步编程,并通过CompletableFuture进行高效调优

    一.写在开头 在我们一开始讲多线程的时候,提到过异步与同步的概念,这里面我们再回顾一下: 同步:调用方在调用某个方法后,等待被调用方返回结果:调用方在取得被调用方的返回值后,再继续运行.调用方顺序执行 ...

  9. 牛客小白月赛96(待F)

    比赛链接:牛客小白月赛96 赛时感受 赛时在前面卡的时间有点长,C题没开longlong wa了n发,D题没考虑负数又wa了n发,然后来写E的时候时间就不长了,匆忙写一次交一发. A 思路 当其中一个 ...

  10. .net入行三年的感想回顾

    从21年毕业到现在,还差几天就三年了 工作后才知道,工作年限分为1年以下 .3~5年.5~10年.晋升老板,每段都有每段的故事和总结 回顾下我的前三年工作心路,思考下未来发展之路(emmm,我是觉得我 ...