一、Redis设置过期时间

Redis有四个不同的命令可以用于设置键的生存时间:

  • EXPIRE<key><ttl>命令用于将键key的生存时间设置为ttl秒。
  • PEXPIRE<key><ttl>命令用于将键key的生存时间设置为ttl毫秒。
  • EXPIREAT<key><timestamp>命令用于将键key的过期时间设置为timestamp所指定的秒数时间戳。
  • PEXPIREAT<key><timestamp>命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳。

实际上EXPIRE、PEXPIRE、EXPIREAT三个命令都是使用PEXPIREAT命令来实现的。

PERSIST key , 设置key 永不过期。

二、Redis的过期策略

1、定时过期

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

2、惰性过期

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

3、定期过期

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

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

Redis中同时使用了惰性过期和定期过期两种过期策略

三、Redis的8种内存淘汰策略

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。

  • 1)noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
  • 2)allkeys-lru:从所有key中使用LRU算法进行淘汰
  • 3)volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
  • 4)allkeys-random:从所有key中随机淘汰数据
  • 5)volatile-random:从设置了过期时间的key中随机淘汰
  • 6)volatile-ttl:在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰
  • 7)volatile-lfu:4.0版本新增,当内存不足以容纳新写入数据时,在过期的key中,使用LFU算法进行删除key。
  • 8)allkeys-lfu:4.0版本新增,当内存不足以容纳新写入数据时,从所有key中使用LFU算法进行淘汰;

注:
1)使用volatile-lru、volatile-random、volatile-ttl这三种策略时,如果没有key可以被淘汰,则和noeviction一样返回错误;
2)4.x 后支持LFU策略,最少频率使用
3)redis支持运行时通过命令动态修改内存大小:
127.0.0.1:6379> config set maxmemory 100mb

LRU与LFU

LRU(Least recently used,最近最少使用)
LRU算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
基本思路
新数据插入到列表头部;
每当缓存命中(即缓存数据被访问),则将数据移到列表头部;
当列表满的时候,将列表尾部的数据丢弃。

LFU(Least Frequently Used 最少频率使用)
它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。
LFU需要定期衰减。

四、Redis 的持久化机制

为了避免数据丢失了,Redis提供了RDBAOF两种持久化机制,即把数据保存到磁盘。

1、RDB快照持久化(redis默认)

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

RDB触发机制主要有以下几种:

  • 手动触发(一般不会用):
    save:同步,会阻塞当前redis服务
    bgsave :异步,redis进程执行fork操作创建子进程
  • 自动触发:
    save m n (m秒内数据集存在n次修改,自动触发bgsave)

RDB 的优点:

  • RDB 在恢复大数据集时,速度比 AOF 的恢复速度要快。 适合大规模的数据恢复场景,如备份,全量复制等。
  • RDB可以最大化Redis的性能。
    因为父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无需执行任何磁盘I/O操作。但是如果数据集比较大的时候,fork可以能比较耗时,造成服务器在一段时间内停止处理客户端的请求。

RDB缺点:

  • 没办法做到实时持久化/秒级持久化。
  • 新老版本存在RDB格式兼容问题
2、AOF追加文件持久化

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

AOF的优点:

  • 数据的一致性和完整性更高

AOF的缺点:

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

redis可以通过配置项开启AOF机制,如下:

# 可以通过修改redis.conf配置文件中的appendonly参数开启
appendonly yes
# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。
dir ./
# 默认的文件名是appendonly.aof,可以通过appendfilename参数修改
appendfilename appendonly.aof

AOF的工作流程:

(1)所有的写入命令会追加(append)到aof_buf(缓冲区)中。
(2)AOF缓冲区根据对应的策略向硬盘做同步(sync)操作。
(3)随着AOF文件越来越大,需要定期对AOF文件进行重写(rewrite),达到压缩的目的。
(4)当Redis服务器重启时,可以加载AOF文件进行数据恢复(load)。

3、AOF和RDB都开启

redis允许我们同时使用两种机制,即使AOF和RDB都开启了,redis重启的时候,也是优先通过AOF进行数据恢复的,因为aof数据比较完整。

通常情况下我们会设置AOF机制为everysec 每秒写入,则最坏仅会丢失一秒内的数据。

注:如果先开启了RDB,再开启AOF,RDB先执行了持久化,那么RDB文件中的内容会被AOF覆盖掉。

redis过期策略及持久化机制相关推荐

  1. redis过期策略和持久化

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

  2. redis过期策略和淘汰机制你知道多少?

    关注微信公众号"虾米聊吧",每天更新一篇技术文章,文章内容涵盖架构师成长必经之路应掌握的技术,一起学习,一起交流. 开篇提问:你是否遇到过生产环境redis丢数据的问题?比如你刚刚 ...

  3. 【Redis过期策略/内存淘汰机制/对过期Key的处理】

    我是

  4. @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...

    大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...

  5. Redis过期策略与内存淘汰机制

    参考博客:https://blog.csdn.net/u010006156/article/details/124914082 Redis过期策略与内存淘汰机制 过期策略简介 作用 redis数据都是 ...

  6. 阿里Java岗二面:Redis了解?说说持久化机制及RDB/AOF应用场景分析

    Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 文章主要包含二个 ...

  7. redis 过期策略

    redis 过期策略是:定期删除+惰性删除. 所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除. 假设 redis 里放 ...

  8. Redis 过期策略和淘汰策略

    1.Redis 过期策略 Redis 过期策略用于处理设置了缓存时间的数据,使用定时扫描和惰性删除机制删除到期的缓存数据. Redis 将设置了过期时间的 key 保存在一个独立的字典中,定时扫描就是 ...

  9. redis过期策略与淘汰策略

    redis过期策略与淘汰策略 1.过期策略 2.淘汰策略 3.在哪里配置? 4.Lazy Free 1.过期策略 1.redis中所有的key都可以通过expire命令来设置过期时间,所有被设置了过期 ...

  10. Redis基本数据类型、持久化机制、集群模式、淘汰策略、缓存穿透、击穿、雪崩、常见面试题大集合!

    redis redis reids的常用数据类型 1.String 2.Hash 3.List 5.Sorted Set(ZSet) 6.其他 发布(pub)订阅模式(sub)模式 作用 Redis的 ...

最新文章

  1. 如何开发一个npm包并发布
  2. 验证redis的主从复制
  3. wine和steam的区别
  4. 95-290-382-源码-内存管理-Buffer-Flink运行时之统一的数据交换对象
  5. php5.2、5.3和5.4,Apache多虚拟主机多版本PHP(5.2+5.3+5.4)共存运行配置
  6. 2018-2019-1 20165202 20165210 20165214 实验二 固件程序设计
  7. Qt5学习笔记之串口助手三:打包成Windows软件
  8. QTouch手机组态软件APP
  9. 2010年06期《程序员》配套源码及相关链接
  10. hdu1175连连看
  11. 2022智源大会议程丨类脑计算前沿与挑战
  12. 怎样将pdf文件页面旋转
  13. 【电子电路计算公式】 导线流过电流计算工具,我已经做成一个小工具了(源代码)
  14. html文件的启示标记,某html学习心得分享.ppt
  15. 基于单片机的电子时钟设计(keil+protues仿真,含代码及原理图)
  16. 如何做一个员工管理系统
  17. ACL(用访问控制列表实现包过滤)
  18. Word文档一行分别左右对齐
  19. 8k电视和4k电视的区别 8k电视和4k电视哪个更实用
  20. 读标准03-IEEE1451.5标准协议尝鲜实现

热门文章

  1. Android 数独游戏开发,强逻辑的梳理
  2. php 网页对话框插件,JavaScript_jquery插件hiAlert实现网页对话框美化,厌烦了IE浏览器的警告窗,伴 - phpStudy...
  3. Elastic Job定时任务
  4. WIFI 2.4G及5G信道一览表
  5. 为什么现在微信附近人“没人”了
  6. 【WPS表格】从身份证号码提取各种信息,如出生日期、年龄、性别、户籍所在地
  7. OPPO K9 Pro刷root强解锁BL刷面具Magisk框架 oppo k9pro root教程
  8. 计算机网络概论简单题,第一章计算机网络概述练习题
  9. 人工智能简史—学习笔记
  10. Vue 动态加载子组件