Redis缓存过期,更新策略

Redis缓存过期,更新策略


这是Redis系列第三篇,前两篇分别是
1. Linux(Ubuntu16.04)下redis的安装,helloworld及读懂配置文件
https://blog.csdn.net/qq_36521579/article/details/796850974
2. Redis集群环境
https://blog.csdn.net/qq_36521579/article/details/79687987


为什么会有Redis缓存过期策略

举个例子:当我们在一个项目中有商品信息需要不断查询,而我们希望通过Redis缓存减少数据库压力,加快查询速度,但如果这些商品数据中有一些是偶尔才查询一次,那么当我们查询一次后可能过了很久才会有第二次第三次的查询,这样它在Redis中占着位置却没有发挥作用,是一个极大的损耗,因此我们需要一个过期策略,当这个商品一段时间没有被再次查询时,我们就将其从Redis中删除,省下空间来存放别的信息。

Redis命令:
TTL命令
redis 127.0.0.1:6379> TTL KEY_NAME

返回值
当key不存在时,返回-2。当key存在但没有设置剩余生存时间时,返回-1。否则,以秒为单位,返回key的剩余生存时间。
注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。

EXPIRE命令

定义:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。

redis 127.0.0.1:6379> EXPIRE runooobkey 60

返回值
设置成功返回 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 一样。

PEXPIRE命令

设置成功返回 1 。 当 key 不存在或者不能为 key 设置过期时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的过期时间)返回 0 。

PERSIST 命令

返回值:
当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0

redis 127.0.0.1:6379> SET mykey "redis"
OK
redis 127.0.0.1:6379> EXPIRE mykey 60 
1) (integer) 1 
redis 127.0.0.1:6379> TTL mykey 
1) (integer) 56 
redis 127.0.0.1:6379> PERSIST mykey 
1) (integer) 1 
redis 127.0.0.1:6379> TTL mykey 
1) (integer) -1
SETEX命令

Redis Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。可用版本(>= 2.0.0)。时间复杂度:O(1)。
设置成功时返回 OK 。当 seconds 参数不合法时,返回一个错误。

例:redis 127.0.0.1:6379> SETEX KEY_NAME TIMEOUT VALUE
**************************************************************
# 在 key 不存在时进行 SETEX

redis> SETEX cache_user_id 60 10086
OK

redis> GET cache_user_id  # 值
"10086"

redis> TTL cache_user_id  # 剩余生存时间
(integer) 49


# key 已经存在时,SETEX 覆盖旧值

redis> SET cd "timeless"
OK

redis> SETEX cd 3000 "goodbye my love"
OK

redis> GET cd
"goodbye my love"

redis> TTL cd
(integer) 2997
补充:(精度不同的时间设置):

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

过期策略在ssm项目中的使用

一、为key设置过期时间,过期则删除
@Autowired
private JedisClient jedisClient;

@Override
    public TaotaoResult getItemBaseInfo(long itemId) {
        try {
            //添加缓存逻辑
            //从缓存中取商品信息,商品id对应的信息
            String json = jedisClient.get("REDIS_ITEM_KEY"+ ":" + itemId + ":base");
            //判断是否有值
            if (!StringUtils.isBlank(json)) {
                //把json转换成java对象
                TbItem item = JsonUtils.jsonToPojo(json, TbItem.class);
                return TaotaoResult.ok(item);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        //根据商品id查询商品信息
        TbItem item = itemMapper.selectByPrimaryKey(itemId);
        //使用TaotaoResult包装一下
        try {
            //把商品信息写入缓存
            jedisClient.set("REDIS_ITEM_KEY"
             + ":" + itemId + ":base", JsonUtils.objectToJson(item));
            //设置key的有效期
            jedisClient.expire("REDIS_ITEM_KEY" + ":" + itemId + ":base", 864000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return TaotaoResult.ok(item);
    }
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Redis缓存是一种基于内存的高性能键值存储数据库。它常被用作缓存服务器,可以将常用的数据缓存在内存中,以提高应用程序的响应速度。 优点: 1. 快速读取:与传统的磁盘数据库相比,Redis缓存可以更快地读取数据。 2. 高并发:Redis缓存的单线程模型能够避免并发问题,同支持高并发访问。 3. 数据结构丰富:Redis缓存支持多种数据结构,如字符串、哈希、列、集合、有序集合等,方便开发人员使用。 4. 分布式:Redis缓存可以实现分布式缓存,提高了系统的扩展性和容错性。 缺点: 1. 内存限制:Redis缓存存储的数据量受限于服务器的内存大小。 2. 数据一致性:Redis缓存中的数据可能会因为故障等原因丢失,需要进行备份和恢复操作。 3. 高并发写入:当Redis缓存中的数据需要频繁更新,可能会导致性能下降。 Redis缓存支持多种数据结构,如字符串、哈希、列、集合、有序集合等。其中,字符串适用于缓存简单的值或对象,哈希适用于缓存复杂的对象,列适用于缓存队列等数据结构,集合适用于缓存无序的元素集合,有序集合适用于缓存有序的元素集合。 Redis缓存的分布式实现可以通过一致性哈希算法等方式来实现。一致性哈希算法可以使得数据在多个节点之间均匀分布,提高系统的性能和可靠性。 为了保证Redis缓存的可靠性和数据一致性,可以使用持久化方式来将数据写入到磁盘中,以防止数据丢失。同,可以设置主从复制,将数据复制到多个节点,提高系统的可靠性。 Redis缓存过期策略有两种:定过期和惰性过期。定过期是指设置一个过期间,在这个间之后数据会被自动删除;惰性过期是指在访问数据检查它是否过期,如果过期进行删除。可以通过设置过期间和过期策略来控制Redis缓存中数据的有效性。 Redis缓存的持久化方式有两种:RDB和AOF。RDB将内存中的数据周期性地写入到磁盘中,适用于需要快速备份和恢复数据的场景;AOF则将Redis缓存的写操作记录到文件中,适用于需要保证数据一致性和可靠性的场景。 为了优化Redis缓存的性能,可以采用以下方法: 1. 合理使用数据结构,选择适合的数据类型和算法。 2. 设置合理的过期间和过期策略,避免数据的过期和无效。 3. 使用分布式缓存,将数据分散在多个节点中,提高系统的性能和可靠性。 4. 使用连接池和异步IO等技术,避免因连接和IO造成的性能瓶颈。 为了保证Redis缓存与数据库的一致性,可以使用缓存更新策略。当数据库中的数据发生变化,可以通过订阅数据库更新事件的方式,将更新的数据同步到Redis缓存中,以保证数据的一致性。 为了实现Redis缓存的高可用性,可以使用主从复制和哨兵模式。主从复制可以将数据复制到多个节点,提高系统的容错性;哨兵模式则可以监控Redis缓存的状态,当主节点出现故障,自动选择新的主节点,保证系统的高可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值