下面分别来看以上这些命令的具体实现。
1)expire:N 秒后过期 127.0.0.1:6379> set key value OK 127.0.0.1:6379> expire key 100 (integer) 1 127.0.0.1:6379> ttl key (integer) 97其中命令 ttl 的全称是 Time To Live 表示此键值在 n 秒后过期。例如,上面的结果 97 表示 key 在 97s 后过期。
2)pexpire:N 毫秒后过期 127.0.0.1:6379> set key2 value2 OK 127.0.0.1:6379> pexpire key2 100000 (integer) 1 127.0.0.1:6379> pttl key2 (integer) 94524其中 pexpire key2 100000 表示设置 key2 在 100000 毫秒(100秒)后过期。
3)expireat:过期时间戳精确到秒 127.0.0.1:6379> set key3 value3 OK 127.0.0.1:6379> expireat key3 1573472683 (integer) 1 127.0.0.1:6379> ttl key3 (integer) 67其中 expireat key3 1573472683 表示 key3 在时间戳 1573472683 后过期(精确到秒),使用 ttl 查询可以发现在 67s 后 key3 会过期。
小贴士:在 Redis 可以使用 time 命令查询当前时间的时间戳(精确到秒),示例如下:
127.0.0.1:6379> time
1) "1573472563"
2) "248426"
其中 pexpireat key4 1573472683000 表示 key4 在时间戳 1573472683000 后过期(精确到毫秒),使用 ttl 查询可以发现在 3522ms 后 key4 会过期。
5)字符串中的过期操作字符串中几个直接操作过期时间的方法,如下列表:
set key value ex seconds:设置键值对的同时指定过期时间(精确到秒);
set key value ex milliseconds:设置键值对的同时指定过期时间(精确到毫秒);
setex key seconds valule:设置键值对的同时指定过期时间(精确到秒)。
实现示例如下:
① set key value ex seconds 127.0.0.1:6379> set k v ex 100 OK 127.0.0.1:6379> ttl k (integer) 97 ② set key value ex milliseconds 127.0.0.1:6379> set k2 v2 px 100000 OK 127.0.0.1:6379> pttl k2 (integer) 92483 ③ setex key seconds valule 127.0.0.1:6379> setex k3 100 v3 OK 127.0.0.1:6379> ttl k3 (integer) 91 2.移除过期时间使用命令: persist key 可以移除键值的过期时间,如下代码所示:
127.0.0.1:6379> ttl k3 (integer) 97 127.0.0.1:6379> persist k3 (integer) 1 127.0.0.1:6379> ttl k3 (integer) -1可以看出第一次使用 ttl 查询 k3 会在 97s 后过期,当使用了 persist 命令之后,在查询 k3 的存活时间发现结果是 -1,它表示 k3 永不过期。
3.Java实现过期操作本文将使用 Jedis 框架来实现对 Redis 过期时间的操作,如下代码所示:
public class TTLTest { public static void main(String[] args) throws InterruptedException { // 创建 Redis 连接 Jedis jedis = new Jedis("xxx.xxx.xxx.xxx", 6379); // 设置 Redis 密码(如果没有密码,此行可省略) jedis.auth("xxx"); // 存储键值对(默认情况下永不过期) jedis.set("k", "v"); // 查询 TTL(过期时间) Long ttl = jedis.ttl("k"); // 打印过期日志 System.out.println("过期时间:" + ttl); // 设置 100s 后过期 jedis.expire("k", 100); // 等待 1s 后执行 Thread.sleep(1000); // 打印过期日志 System.out.println("执行 expire 后的 TTL=" + jedis.ttl("k")); } }程序的执行结果为:
过期时间:-1
执行 expire 后的 TTL=99
可以看出使用 Jedis 来操作 Redis 的过期时间还是很方便的,可直接使用 jedis.ttl("k") 查询键值的生存时间,使用 jedis.expire("k",seconds) 方法设置过期时间(精确到秒)。
小贴士:使用 Jedis 之前,先要把 Jedis 引入到程序中,如果使用的是 Maven 项目的,直接在 pom.xml 文件中添加以下引用:
<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>version</version> </dependency>更多过期操作方法,如下列表:
pexpire(String key, long milliseconds):设置 n 毫秒后过期;
expireAt(String key, long unixTime):设置某个时间戳后过期(精确到秒);
pexpireAt(String key, long millisecondsTimestamp):设置某个时间戳后过期(精确到毫秒);
persist(String key):移除过期时间。
完整示例代码如下:
public class TTLTest { public static void main(String[] args) throws InterruptedException { // 创建 Redis 连接 Jedis jedis = new Jedis("xxx.xxx.xxx.xxx", 6379); // 设置 Redis 密码(如果没有密码,此行可省略) jedis.auth("xxx"); // 存储键值对(默认情况下永不过期) jedis.set("k", "v"); // 查询 TTL(过期时间) Long ttl = jedis.ttl("k"); // 打印过期日志 System.out.println("过期时间:" + ttl); // 设置 100s 后过期 jedis.expire("k", 100); // 等待 1s 后执行 Thread.sleep(1000); // 打印过期日志 System.out.println("执行 expire 后的 TTL=" + jedis.ttl("k")); // 设置 n 毫秒后过期 jedis.pexpire("k", 100000); // 设置某个时间戳后过期(精确到秒) jedis.expireAt("k", 1573468990); // 设置某个时间戳后过期(精确到毫秒) jedis.pexpireAt("k", 1573468990000L); // 移除过期时间 jedis.persist("k"); } } 4.持久化中的过期键