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. Android 3分钟带你入门开发测试

    作者:Zhu Yifei 作为一名合格的开发人员,基本的开发测试能力必不可少,开发测试分单元测试和UI测试,通过开发测试可以减少开发人员自测时间,提升开发质量.本篇文章可以帮助初级开发人员快速了解开发 ...

  2. S3C2440移植uboot之支持NANDFLASH操作

      上一节我们移植了uboot,S3C2440移植uboot之支持NORFLASH.这节我们继续移植,支持NANDFLASH. 目录 编译报错 拷贝s3c2410_nand.c,修改宏定义支持SC32 ...

  3. 2023是AI爆发的元年,程序员赚钱的机会来了,附49个机会!

    以下是程序员利用AI做代码生成的赚钱思路.方案,共49条,按照不同分类列出: 基于自然语言生成的机会: 1. 开发基于AI的自动生成代码软件,应用于网站开发.移动应用开发.家庭自动化.人工智能等各个领 ...

  4. C# 双向链表的实现

    类数据 public class Objects { private int number; /**//* 货物编号 */ private string name; /**//* 货物名称 */ pr ...

  5. python pip手动安装二进制包

    python中使用pip安装扩展包的时候,有时候会遇到如下类似报错: Running setup.py install for mysqlclient ... error ...(中间报错信息省略) ...

  6. Blazor模式讲解

    Blazor的三种模式 Blazor Server: Blazor Server在 ASP.NET Core 应用中支持在服务器上托管 Razor 组件. 可通过 SignalR 连接处理 UI 更新 ...

  7. [转帖]TLB缓存是个神马鬼,如何查看TLB miss?

    https://zhuanlan.zhihu.com/p/79607142 介绍TLB之前,我们先来回顾一个操作系统里的基本概念,虚拟内存. 虚拟内存 在用户的视角里,每个进程都有自己独立的地址空间, ...

  8. [转帖]如何利用wrarp测试oss性能?

    https://zhuanlan.zhihu.com/p/529735003   前言 我们利用mino与ceph rgw搭建好的oss经过多层网络转发,传输速度必定有所折损,这个时候我们使用wrap ...

  9. 银河麒麟安装LLDB的方法以及调试 dump 文件 (未完成)

    今天同事要进行 lldb进行调试dotnet的bug 本来在x86 上面进行相应的处理 但是发现报错. 没办法 正好有一台借来的arm服务器就搞了一下. 简单记录一下安装方法 1. 安装 apt的so ...

  10. sshpass 免密码进行文件复制的方法

    1. 部分centos8 没有安装 sshpass 需要先安装 sshpass yum install sshpass 2. 需要增加一个配置文件, 避免因为 stickhost 检查 造成命令失效 ...