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

本文涉及的产品
云数据库 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
相关文章
|
5天前
|
存储 缓存 安全
第二章 HTTP请求方法、状态码详解与缓存机制解析
第二章 HTTP请求方法、状态码详解与缓存机制解析
|
5天前
|
缓存 安全 Java
7张图带你轻松理解Java 线程安全,java缓存机制面试
7张图带你轻松理解Java 线程安全,java缓存机制面试
|
2天前
|
NoSQL Redis 缓存
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
【5月更文挑战第17天】Redis常被称为单线程,但实际上其在处理命令时采用单线程,但在6.0后IO变为多线程。持久化和数据同步等任务由额外线程处理,因此严格来说Redis是多线程的。面试时需理解Redis的IO模型,如epoll和Reactor模式,以及其内存操作带来的高性能。Redis使用epoll进行高效文件描述符管理,实现高性能的网络IO。在讨论Redis与Memcached的线程模型差异时,应强调Redis的单线程模型如何通过内存操作和高效IO实现高性能。
28 7
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
|
4天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
6天前
|
缓存 NoSQL 关系型数据库
【Redis】Redis 缓存重点解析
【Redis】Redis 缓存重点解析
15 0
|
6天前
|
存储 NoSQL 关系型数据库
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
16 0
|
6天前
|
缓存 NoSQL 关系型数据库
【Redis】Redis作为缓存
【Redis】Redis作为缓存
8 0
|
6天前
|
消息中间件 缓存 NoSQL
Redis经典问题:缓存雪崩
本文介绍了Redis缓存雪崩问题及其解决方案。缓存雪崩是指大量缓存同一时间失效,导致请求涌入数据库,可能造成系统崩溃。解决方法包括:1) 使用Redis主从复制和哨兵机制提高高可用性;2) 结合本地ehcache缓存和Hystrix限流降级策略;3) 设置随机过期时间避免同一时刻大量缓存失效;4) 使用缓存标记策略,在标记失效时更新数据缓存;5) 实施多级缓存策略,如一级缓存失效时由二级缓存更新;6) 通过第三方插件如RocketMQ自动更新缓存。这些策略有助于保障系统的稳定运行。
291 1
|
6天前
|
存储 消息中间件 缓存
Redis缓存技术详解
【5月更文挑战第6天】Redis是一款高性能内存数据结构存储系统,常用于缓存、消息队列、分布式锁等场景。其特点包括速度快(全内存存储)、丰富数据类型、持久化、发布/订阅、主从复制和分布式锁。优化策略包括选择合适数据类型、设置过期时间、使用Pipeline、开启持久化、监控调优及使用集群。通过这些手段,Redis能为系统提供高效稳定的服务。
|
6天前
|
存储 缓存 监控
利用Redis构建高性能的缓存系统
在现今高负载、高并发的互联网应用中,缓存系统的重要性不言而喻。Redis,作为一款开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。本文将深入探讨Redis的核心特性,以及如何利用Redis构建高性能的缓存系统,并通过实际案例展示Redis在提升系统性能方面的巨大潜力。