1、说明

生存时间: (Time To Live, TTL),经过指定的秒/毫秒之后,服务器自动删除TTL为0的key

过期时间: (expire time),时间戳,表示一个具体时间点,到这个时间点后,服务器会删除key

2、指令

设置生存时间:

EXPIRE key ttl	#设置ttl,s
PEXPIRE key ttl #设置ttl,ms

设置过期时间:

EXPIREAT key timestamp	#设置expire time,s
PEXPIREAT key timestamp #设置exprie time,ms

以上四种命令虽然各有不同,但是其底层都是使用 PEXPIREAT 实现的

2.1、删除和更新

PERSIST key	#移除生存时间

DLE 命令可以删除key,也会删除其生存时间

SETGETSET 命令也可以覆写生存时间

3、过期时间的保存

redisDb结果的expires字典中保存了数据库中的所有key的过期时间,redisDb的声明如下:

/* Redis database representation. There are multiple databases identified
* by integers from 0 (the default database) up to the max configured
* database. The database number is the 'id' field in the structure. */
//每个数据库都是一个redisDb,id为数据库编号
typedef struct redisDb {
dict *dict; //键空间,保存了数据中所有键值对
dict *expires; //过期字典,保存了数据库中所有键的过期时间
dict *blocking_keys;
dict *ready_keys;
dict *watched_keys;
struct evictionPoolEntry *eviction_pool;
int id; /* Database ID */
long long avg_ttl; /* Average TTL, just for stats */
} redisDb;

expires 的键是一个指针,指向某个键对象,值是一个 long long 类型整数,保存了过期时间,是一个毫秒精度的UNIX时间戳

可见,过期时间的保存是使用key来作为关联的,所以操作用,修改key均可以修改过期时间,而只修改key的value,是不是改变其过期时间的

4、计算剩余生存时间

TTL key #计算key的剩余生存时间,s
PTTL key #计算key的剩余生存时间,ms

底层的处理方式也很简单,获取key的生存时间戳,减去当前时间戳即可

如果键不存在,则返回-2

如果键没有设置过期时间,则返回-1

同样可以使用此方法判断key是否过期,TTL/PTTL 结果小于0,则表示过去,大于0,则表示未过期

5、过期键的删除策略

策略有三种:

  1. 定时删除:设置键的过期时间的同时,设置一个定时器,来删除键
  2. 惰性删除:放任过期键不管,每次从键空间取值时,检查是否过期,以决定是否删除;
  3. 定期删除:每隔一段时间,进行一次数据库检查,删除里面的过期键,至于,要删除多少过期键,以及要检查多少数据库,由算法决定;

5.1、定时删除

对内存友好,保证键尽可能在失效时立即删除;

对CPU不友好,过期键比较多时,删除可能会占用一部分CPU时间,影响,服务器的响应时间和吞吐量;

Redis 中创建定时器需要使用Redis的时间事件(实现方式是无序链表,查找的时间复杂度为O(N)),大量事件处理时效率太低

5.2、惰性删除

对CPU最友好,只有在取键的值时才处理;

对内存不友好,过期键如果长时间没有被操作,则过期键仍然会占用内存,大量的无用数据占用内存,可以认为是一种内存泄漏;

Redis 的惰性删除策略由 db.c/expireIfNeeded 函数实现,所有读写Redis的命令在执行之前都会调用expireIfNeeded 函数

5.3、定期删除

定期删除是定时删除和惰性删除的一种折中方式,其难点是确定删除操作执行的时长和频率

Redis 的定期删除策略由 db.c/activeExpireCycle 函数实现,每当 Reids 周期性操作 redis.c/serverCron 函数执行时,activeExpireCycle 函数就会被调用,在规定时间内,多次遍历服务器中的各个数据库,随机检查一部分键的过期时间,删除过期键

Redis中的key的生存时间和过期时间的更多相关文章

  1. 如何解决Redis中的key过期问题

    最近我们在Redis集群中发现了一个有趣的问题.在花费大量时间进行调试和测试后,通过更改key过期,我们可以将某些集群中的Redis内存使用量减少25%. Twitter内部运行着多个缓存服务.其中一 ...

  2. redis中的key设置过期时间

    EXPIRE key seconds 为给定  key  设置生存时间,当  key  过期时(生存时间为  0  ),它会被自动删除. 在 Redis 中,带有生存时间的  key  被称为『易失的 ...

  3. redis中与key相关的命令

    1.简单描述 redis本质上是一个key-value db,value可以有多种类型(string.hash.set.sorted set.list等),本章节不讲这些类型的命令,这里是讲跟key相 ...

  4. 单点登录filter根据redis中的key判断是否退出

    package com.ailk.biapp.ci.localization.cntv.filter; import java.io.IOException; import java.util.Has ...

  5. 转载文章(Redis中对key的操作)

    转载地址:http://www.cnblogs.com/stephen-liu74/archive/2012/03/26/2356951.html 一.概述: 在该系列的前几篇博客中,主要讲述的是与R ...

  6. 超大批量删除redis中无用key+配置

    目前线上一个单实例redis中无用的key太多,决定删除一部分. 1.删除指定用户的key,使用redis的pipeline 根据一定条件把需要删除的用户统计出来,放到一个表里面,表为 del_use ...

  7. 代码实测:给redis中的key取一个正确的名字多么重要

    redis对写入的key长度有限制吗? 太长的key对性能有影响吗? key越长对性能影响越大? 如何评估键长度对性能的影响? talk is cheap, show me the code! 今天我 ...

  8. Redis中对Key进行分类

    使用":"体现层次 >set key1:key2:key4 value1 "OK" >set key1:key2:key5 value2 " ...

  9. Python查询Redis中的Key

    今日,大哥让我查下项目的在线用户量,听到这个消息顿时懵逼了,在线用户量,这个该怎么查????想到项目中的登陆用户缓存信息Token都存放在Redis中,是不是可以根据Redis中Token的个数大致估 ...

  10. Redis中的key的通用操作

    1.看看所有的key 2.查看以mys开头的key 3.是否存在 4.删除 5.重命名. 6.设置过期时间与所剩的时间 如果没有设置,返回-1. 7.返回类型

随机推荐

  1. 使用jasypt加密配置的时候,报错:DecryptionException: Unable to decrypt

    前几天分享了一篇<Spring Boot 2.x基础教程:加密配置中的敏感信息> ,然后看到群里有小伙伴反应跟着这篇文章出现了这个异常com.ulisesbocchio.jasyptspr ...

  2. C++20 | std::span 陣列、容器的代理人

    在 C++ 裡頭有相當多「容器」.從原生的陣列,到標準庫 STL 的 vector, array, list, queue, map, set, -.有時候我們只是想以檢視的角度去看一個容器,或是其中 ...

  3. Windows 系统如何完全卸载 VSCode

    0. 参考资料 Uninstall visual studio code in windows 1. 删不干净的用户数据 最近正在从 Sublime Text 3 环境切换到 VS Code,看重的是 ...

  4. 四、mycat垂直分库

    系列导航 一.Mycat实战---为什么要用mycat 二.Mycat安装 三.mycat实验数据 四.mycat垂直分库 五.mycat水平分库 六.mycat全局自增 七.mycat-ER分片 一 ...

  5. Oracle数据库学习总结

    SQL 笔记 ch3_cn 1.数据类型记录 char(n) 定长字符 varchar(n) 可变长字符 numeric(p,d) 定点数,总位数p,小数点后位数q float(n) n位浮点数 2. ...

  6. apache mina

    本文为博主原创,未经允许不得转载: Apache Mina(Apache Multipurpose Infrastructure for Network Applications)是一个基于Java的 ...

  7. DBA实战面试题(一)

    数据库面试测试题(一) 简述当前主流RDBMS软件有哪些?开源且跨平台的数据库软件有哪些? 参考答案 当前主流的数据库服务器软件有: Oracle . DB2 . SQL SERVER .MySQL ...

  8. 【TouchGFX】使用CubeMX创建touchgfx项目 -- 初始篇

    1.系统构成,黑色块表示组件非必须 2.环境准备 CubeMX:6.0.1 touchgfx:4.15.0 rt-thread:2020-8-14 commit Keil:5.30 board:stm ...

  9. android studio 如何把依赖导出成 jar

    反编译工具 dex-tools-2.1-SNAPSHOT 第一步 用一个普通的app工程,引用所有的库,然后生成apk文件 第二步 把apk文件,改扩展名为zip,解压后,里面有几个*.dex文件,拷 ...

  10. [转帖]tgz 安装clickhouse

    一.什么是clickhouse ClickHouse是开源的列式存储数据库(DBMS),主要用于在线处理查询(OLAP),能够使用SQL查询实时生成数据分析报告. 下面介绍下安装clickhouse. ...