Jack__Frost的博客通过本文主要向大家介绍了redis,过期策略,过期策略API等相关知识,希望本文的分享对您有所帮助
制定Redis过期策略,是整个Redis缓存策略的关键之一,因为内存来说,公司不可能无限大,所以就要对key进行一系列的管控。
文章结构:(1)理解Redis过期设置API(命令与Java描述版本);(2)理解Redis内部的过期策略;(3)对开发需求而言,Redis过期策略的设计实现经验。
本系列文章:
(1) Redis系列(一)–安装、helloworld以及读懂配置文件
(2)Redis系列(二)–缓存设计(整表缓存以及排行榜缓存方案实现)
一、理解Redis过期设置API(命令与Java描述版本):
(1)TTL命令:
redis 127.0.0.1:6379> TTL KEY_NAME
返回值
当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。
(2)EXPIRE命令
定义:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
redis 127.0.0.1:6379> EXPIRE runooobkey 60
(integer) 1
返回值
设置成功返回 1 。 当 key 不存在或者不能为 key 设置过期时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的过期时间)返回 0 。
key生存时间注意点:
生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆写(overwrite),这意味着,如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不会被改变。
比如说,对一个 key 执行 INCR 命令,对一个列表进行 LPUSH 命令,或者对一个哈希表执行 HSET 命令,这类操作都不会修改 key 本身的生存时间。
另一方面,如果使用 RENAME 对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样。
RENAME 命令的另一种可能是,尝试将一个带生存时间的 key 改名成另一个带生存时间的 another_key ,这时旧的 another_key (以及它的生存时间)会被删除,然后旧的 key 会改名为 another_key ,因此,新的 another_key 的生存时间也和原本的 key 一样。
(3)PEXPIRE命令
设置成功返回 1 。 当 key 不存在或者不能为 key 设置过期时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的过期时间)返回 0 。
(4)PERSIST 命令
返回值:
当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。
127.0.0.1:6379> PEXPIRE k2 10000000
(integer) 1
(5)SETEX命令
用于在Redis键中的指定超时,设置键的字符串值
返回值:
字符串,如果在键中设置了值则返回OK。如果值未设置则返回 Null。
127.0.0.1:6379> SETEX k1 100 v1
OK
127.0.0.1:6379> ttl k1
(integer) 92
127.0.0.1:6379> get k1
"v1"
(6)补充:(精度不同的时间设置):
EXPIREAT < timestamp> 命令用于将键key 的过期时间设置为timestamp所指定的秒数时间戳。
PEXPIREAT < timestamp > 命令用于将键key 的过期时间设置为timestamp所指定的毫秒数时间戳。
例子:
//TTL命令
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> ttl key
(integer) -2
127.0.0.1:6379> set key value
OK
127.0.0.1:6379> ttl key
(integer) -1
//expire命令
127.0.0.1:6379> expire key 10
(integer) 1
127.0.0.1:6379> ttl key
(integer) 7
127.0.0.1:6379> ttl key
(integer) 3
127.0.0.1:6379> ttl key
(integer) -2
//PEXPIRE命令
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> PEXPIRE k2 10000000
(integer) 1
127.0.0.1:6379> ttl k2
(integer) 9994
//PERSIST 命令
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> EXPIRE k1 100
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 86
127.0.0.1:6379> PERSIST k1
(integer) 1
127.0.0.1:6379> ttl k1
(integer) -1
(6)Java代码控制:
@Autowired
private JedisPool jedisPool;
Jedis jedis = jedisPool.getResource();
System.out.println("判断key是否存在:"+shardedJedis.exists("key"));
// 设置 key001的过期时间
System.out.println("设置 key的过期时间为5秒:"+jedis.expire("key", 5));
// 查看某个key的剩余生存时间,单位【秒】.永久生存或者不存在的都返回-1
System.out.println("查看key的剩余生存时间:"+jedis.ttl("key"));
// 移除某个key的生存时间
System.out.println("移除key的生存时间:"+jedis.persist("key"));
System.out.println("查看key的剩余生存时间:"+jedis.ttl("key"));
// 查看key所储存的值的类型
System.out.println("查看key所储存的值的类型:"+jedis.type("key"));