Redis-14Redis超时命令

简介: Redis-14Redis超时命令

概述


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


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


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


Redis 的超时命令


image.png

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

相关文章
|
9月前
|
存储 缓存 监控
Redis设计与实现——Redis命令参考与高级特性
Redis 是一个高性能的键值存储系统,支持丰富的数据类型(字符串、列表、哈希、集合等)和多种高级功能。本文档涵盖 Redis 的核心命令分类,包括数据类型操作、事务与脚本、持久化、集群管理、系统监控等。特别介绍了事务的原子性特性、Lua 脚本的执行方式及优势、排序机制、发布订阅模型以及慢查询日志和监视器工具的使用方法。适用于开发者快速掌握 Redis 常用命令及其应用场景,优化系统性能与可靠性。
|
5月前
|
存储 缓存 NoSQL
Redis基础命令与数据结构概览
Redis是一个功能强大的键值存储系统,提供了丰富的数据结构以及相应的操作命令来满足现代应用程序对于高速读写和灵活数据处理的需求。通过掌握这些基础命令,开发者能够高效地对Redis进行操作,实现数据存储和管理的高性能方案。
177 12
|
5月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
6月前
|
存储 缓存 人工智能
Redis六大常见命令详解:从set/get到过期策略的全方位解析
本文将通过结构化学习路径,帮助读者实现从命令语法掌握到工程化实践落地的能力跃迁,系统性提升 Redis 技术栈的应用水平。
|
7月前
|
NoSQL Redis
Lua脚本协助Redis分布式锁实现命令的原子性
利用Lua脚本确保Redis操作的原子性是分布式锁安全性的关键所在,可以大幅减少由于网络分区、客户端故障等导致的锁无法正确释放的情况,从而在分布式系统中保证数据操作的安全性和一致性。在将这些概念应用于生产环境前,建议深入理解Redis事务与Lua脚本的工作原理以及分布式锁的可能问题和解决方案。
283 8
|
9月前
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
533 17
|
9月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
974 16
|
9月前
|
JSON NoSQL Redis
在Rocky9系统上安装并使用redis-dump和redis-load命令的指南
以上步骤是在Rocky9上使用redis-dump和redis-load命令顺利出行的秘籍。如果在实行的过程中,发现了新的冒险和挑战,那么就像一个勇敢的航海家,本着探索未知的决心,解决问题并前进。
304 14
|
9月前
|
消息中间件 NoSQL Unix
Redis的基本特性以及其基础命令用法
这只是冰山一角,Redis的强大功能和简洁的操作方法值得我们深入了解和掌握,是复杂数据问题解决的有力工具。所以,来一场有趣的Redis冒险吧!
239 6
|
11月前
|
缓存 NoSQL Redis
Redis如何优化频繁命令往返造成的性能瓶颈?
频繁的命令往返是Redis性能优化中需要重点关注的问题。通过使用Pipeline、Lua脚本、事务、合并命令、连接池以及合理设置网络超时,可以有效减少网络往返次数,优化Redis的性能。这些优化措施不仅提升了Redis的处理能力,还能确保系统在高并发情况下的稳定性和可靠性。
299 14