Redis的过期淘汰策略

Redis的过期策略

我们在set key的时候,可以给它设置一个过期时间,比如expire key 60。指定这key60s后过期,60s后,redis是如何处理的嘛?我们先来介绍几种过期策略:

定时过期

每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

惰性过期

只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

定期过期

每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。

Redis中同时使用了惰性过期和定期过期两种过期策略。
假设Redis当前存放30万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负 载会特别高,最后可能会挂掉。
因此,redis采取的是定期过期,每隔100ms就随机抽取一定数量的key来检查和删除的。
但是呢,最后可能会有很多已经过期的key没被删除。这时候,redis采用惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。

但是呀,如果定期删除漏掉了很多过期的key,然后也没走惰性删除。就会有很多过期key积在内存内存,直接会导致内存爆的。或者有些时候,业务量大起来了,redis的key被大量使用,内存直接不够了,运维小哥哥也忘记加大内存了。难道redis直接这样挂掉?不会的!Redis用8种内存淘汰策略保护自己~

Redis 内存淘汰策略

**volatile-lru:**当内存不足以容纳新写入数据时,从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰;
**allkeys-lru:**当内存不足以容纳新写入数据时,从所有key中使用LRU(最近最少使用)算法进行淘汰。
**volatile-lfu:**4.0版本新增,当内存不足以容纳新写入数据时,在过期的key中,使用LFU算法进行删除key。
**allkeys-lfu:**4.0版本新增,当内存不足以容纳新写入数据时,从所有key中使用LFU算法进行淘汰;
**volatile-random:**当内存不足以容纳新写入数据时,从设置了过期时间的key中,随机淘汰数据;。
**allkeys-random:**当内存不足以容纳新写入数据时,从所有key中随机淘汰数据。
**volatile-ttl:**当内存不足以容纳新写入数据时,在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰;
**noeviction:**默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。

说说Redis的常用应用场景

     **缓存****排行榜****计数器应用****共享Session****分布式锁****社交网络****消息队列****位操作**

(1)缓存

我们一提到redis,自然而然就想到缓存,国内外中大型的网站都离不开缓存。合理的利用缓存,比如缓存热点数据,不仅可以提升网站的访问速度,还可以降低数据库DB的压力。并且,Redis相比于memcached,还提供了丰富的数据结构,并且提供RDB和AOF等持久化机制,强的一批。

(2)排行榜

 当今互联网应用,有各种各样的排行榜,如电商网站的月度销量排行榜、社交APP的礼物排行榜、小程序的投票排行榜等等。Redis提供的zset数据类型能够实现这些复杂的排行榜。

1.用户Jay上传一个视频,获得6个赞,可以酱紫:

zadd user:ranking:2021-03-03 Jay 3

2.过了一段时间,再获得一个赞,可以这样:

zincrby user:ranking:2021-03-03 Jay 1

3.如果某个用户John作弊,需要删除该用户:

zrem user:ranking:2021-03-03 John

4.展示获取赞数最多的3个用户

zrevrangebyrank user:ranking:2021-03-03 0 2

(3)计数器应用

各大网站、APP应用经常需要计数器的功能,如短视频的播放数、电商网站的浏览数。这些播放数、浏览数一般要求实时的,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。

(4)共享Session

如果一个分布式Web服务将用户的Session信息保存在各自服务器,用户刷新一次可能就需要重新登录了,这样显然有问题。实际上,可以使用Redis将用户的Session进行集中管理,每次用户更新或者查询登录信息都直接从Redis中集中获取。

(5)分布式锁

几乎每个互联网公司中都使用了分布式部署,分布式服务下,就会遇到对同一个资源的并发访问的技术难题,如秒杀、下单减库存等场景。

用synchronize或者reentrantlock本地锁肯定是不行的。
如果是并发量不大话,使用数据库的悲观锁、乐观锁来实现没啥问题。
但是在并发量高的场合中,利用数据库锁来控制资源的并发访问,会影响数据库的性能。
实际上,可以用Redis的setnx来实现分布式的锁。

(6) 社交网络

赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适保存 这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。

(7)消息队列

消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。

(8) 位操作

用于数据量上亿的场景下,例如几亿用户系统的签到,去重登录次数统计,某用户是否在线状态等等。腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需要的内存会很恐怖,而且这种类似的需求很多。这里要用到位操作——使用setbit、getbit、bitcount命令。原理是:redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统。

Redis 的持久化机制有哪些?优缺点说说

Redis是基于内存的非关系型K-V数据库,既然它是基于内存的,如果Redis服务器挂了,数据就会丢失。为了避免数据丢失了,Redis提供了持久化,即把数据保存到磁盘。
Redis提供了RDB和AOF两种持久化机制,它持久化文件加载流程如下:

RDB

RDB,就是把内存数据以快照的形式保存到磁盘上。

什么是快照?可以这样理解,给当前时刻的数据,拍一张照片,然后保存下来。

RDB持久化,是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。执行完操作后,在指定目录下会生成一个dump.rdb文件,Redis 重启的时候,通过加载dump.rdb文件来恢复数据。RDB触发机制主要有以下几种:

RDB 的优点

适合大规模的数据恢复场景,如备份,全量复制等

RDB缺点

没办法做到实时持久化/秒级持久化。
新老版本存在RDB格式兼容问题

AOF
AOF(append only file) 持久化,采用日志的形式来记录每个写操作,追加到文件中,重启时再重新执行AOF文件中的命令来恢复数据。它主要解决数据持久化的实时性问题。默认是不开启的。

AOF的工作流程如下:


AOF的优点

数据的一致性和完整性更高
AOF的缺点

AOF记录的内容越多,文件越大,数据恢复变慢。

Redist过期策略、应用、持久化相关推荐

  1. Redis学习笔记(四):过期策略、持久化、事件

    图片来自<Redis设计与实现> Redis数据库 redis.server中redisServer.dbnum用于初始化生成多少个数据库,默认16个,Select命令选择数据库 redi ...

  2. redis过期策略和持久化

    Redis过期策略 注:本文主要参考自<Redis设计与实现> 1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, in ...

  3. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

  4. redis同步效率秒_redis过期策略、内存淘汰策略、持久化方式、主从复制

    一.Redis的过期策略以及内存淘汰策略: 1.过期策略:定期删除+惰性删除: ①定期删除:redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除.注意这里 ...

  5. Redis的持久化机制、过期策略、淘汰策略

    文章目录 一.持久化机制 1. RDB机制 2. AOF机制 RDB的优缺点 AOF的优缺点 持久化机制选择 二.过期策略 常见过期策略 Redis过期策略 1. 定期删除 2. 惰性删除 RDB对过 ...

  6. Reds 过期策略 内存淘汰策略 持久化策略

    过期策略 定期删除 redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定期遍历这个字典来删除到期的 key. 定期删除策略 Redis 默认会每秒进行十次过期扫描(100ms ...

  7. Redis第一讲:相关的基础知识/数据类型/缓存的过期策略/双写一致性/内存存储和持久化

    Redis第一讲:相关的基础知识 摘要:本文是Redis(6.2.1)详解的第一讲,介绍Redis相关的基础知识,内存存储和持久化,Redis作缓存使用时的注意要点,常见的数据类型,缓存的过期策略,R ...

  8. Redis和Memcached:数据类型 过期策略 持久策略 虚拟内存 Value大小

    1.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash.bitmaps.hyperloglog.geo  2.虚拟内存Redis当物理内存用完时,可以将一些很久没用到的v ...

  9. 第九章 Redis过期策略

    注:本文主要参考自<Redis设计与实现> 1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, ...

最新文章

  1. GitHub 热门:机器学习 100 天!
  2. stm8s开发(七) SPI的使用:SPI主机通信!
  3. python字符串与文本处理技巧(3):字符剔除、字符对齐、字符拼接、字符插入变量
  4. Bootstrap的form-group form-control input-group button-group
  5. Pytorch(三) --反向传播
  6. 蓝桥杯2015初赛-饮料换购-枚举
  7. python 实现组合数
  8. python漂亮的螺旋_CANVAS 各种螺旋画出来的漂亮图案
  9. linux 命令 语法,linux常用命令及语法
  10. Hibernate学习笔记--导航
  11. 全站HTTPS底层实现原理
  12. 使用Python可以做些什么
  13. EZ 2018 06 17 NOIP2018 模拟赛(十九)
  14. Kickstarter 开源其 Android 和 iOS 应用
  15. 移植 libuv 到 Visual C++ 6.0 并支持在 Windows XP 系统下编译
  16. DB9串口定义及含义
  17. NestJS生成二维码
  18. Matlab GUI编程技巧(十八)【实战一】:自定义线条图像绘制
  19. Word 2007 XML 解压缩格式
  20. 基于Java的Minecraft游戏后端自定义插件 01客户端服务端

热门文章

  1. hadoop 常用环境变量及使用
  2. python-selenium登陆今日头条
  3. 光电二极管的采样电路
  4. 向世界问好,.NET 5 从 Fur 框架开始,v1.0.0.rc2 发布
  5. 苹果5s现在还能用吗_苹果抛弃英特尔,现在又抛弃微软,你的黑苹果电脑到底能用多久?...
  6. oracle增加表空间文件
  7. mr.Xiong使用jQuery实现电影排行榜的效果
  8. 常用的CSSreset
  9. 你用什么作为app应用的后台服务?
  10. 不可忽视!中国“新四大发明”正改变世界