Redis学习笔记-缓存容量和淘汰机制核心思想

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis学习笔记-缓存容量和淘汰机制核心思想

通常服务器 内存 的价格成本要比相同空间大小的磁盘价格高出几倍,为了保证高的性价比,缓存的空间容量要比后端数据总量要小,通常 80% 的请求实际只访问了 20% 的数据,所以合理设置缓存容量很重要(土豪不在乎除外),在有限的内存情况下,Redis 提供了 8 中淘汰数据的策略,这篇文章来学习一下缓存容量和数据淘汰机制的思想。

1.笔记图

2.Redis作为缓存需要思考的问题


  • Redis 缓存是怎么工作的?
  • Redis 缓存满了怎么办?
  • 为什么有缓存一致性、缓存穿透、缓存雪崩、缓存击穿等异常,如何应对?
  • Redis 的内存毕竟有限,可以使用快速固态硬盘保存吗?

3.缓存的特征

  • 在一个层次化的系统中,缓存一定是一个快速子系统,数据存在缓存中时,能避免每次从慢速子系统中存取数据。对应到互联网应用来说,Redis 就是快速子系统,而数据库就是慢速子系统了
  • 缓存系统的容量大小总是小于后端慢速系统的,我们不可能把所有数据都放在缓存系统中

4.Redis缓存请求处理的两种情况

  • 缓存命中Redis 中有相应数据,直接读取 Redis,非常快
  • 缓存缺失
  • Redis 中没有保存相应数据,需从后端数据库读取数据,性能会变慢
  • 一旦缓存缺失,后续请求若要读到数据,需把缺失的数据写入 Redis,这过程叫作缓存更新

5.Redis缓存类型

  • 只读缓存:所有的数据写请求,会直接发往后端的数据库,如果 Redis 已经缓存了相应的数据,应用需要把这些缓存的数据删除,当应用再次读取这些数据时,会发生缓存缺失,应用会把这些数据从数据库中读出来,并写到缓存中
  • 读写缓存
  • 读写缓存除了读请求会发送到缓存,写请求也会发送到缓存
  • 在使用读写缓存时,最新的数据在 Redis 中,一旦出现掉电或宕机,内存中的数据就会丢失

6.两种写回策略

  • 同步直写:写请求发给缓存的同时,也会发给后端数据库进行处理,等到缓存和数据库都写完数据,才给客户端返回,同步直写策略优先保证数据可靠性,增加了缓存的响应延迟
  • 异步写回:优先提供快速响应,所有写请求都先在缓存中处理,等到这些增改的数据要被从缓存中淘汰出来时,缓存将它们写回后端数据库

7.缓存设置多大容量

  • 二八原理:有 20% 的缓存数据贡献了 80% 的访问,把缓存空间容量设置为总数据量的 20% 的话,就有可能拦截到 80% 的访问
  • 业界研究成果
  • 近年来,有些研究人员专门对互联网应用(例如视频播放网站)中,用户请求访问内容的分布情况做过分析
  • 20% 的数据不一定能贡献 80% 的访问量,不能简单地按照 总数据量的 20% 来设置缓存最大空间容量,需要结合应用数据实际访问特征和成本开销来综合考虑
  • 大容量缓存是能带来性能加速的收益,但是成本也会更高,而小容量缓存不一定就起不到加速访问的效果。一般来说,建议把缓存容量设置为总数据量的 15%30%,兼顾访问性能和内存空间开销

8.LRU核心思想

  • 淘汰规则:链头(LRU端)数据最先被淘汰,链尾(MRU端)最后被淘汰
  • 新增元素:将其放于链尾,链尾的数据不容易被淘汰,并且插入之前需要判断一下空间是否已满,如果满了需要将链头的数据淘汰
  • 获取元素:如果没有在链表中命中,就返回 -1,如果命中,就将其移动到链表尾部
  • 节点定义
class Node{
Object data; //元素值
Node pre; //前指针
Node next; //后指针
}

9.LFU核心思想

  • 淘汰规则:如果数据在最近一段时间很少被访问到,可以认为在将来它被访问的可能性也很小。当空间满时,最小频率访问的数据最先被淘汰
  • 新增元素:将记录 (key,value) 插入该结构。缓存满时,将访问频率最低的数据置换掉
  • 获取元素:返回 key 对应的 value
  • 实现思路
  • LFU 会淘汰访问频率最小的数据,需要一种合适的方法按大小顺序维护数据访问的频率
  • LFU 算法本质上可以看做是一个 top K 问题(选出频率最小的元素)
  • 可以用最小堆+哈希表实现

10.Redis淘汰策略

  • noeviction 策略:一旦缓存被写满了,再有写请求来时,Redis 不再提供服务,而是直接返回错误
  • volatile-random 策略:在设置了过期时间的键值对中,进行随机删除
  • volatile-ttl 策略:在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除
  • volatile-lru 策略:会使用 LRU 算法筛选设置了过期时间的键值对
  • volatile-lfu 策略:会使用 LFU 算法选择设置了过期时间的键值对
  • allkeys-random 策略:从所有键值对中随机选择并删除数据
  • allkeys-lru 策略:使用 LRU 算法在所有数据中进行筛选
  • allkeys-lfu 策略:使用 LFU 算法在所有数据中进行筛选

11.Redis中的LRU简化

  • Redis 默认会记录每个数据的最近一次访问的时间戳(由键值对数据结构 RedisObject 中的 lru 字段记录)
  • Redis 在决定淘汰的数据时,第一次会随机选出 N 个数据,把它们作为一个候选集合
  • Redis 会比较这 N 个数据的 lru 字段,把 lru 字段值最小的数据从缓存中淘汰出去
  • 当需要再次淘汰数据时,Redis 需要挑选数据进入第一次淘汰时创建的候选集合,能进入候选集合的数据的 lru 字段值必须小于候选集合中最小的 lru
  • 命令设置:
#让 Redis 选出 100 个数据作为候选数据集
CONFIG SET maxmemory-samples 100

12.优化建议

  • 优先使用 allkeys-lru 策略:可以充分利用 LRU 这一经典缓存算法的优势,把最近最常访问的数据留在缓存中,提升应用的访问性能
  • 如果业务应用中的数据访问频率相差不大,没有明显的冷热数据区分,建议使用 allkeys-random 策略,随机选择淘汰的数据就行
  • 如果业务中有置顶的需求,如置顶新闻、置顶视频,可以使用 volatile-lru 策略,同时不给这些置顶数据设置过期时间。这些需要置顶的数据一直不会被删除,而其他数据会在过期时根据 LRU 规则进行筛选


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
19天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
164 85
|
16天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
|
2月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
2月前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
1月前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
33 1
|
1月前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
67 4
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
46 5
|
存储 缓存 NoSQL
Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存|学习笔记
快速学习 Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存
Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存|学习笔记
|
缓存 NoSQL 安全
6.0Spring Boot 2.0实战 Redis 分布式缓存6.0|学习笔记
快速学习6.0Spring Boot 2.0实战 Redis 分布式缓存6.0。
344 0
6.0Spring Boot 2.0实战 Redis 分布式缓存6.0|学习笔记
|
缓存 NoSQL Redis
首页数据显示-添加 redis 缓存(3)| 学习笔记
快速学习 首页数据显示-添加 redis 缓存(3)
158 0
首页数据显示-添加 redis 缓存(3)| 学习笔记