redis 7年前

从零学习redis(8)--- 过期及过期策略

作者头像 刘宇帅
4153 0

redis 的 string 类型是支持过期设置的,默认是永不过期的。

Redis 设置过期

redis 中设置设置 key 过期有3中方式 第一种在设置值的时候指定过期时间 Set 命令格式

SET key value [EX seconds] [PX milliseconds] [NX|XX]
  1. EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
  2. PX millisecond :设置键的过期时间为 millisecond 毫秒。 3. SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
  3. NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。
  4. XX :只在键已经存在时,才对键进行设置操作。

示例

127.0.0.1:6379> SET hello world EX 5 // 设置 key test 过期时间是 5 秒
OK

第二种使用命令 SETEX PSETEX,两个命令分别等价于上面的 EX 和 PX 参数。

第三种使用 expire 设置已经存在的 key 的过期时间。

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> expire hello 5
(integer) 1
127.0.0.1:6379> get hello
(nil)

我们也可以使用命令persist取消过期设置

127.0.0.1:6379> set hello world ex 10
OK
127.0.0.1:6379> persist hello
(integer) 1
127.0.0.1:6379> get hello
"world"

常见的过期策略

定时删除

含义:在设置 key 过期的同时,为该 key 创建一个定时器,让定时器在 key 过期的时候去删除 key。
优点:内存尽快释放
缺点:若过期 key 比较多,需要设置很多定时器且 CPU 也需要更多的处理时间,会影响性能

懒汉式删除

含义:只有当操作特定 key 的时候,才去检查 key 是否过期,若过期就删除。
优点:只有到操作 key 的时候才去删除,减少 CPU 使用。
缺点:如果过期 key 比较多,会占用较多的内存。

定期删除

含义:每隔一段时间扫描 key,并删除需要删除的 key。 优点:通过不同的时间间隔可以减少 CPU 处理时间,同时减轻懒汉式存在的内存占用问题。
缺点:CPU 占用差于懒汉删除,内存占用差于定是删除。

redis 的过期策略

  1. redis 采用懒汉删除+定时删除
  2. redis 定时删除依次遍历各个库,当达到删除时长时会记录当前删除到库,下次定时删除时从该库开始遍历。

ps:memcache采用懒汉删除策略

作者头像

刘宇帅

非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。

提示

功能待开通!


暂无评论~

相关文章

从零学习redis(6)--- 多机部署之集群模式

Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式: 主从复制模式 哨兵模式 集群模式 redis集群模式 哨兵模式解决了主节点挂掉的问题,但是没有解决从节点挂掉的问题,而 redis 集群模式可以有效的解决这个问题。redis集群中的数据是和槽(slot)挂钩的,一共定义了16384个槽,所有的数据使用一致性哈希分

从零学习redis(5)--- 多机部署之哨兵模式

Redis 作为高效的缓存数据库,单机也能够表现出很好的性能。但是随着数据的增加、并发的增加,单机模式的 Redis 会受到单机性能、容量、稳定性的限制,即使 Redis 提供了稳定的持久化方案,但是单机服务器始终是部署在单个机器上,如果运行机器本身的服务器出现问题我们很难在短时间恢复服务。所以 Redis 提供了三种多机模式: 主从复制模式 哨兵模式 集群模式 哨兵模式 主从复制模式解决了数据备份和单机可能存在的性能问题,但是也引入了新的问题,一主多从,在使用过程中,如果主服务器挂掉那么整个 Redis 服务的写就挂掉了,如果一个从服务器挂掉那么调用方就无法正确的读数据了,只能通过修改调

从零学习redis(15)--- 源码阅读之内存分配

redis 中内存管理没有直接使用 C 语言提供的方法而是做了一个可管理已分配内存大小及添加了自己分配策略的实现,下面从 SDS 开始去了解 redis 的内存管理实现及策略。 SDS 内存管理函数定义如下: src/sdsalloc.h #include "zmalloc.h" #define s_malloc zmalloc #define s_realloc zrealloc #define s_free zfree s_malloc 内存申请、s_realloc 内存重新分配、s_free 内存释放,这里定义分别是 zmalloc.h 里三个函数的别名,而 zmalloc zrea

从零学习redis(12)--- 大量导入数据

有时候我们需要在短时间内往 redis 里插入大量的数据,我们如果单条单条的出入会浪费很多时间和服务器资源,我们可以使用管道来实现快速的插入。 netcat 我们把需要插入 redis 的数据创建为如下的一个命令集文件 set key1 val1 set key2 val2 ... set key3 val3 我们使用如下命令执行数据导入 > $ cat /tmp/test|nc localhost 6379 +OK +OK +OK pipe mode 使用 netcat 并不是一个可靠地方式,因为用netcat进行大规模插入时不能检查错误。从Redis 2.6开始redis-cli支

从零学习redis(7)--- 单线程和性能

在面试过程中只要涉及到 Redis,一定会问到 Redis是多进程还是多线程?为什么单线程还可以有这么高的性能? Redis为什么是单线程的 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器的内存的大小和网络的带宽,而且单线程的性能已经非常高了,就没有必要使用多线程了,所以 Redis 是单进程单线程的。 提示: 如果我们运行的服务器是多核服务器,为了充分利用多核优势我们可以在单台服务器起多个 Redis 服务,或者架设 主从复制、哨兵模式、集群模式等多机方案。 Redis 服务运行时只是处理客户端请求是单进程单线程的,但是服务运行时会有其他进