键的过期时间
简介Redis可以通过对键设置过期时间来自动删除过期的键信息。当设置了一个过期时间后,过期时间会被存储为一个绝对的UNIX的时间戳。这样做的目的是即使Redis服务器宕机了一段时间,这个时间戳也会被持久化到RDB文件中,当Redis服务器启动时,这个用来判断键是否过期的时间戳不会发生变化,一旦超过了这个时间戳,键就过期了。
Redis可以通过对键设置过期时间来自动删除过期的键信息。当设置了一个过期时间后,过期时间会被存储为一个绝对的UNIX的时间戳。这样做的目的是即使Redis服务器宕机了一段时间,这个时间戳也会被持久化到RDB文件中,当Redis服务器启动时,这个用来判断键是否过期的时间戳不会发生变化,一旦超过了这个时间戳,键就过期了。
在一个键过期后,客户端访问已经过期的键,Redis就会立即将其从内存中删除。Redis这种删除键的方式被称为被动过期。对于那些已经过期也不会被再次访问的键,Redis会定期运行一个基于概率的算法来进行主动删除。跟具体的就是Redis会选择设置了过期时间的20个键,在这20个键中已经过期的就立即删除,如果选中的键中25%的键已经过期被删除,那Redis会继续选择20个进行重复这个过程,该过程每秒钟运行10次,可通过配置文件的hz值进行设置。
清理键过期的方法:
- 使用PERSIST命令使其成为持久的键;
- 键的值被替换或被删除,都会清除过期时间。但是修改列表、集合、哈希不会清理过期时间,这里只是修改了元素信息,并没有操作键的信息;
- 被另一个没有过期时间的键重命名;
相关命令
EXPIRE、EXPIREAT、TTL、PERSIST
相关操作
1、使用EXPIRE设置过期时间、TTL命令查看剩余时间
127.0.0.1:6379> LPUSH "user_ids" 123 456 234 156 888
(integer) 5
127.0.0.1:6379> TTL "user_ids" #如果没有过期时间,就返回-1
(integer) -1
127.0.0.1:6379> EXPIRE "user_ids" 100 #100设置为过期的相对时间,单位秒
(integer) 1
127.0.0.1:6379> TTL "user_ids"
(integer) 99
#等待99秒
127.0.0.1:6379> TTL "user_ids" #如果这个键不存在就返回-2
(integer) -2
127.0.0.1:6379> EXISTS "user_ids"
(integer) 0
2、使用PERSIST命令将键设置为持久的键
127.0.0.1:6379> LPUSH "user_ids" 123 456 234 156 888
(integer) 5
127.0.0.1:6379> EXPIRE "user_ids" 100
(integer) 1
127.0.0.1:6379> TTL "user_ids"
(integer) 98
127.0.0.1:6379> PERSIST "user_ids"
(integer) 1
127.0.0.1:6379> TTL "user_ids"
(integer) -1
注意:EXPIRE命令和EXPIREAT命令类似,EXPIREAT用来指定一个绝对的UNIX的时间戳。EXPIRE和EXPIREAT都可以
是毫秒级的精度来指定过期时间。
Redis对已经过期的键的主动删除是不可预料的,所以有些已经过期的键可能永远不会被删除。当发现有太多的键没有被删除掉的时候,可以使用SCAN命令来人为主动的删除过期的键。
最近在做Golang的web框架日志,想将一个请求的所有日志上都绑定一个请求ID,由于最初框架的搭建没有解耦好,所以很难在日志中输出请求ID。于是想到了能否用协程ID来记录一个对应的请求ID,然后进行获取。
updatedb命令可以创建或更新locate命令使用的数据库。updatedb命令会定时(每天)执行。
通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。
php中的array_walk_recursive函数对数组中的每个成员递归地应用用户函数
某些时候如果想快速将服务器中的某些资源共享给其他人,可以使用python来实现,python自带了一个快速创建HTTP服务的方式,可以将允许时目录下的所有文件以文件服务器供他人进行访问和下载。
快速生成表格
Electron页面跳转、浏览器打开链接和打开新窗口
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。
在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。
Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题