• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Redis > Redis系列(三)--过期策略

Redis系列(三)--过期策略

作者:Jack__Frost的博客 字体:[增加 减小] 来源:互联网 时间:2017-07-22

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"));

二、理解Redis内部的过期策略:

(1)总述:

Redis采用的是定期删除策略和懒汉式的策略互相配合。

注意!是Redis内部自主完成!是Redis内部自主完成!是Redis内部自主完成!

我们只可以通过调整外围参数,以及设计数据淘汰模式去调控我们的Redis缓存系统过期策略。

(2)定期删除策略:

1)含义:每隔一段时间执行一次删除过期key操作

2)优点:

通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用–处理”定时删除”的缺点

定期删除过期key–处理”懒汉式删除”的缺点

3)缺点:

在内存友好方面,会造成一定的内存占用,但是没有懒汉式那么占用内存(相对于定时删除则不如)

在CPU时间友好方面,不如”懒汉式删除”(会定期的去进行比较和删除操作,cpu方面不如懒汉式,但是比定时好)

4)关键点:

合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了),每次执行时间太长,或者执行频率太高对cpu都是一种压力。

每次进行定期删除操作执行之后,需要记录遍历循环到了哪个标志位,以便下一次定期时间来时,从上次位置开始进行循环遍历。

对于懒汉式删除而言,并不是只有获取key的时候才会检查key是否过期,在某些设置key的方法上也会检查(例子:setnx key2 value2:如果设置的key2已经存在,那么该方法返回false,什么都不做;如果设置的key2不存在,那么该方法设置缓存key2-value2。假设调用此方法的时候,发现redis中已经存在了key2,但是该key2已经过期了,如果此时不执行删除操作的话,setnx方法将会直接返回false,也就是说此时并没有重新设置key2-value2成功,所以对于一定要在setnx执行之前,对key2进行过期检查)。

5)删除键流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key):

1. 遍历每个数据库(就是redis.conf中配置的”database”数量,默认为16)

2. 检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体是下边的描述)

如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历
随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key
判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

对于定期删除,在程序中有一个全局变量current_db来记录下一个将要遍历的库,假设有16个库,我们这一次定期删除遍历了10个,那此时的current_db就是11,下一次定期删除就从第11个库开始遍历,假设current_db等于15了,那么之后遍历就再从0号库开始(此时current_db==0)

6)源码机制阅读:

定期删除策略:此部分转载部分此博主此文章

在redis源码中,实现定期淘汰策略的是函数activeExpireCycle,每当周期性函数serverCron执行时,该函数会调用databasesCron函数;然后databasesCron会调用activeExpireCycle函数进行主动的过期键删除。具体方法是在规定的时间内,多次从expires中随机挑一个键,检查它是否过期,如果过期则删除。

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Windows环境部署Redis集群
  • Redis简介
  • Centos7下Redis3.2.8最新版本安装教程
  • 详解redis是如何实现队列消息的ack
  • Linux中设置Redis开机启动的方法
  • Redis中五种数据类型简单操作
  • Redis 中spark参数executor-cores引起的异常解决办法
  • 关于redis Key淘汰策略的实现方法
  • 浅谈redis的maxmemory设置以及淘汰策略
  • 详谈redis优化配置和redis.conf说明(推荐)

相关文章

  • 2017-12-31更好地使用redis
  • 2017-05-11Redis实现分布式队列浅析
  • 2017-08-22关于redis启动时报错:Could not get a resource from the pool。
  • 2017-05-11一起raid数据恢复及回迁成功的案例
  • 2017-05-11Redis操作命令总结
  • 2017-07-22Redis系列(三)--过期策略
  • 2017-07-23redis主动向页面push数据
  • 2017-05-11Redis教程(十):持久化详解
  • 2017-05-11简介Lua脚本与Redis数据库的结合使用
  • 2017-05-11Linux下Redis安装配置教程

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • Redis系列(四)--内存淘汰机制(含单机版内存优化建议)
    • 简单粗暴的Redis数据备份和恢复方法
    • Redis String 类型和 Hash 类型学习笔记与总结
    • Linux下Redis安装配置教程
    • Redis的11种Web应用场景简介
    • Redis数据库的应用场景介绍
    • CentOS系统中Redis数据库的安装配置指南
    • Redis 命令整理并说明如何使用
    • Redis中的数据过期策略详解
    • Redis02 使用Redis数据库(String类型)全面解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有