文章目录

  • 概述
  • Redis 的超时命令
  • Spring操作 Redis 超时命令
  • 如果 key, 超时了, Redis 会回收 key 的存储空间吗 ?
  • Redis对超时键值对的回收策略
    • 定时回收
    • 惰性回收
    • 小结
  • 代码

概述

正如 Java 虚拟机,它提供 GC的功能,来保证 Java 程序使用过且不再使用的 Java 对象及时的从内存中释放掉,从而保证内存空间可用。当程序编写不当或考虑欠缺的时候(比如读入大文件),内存就可能存储不下运行所需要的数据,那么 Java虚拟机就会抛出内存溢出的异常而导致服务失败。同样, Redis 也是基于内存而运行的数据集合,也存在着对内存垃圾的回收和管理的问题。

Redis 基于内存 ,而内 存对于一个系统是最为宝贵的资源,而且它远远没有磁盘那么大,所以对于 Redis 的键值对的内存回收也是一个十分重要的问题,如果操作不当会产生 Redis岩机的问题,使得系统性能低下。

对于 Redis 而言, del 命令可以删除一些键值对,所以 Redis 比 Java 虚拟机更灵活,允许删除一部分的键值对。与此同时,当内存运行空间满了之后 ,它还会按照回收机制去自动回收一些键值对,这和 Java 虚拟机又有相似之处,但是当垃圾进行回收的时候,又有可能执行回收而引发系统停顿,因此选择适当的回收机制和时间将有利于系统性能的提高。


Redis 的超时命令

命令 说明 备注
persist key 持久化 key,取消超时时间 移除 key 的超时时间
ttl key 查看 key 的超时时间 以秒计算,-1 代表没有超时时间,如果不存在 key 或者key 已经超时则为-2
expire key seconds 设置超时时间戳 以秒为单位
expireat key timestamp 设置超时时间点 用 uninx 时间戳确定
pptl key milliseconds 查看 key 的超时时间戳 用毫秒计算
pexpire key 设置键值超时的时间 以毫秒为单位
pexpireat key stamptimes 设置超时时间点 以毫秒为单位的 uninx 时间戳

Spring操作 Redis 超时命令

package com.artisan.redis.expire;import java.util.Date;
import java.util.concurrent.TimeUnit;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;public class SpringRedisExpireDemo {@SuppressWarnings({ "unchecked", "rawtypes", "resource" })public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/spring-redis-string.xml");RedisTemplate redisTemplate = ctx.getBean(RedisTemplate.class);redisTemplate.execute((RedisOperations ops) -> {ops.boundValueOps("key1").set("value1");String value = (String) ops.boundValueOps("key1").get();System.out.println("value=" + value);long expSecond = ops.getExpire("key1");System.out.println("expSecond:" + expSecond);// 设置120秒Boolean flag = ops.expire("key1", 120L, TimeUnit.SECONDS);System.out.println("设置超时时间:" + flag);System.out.println("过期时间:" + ops.getExpire("key1") + "秒");// 持久化 key,取消超时时间flag = ops.persist("key1");System.out.println("取消超时时间:" + flag);System.out.println("过期时间:" + ops.getExpire("key1"));Date date = new Date();date.setTime(System.currentTimeMillis() + 120000);// 设置超时时间点flag = ops.expireAt("key1", date);System.out.println("设置超时时间:" + flag);System.out.println("过期时间:" + ops.getExpire("key1"));return null;});}}
INFO : org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@73a8dfcc: startup date [Fri Sep 28 12:57:39 CST 2018]; root of context hierarchy
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [spring/spring-redis-string.xml]
value=value1
expSecond:-1
设置超时时间:true
过期时间:120秒
取消超时时间:true
过期时间:-1
设置超时时间:true
过期时间:155

如果 key, 超时了, Redis 会回收 key 的存储空间吗 ?

Redis 的 key 超时不会被其自动回收,它只会标识哪些键值对超时了

  • 好处: 如果一个很大的键值对超时,比如一个列表或者哈希结构,存在数以百万个元素,要对其回收需要很长的时间 如果采用超时回收,则可能产生停顿
  • 坏处: 超时的键值对会浪费比较多的空间。

Redis对超时键值对的回收策略

Redis 提供两种方式回收这些超 时键值对, 它们是定时回收和惰性回收。

  • 定时回收是指在确定的某个时间触发一段代码,回收超时的键值对 。
  • 惰性回收则是 当 一个超时的键,被再次用 get 命令访问时,将触发 Redis 将其从内
    存中清空。

定时回收

定时回收可以完全回收那些超时的键值对,但是缺点也很明显,如果这些键值对比较多, 则 Redis 需要运行较长的时间,从而导致停顿。所以系统设计者一般会选择在没有业务发生的时刻触发 Redis 的定时回收,以便清理超时的键值对


惰性回收

对于惰性回收而言,它的优势是可以指定回收超时的键值对。 它的缺点是要执行一个莫名其妙的 get 操作,或者在某些时候,我们也难以判断哪些键值对已经超时。

小结

无论是定时回收还是惰性回收,都要依据自身的特点去定制策略,如果一个键值对,存储的是数 以千万的数据 ,使用 expire 命令使其到达一个时间超时,然后用 get 命令访问触发其回收,显然会付出停顿代价,这是现实中需要考虑的 。


代码

代码托管到了 https://github.com/yangshangwei/redis_learn

Redis-14Redis超时命令相关推荐

  1. Redis的超时命令和垃圾回收策略

    正如 Java 虚拟机,它提供了自动 GC(垃圾回收)的功能,来保证 Java 程序使用过且不再使用的 Java 对象及时的从内存中释放掉,从而保证内存空间可用. 当程序编写不当或考虑欠缺的时候(比如 ...

  2. Redis的KEYS命令引起宕机事件

    摘要: 使用 Redis 的开发者必看,吸取教训啊! 原文:Redis 的 KEYS 命令引起 RDS 数据库雪崩,RDS 发生两次宕机,造成几百万的资金损失 作者:陈浩翔 Fundebug经授权转载 ...

  3. Redis 键(key) 命令

    Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...

  4. redis 基本类型和命令(一)

    一.Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). (1) string类型是Redis最基本的数 ...

  5. redis常用监控命令

    redis常用监控命令 1.实时监控redis服务收到来自应用的所有命令 1 2 3 4 5 6 7 redis-cli 127.0.0.1:6379>monitor 1509964152.13 ...

  6. redis set 超时_redis分布式锁3种实现方式对比分析总结

    我在这篇文章提到了分布式锁,但没有展开来讲,抛砖引玉,今天就来说说高并发服务编程中的redis分布式锁. 这里罗列出3种redis实现的分布式锁,并分别对比说明各自特点. Redis单实例分布式锁 实 ...

  7. php predis连接超时,如何解决redis连接超时问题

    问题描述: redis连接超时,然后定位到redis配置文件目录被删除,接着尝试重启redis,发现连接中断,未启动成功. 报错: 查看redis的输出日志.出现下图所示的报错: 根据提示在/etc/ ...

  8. Redis的KEYS命令引起RDS数据库雪崩,RDS发生两次宕机,造成几百万的资金损失

    文章目录 第一次宕机 事故影响 原因分析 改进方案 第二次宕机 原因分析 改进方案 总结 Redis开发建议 1.冷热数据分离,不要将所有数据全部都放到Redis中 2.不同的业务数据要分开存储 3. ...

  9. Redis初学:4(Redis的常用命令)

    Redis的常用命令 查看所有key keys * 如下图: 插入key set key value 如下图: 取出key对应的value值 get key 如下图: 查看某个key是否存在 exis ...

最新文章

  1. 有查看自己dian nao mi |W| ma 的软件
  2. 经典的两数互换【指针】
  3. UVA 307 Sticks
  4. 正则表达式之python3版
  5. dataframe 如何选中某列的一行_如何用 Python 在笔记本上分析 100GB 数据?
  6. NutchServer的安全层
  7. Windows手动更新补丁
  8. netstat查询端口被占用
  9. 计算机在言语康复的应用,实物交互在言语康复训练中的应用.pdf
  10. python画spc控制图_SPC控制图的制作方法和步骤
  11. Java笔记(1):final关键字
  12. Excel拼接数据库语句
  13. css利用flex实现左-中-右布局
  14. 【深度学习计算机视觉实战】给深度学习计算机视觉初学者的学习和求职建议,这个行业还缺人
  15. 超级表格企业版:服务上万家中小企业,提升效率
  16. 小小靖Java成长日记02
  17. 修改多台远程服务器,电脑默认用户名Administrator
  18. day_03_连接池、事务、一对多和多对多配置
  19. html 奇数div,使用奇数偶数类的Javascript DOM操作
  20. 在哪吒sdk中新建全志D1s方案的方法

热门文章

  1. Cocos独立游戏精品|高自由度地牢探险《贪婪洞窟​》
  2. 计算机网络 - 练习(一百二十七)
  3. 中国再生聚酯纤维市场运营现状及投资战略分析报告2022-2028年
  4. cache line大小
  5. Python爬虫-国家企业信用信息公示系统App
  6. 双非渣本,他是如何逆袭拿到3W高薪
  7. PC微信hook学习笔记(一)—— 获取个人信息
  8. 原生js编写学生信息管理系统——添加学生信息
  9. 关于第二次考试的总结与反思
  10. 判断触发器是否被禁用