iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis缓存更新策略详解
  • 167
分享到

Redis缓存更新策略详解

Redis缓存更新策略Redis缓存更新Redis缓存 2022-07-28 18:07:05 167人浏览 薄情痞子
摘要

本文实例为大家分享了Redis缓存更新策略的具体代码,供大家参考,具体内容如下 一、缓存的收益与成本 1.1 收益 加速读写:因为缓存通常都是全内存的(例如Redis、Memcache),而存储层通常读写性能不够强悍(例

本文实例为大家分享了Redis缓存更新策略的具体代码,供大家参考,具体内容如下

一、缓存的收益与成本

1.1 收益

  • 加速读写:因为缓存通常都是全内存的(例如Redis、Memcache),而存储层通常读写性能不够强悍(例如Mysql),内存读写的速度远远高于磁盘I/O。通过缓存的使用可以有效地加速读写,优化用户体验。
  • 降低后端负载:帮助后端减少访问量(mysql设置有最大连接数,如果大量的访问同时达到数据库,而磁盘I/O的速度又很慢,很容易造成最大连接数被使用完,但Redis 理论最大)和复杂计算(例如很复杂的sql语句),在很大程度降低了后端的负载。

1.2 成本

  • 数据不一致性:缓存层和存储层的数据存在着一定时间窗口的不一致性,时间窗口跟更新策略有关。
  • 代码维护成本:加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维护代码的成本。
  • 运维成本:以Redis Cluster为例,加入后无形中增加了运维成本。

1.3 使用场景

  • 开销大的复杂计算:以MySQL为例子,一些复杂的操作或者计算(例如大量联表操作、一些分组计算),如果不加缓存,不但无法满足高并发量,同时也会给MySQL带来巨大的负担。
  • 加速请求响应:即使查询单条后端数据足够快,那么依然可以使用缓存,以Redis为例子,每秒可以完成数万次读写,并且提供的批量操作可以优化整个io链的响应时间

二、缓存更新策略

2.1 内存溢出淘汰策略

思考:在生产环境的 redis 经常会丢掉一些数据,写进去了,过一会儿可能就没了。是什么原因?

Redis 缓存通常都是全内存,内存是很宝贵而且是有限的,磁盘是廉价而且是大量的。可能一台机器就几十个 G 的内存,但是可以有几个 T 的硬盘空间。Redis 主要是基于内存来进行高性能、高并发的读写操作。那既然内存是有限,比如 redis 就只能用 10G,你要是往里面写了 20G 的数据,会咋办?当然会干掉 10G 的数据,然后就保留 10G 的数据了。那干掉哪些数据?保留哪些数据?当然是干掉不常用的数据,保留常用的数据了。数据明明过期了,怎么还占用着内存?这是由 redis 的过期策略来决定。

在Redis中,当所用内存达到maxmemory上限(used_memory>maxmemory)时会触发相应的溢出控制策略。具体策略受maxmemory-policy参数控制。

Redis支持6种策略:

  • noeviction:默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息(error)OOM command not allowed when used memory,此时Redis只响应读操作
  • volatile-lru:根据LRU算法删除设置了超时属性(expire)的键,直到腾出足够空间为止。如果没有可删除的键对象,回退到noeviction策略
  • volatile-random:随机删除过期键,直到腾出足够空间为止
  • allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止
  • allkeys-random:随机删除所有键,直到腾出足够空间为止(不推荐)
  • volatile-ttl:根据键值对象的ttl(剩余时间(time to live,TTL) )属性,删除最近将要过期数据。如果没有,回退到noeviction策略

LRU :Least Recently Used ,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。       

内存溢出控制策略可以采用config set maxmemory-policy{policy}动态配置。写命令导致当内存溢出时会频繁执行回收内存成本很高,在主从复制架构中,回收内存操作对应的删除命令会同步到从节点来,来保障主从节点数据一致性,从而导致写放大的问题。

2.2 过期策略

Redis 服务端采用的 过期策略是 : 惰性删除 + 定期删除

惰性删除: 

Redis的每个库都有一个过期字典,过期字典中保存所有key的过期时间。当客户端读取一个key时会先到过期字典内查询key是否已经过期,如果key已经超过,会执行删除操作并返回空。这种策略是出于节省CPU成本考虑,但是单独用这种方式存在内存泄露的问题,当过期键一直没有访问将无法得到及时删除,从而导致内存不能及时释放。

Redis缓存更新策略详解

定时删除:

Redis内部维护一个定时任务,默认每秒运行10次过期扫描(通过 redis.conf 中通过 hz 配置 修改运行次数),扫描并不是遍历过期字典中的所有键,而是采用了自适应算法,根据键的过期比例、使用快慢两种速率模式回收键:

1.从过期字典中随机取出 20 个键
2.删除这 20 个键中过期的键
3.如果过期键的比例超过 25% ,重复步骤 1 和 2

为了保证扫描不会出现循环过度,一直在执行定时删除定时任务无法对外提供服务,导致线程卡死现象,还增加了扫描时间的上限,默认是 25 毫秒(即默认在慢模式下,25毫秒还未执行完,切换为块模式,模式下超时时间为1毫秒且2秒内只能运行1次,当慢模式执行完毕正常退出,会重新切回快模式)

Redis缓存更新策略详解

三、应用方更新

1.应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
2.先删除缓存,再更新数据库:这个操作有一个比较大的问题,更新数据的请求在对缓存删除完之后,又收到一个读请求,这个时候由于缓存被删除所以直接会读库,读操作的数据是老的并且会被加载进入缓存当中,后续读请求全部访问的老数据。
3.先更新数据库,再删除缓存(推荐)为什么不是写完数据库后更新缓存?主要是怕两个并发的写操作导致脏数据。

四、缓存粒度

1  通用性

缓存全部数据比部分数据更加通用,但从实际经验看,很长时间内应用只需要几个重要的属性。

2 占用空间

缓存全部数据要比部分数据占用更多的空间,存在以下问题:

  • 全部数据会造成内存的浪费。
  • 全部数据可能每次传输产生的网络流量会比较大,耗时相对较大,在极端情况下会阻塞网络。
  • 全部数据的序列化和反序列化的CPU开销更大。

3 代码维护

全部数据的优势更加明显,而部分数据一旦要加新字段需要修改业务代码,而且修改后通常还需要刷新缓存数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文档:

--结束END--

本文标题: Redis缓存更新策略详解

本文链接: https://www.lsjlt.com/news/33493.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis缓存更新策略详解
    本文实例为大家分享了Redis缓存更新策略的具体代码,供大家参考,具体内容如下 一、缓存的收益与成本 1.1 收益 加速读写:因为缓存通常都是全内存的(例如Redis、Memcache),而存储层通常读写性能不够强悍(例...
    99+
    2022-07-28
    Redis缓存更新策略 Redis缓存更新 Redis缓存
  • 浅谈Redis缓存更新策略
     内存淘汰超时剔除主动更新说明不用自己维护,利用Redis的内存淘汰机制,当内存不足时自动淘汰部分数据。下次查询时更新缓存给缓存数据添加TTL时间,到期后自动删除缓存,下次...
    99+
    2022-11-13
    redis缓存策略 redis缓存更新策略 redis缓存更新机制
  • Redis缓存策略超详细讲解
    目录Redis缓存中间件缓存是什么缓存的优点缓存的缺点Redis缓存已查询数据redis缓存中间件实践缓存更新缓存更新的三个策略主动更新策略的三种方案主动更新的代码实现Redis缓存...
    99+
    2022-11-13
  • JuiceFS 缓存策略详解
    对于一个由对象存储和数据库组合驱动的文件系统,缓存是本地客户端与远端服务之间高效交互的重要纽带。读写的数据可以提前或者异步载入缓存,再由客户端在后台与远端服务交互执行异步上传或预取数据。相比直接与远端服务交互,采用缓存技术可以大大降低存储...
    99+
    2014-10-24
    JuiceFS 缓存策略详解
  • MySQL缓存策略详解
    MySQL缓存方案 一、MySQL缓存方案目的分析1.1、缓存层的作用1.2、缓存层选择1.3、场景分析 二、提升MySQL访问性能的方式2.1、MySQL主从复制2.2、读写分离2.3、连接池2.4、异步连接 三、redi...
    99+
    2023-08-25
    mysql 缓存 数据库 innodb lua
  • MySQL数据库和Redis缓存一致性的更新策略
    目录一、更新策略二、读写缓存1、同步直写策略2、异步缓写策略三、双检加锁策略四、数据库和缓存一致性的更新策略1、先更新数据库,再更新Redis2、先更新缓存,再更新数据库3、先删除缓存,再更新数据库延时双删4、先更新数据...
    99+
    2023-04-12
    MySQL和Redis缓存一致性更新 MySQL和Redis缓存一致性
  • 缓存服务的更新策略有哪些?
    在互联网项目开发中,缓存的应用是非常普遍了,缓存可以帮助页面提高加载速度,减少服务器或数据源的负载。 1、为什么需要缓存 一般在项目中,最消耗性能的地方就是后端服务的数据库了。而数据库的读写频...
    99+
    2022-10-18
  • redis缓存策略有哪些
    小编给大家分享一下redis缓存策略有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!将Redis用作缓存时, 如果内存空间用...
    99+
    2022-10-18
  • MySQL数据库和Redis缓存一致性的更新策略是什么
    这篇文章主要介绍“MySQL数据库和Redis缓存一致性的更新策略是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL数据库和Redis缓存一致性的更新策略是什么”文章能帮助大家解决问题。...
    99+
    2023-07-06
  • Redis三种常用的缓存读写策略步骤详解
    目录一、Redis三种常用的缓存读写策略二、旁路缓存模式(Cache Aside Pattern)读写步骤写:读:自我思考缺点三、读写穿透(Read/Write Through Pa...
    99+
    2022-11-13
  • PHP开发缓存的数据存储与更新策略
    PHP开发缓存的数据存储与更新策略,需要具体代码示例在Web应用程序中,缓存是提高性能和响应速度的重要工具。缓存可以大大减少资源获取的时间和响应的延迟,从而提高系统的效率和用户的满意度。在PHP开发中,缓存技术的应用和优化是非常重要的,本文...
    99+
    2023-11-07
    缓存 数据存储 PHP开发
  • Redis安全策略详解
    目录缓存穿透缓存击穿缓存雪崩布隆过滤器基于布隆过滤器解决缓存穿透问题缓存穿透 高并发情况下查询一个不存在的key 产生的背景(原因): 缓存穿透是指使用不存在的key进行大量的高并发查询,导致缓存无法命中,每次请求都要都...
    99+
    2022-07-27
    Redis安全 Redis安全策略
  • 关于Redis的内存淘汰策略详解
    目录一、什么是内存淘汰?二、Redis 内存上限三、Redis 内存淘汰策略四、内存淘汰的具体工作步骤五、LRU 算法及在 Redis 中的改进5.1 LRU 算法5.2 Redis 中的 LRU 算法六、LFU一、什么...
    99+
    2023-05-19
    Redis 策略 Redis 内存淘汰
  • Redis缓存的淘汰策略是什么
    这篇文章主要讲解了“Redis缓存的淘汰策略是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis缓存的淘汰策略是什么”吧!Redis(Remote...
    99+
    2022-10-18
  • 如何在Java中实现高效的缓存更新策略?
    Java作为一种广泛使用的编程语言,其缓存机制是一个不可或缺的部分。在实现高效的缓存更新策略时,我们需要考虑多种因素,如缓存的大小、缓存的存储方式以及缓存的更新频率等等。本文将为您介绍如何在Java中实现高效的缓存更新策略,以提高应用程序的...
    99+
    2023-10-05
    缓存 分布式 编程算法
  • Redis中怎么使用缓存替换策略
    Redis中怎么使用缓存替换策略,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1 概述在操作系统的页面管理中,内存会维护一部分数据以备进程使用,但是由于内存的大小必然是远远...
    99+
    2023-06-20
  • Redis缓存中的淘汰策略有哪些
    本篇内容主要讲解“Redis缓存中的淘汰策略有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis缓存中的淘汰策略有哪些”吧!我们知道Redis缓存使用...
    99+
    2022-10-18
  • 浅谈Redis缓存有哪些淘汰策略
    目录Redis过期策略 定时删除 惰性删除 定期删除 Redis的内存淘汰机制 LRU和LFU的区别 LRU LFU Redis重启如何恢复数据呢? 总结Redis过期策略 我们首...
    99+
    2022-11-12
  • Redis 缓存淘汰策略和事务实现乐观锁详情
    目录缓存淘汰策略标题LRU原理标题Redis缓存淘汰策略设置最大缓存淘汰策略Redis事务Redis事务介绍MULTIEXECDISCARDWATCHRedis 不支持事务回滚(为什...
    99+
    2022-11-13
  • Redis 缓存淘汰策略和事务实现乐观锁详情
    目录缓存淘汰策略标题LRU原理标题Redis缓存淘汰策略设置最大缓存淘汰策略Redis事务Redis事务介绍MULTIEXECDISCARDWATCHRedis 不支持事务回滚(为什么呢)Redis乐观锁Redis乐观锁...
    99+
    2022-07-21
    Redis 缓存淘汰策略 Redis 事务实现乐观锁
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作