jedis中给hash数据类型设置过期时间是不是没效呀?

jedis.hset(key,field,value);
jedis.expire(key,1000);
我实操试了下真的没有效果,用工具看,时间是-1的,是不是hash结构就不能设置过期时间?

hash设置失效时间和其他类型一样的命令。


Jedis jedis = new Jedis("xx.xx.xx.xx", 6379);
        jedis.hset("user", "name", "小白");
        jedis.expire("user", 1000);
        System.out.println("失效时长:"+jedis.ttl("user"));

在Jedis中,为哈希数据类型设置过期时间是有效的。哈希是Redis中一种常见的数据结构,它允许您存储键值对,其中键可以是任何字符串,而值可以是任何类型(例如字符串、哈希、列表、集合、有序集合等)。

要为哈希中的特定字段设置过期时间,您可以使用PFADD命令。以下是在Jedis中为哈希字段设置过期时间的示例代码:

import redis.clients.jedis.Jedis;

public class RedisExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");
        String hashKey = "myhash";
        String field = "myfield";
        String value = "myvalue";
        int expireTimeInSeconds = 60; // 设置过期时间为60秒

        // 添加哈希字段并设置过期时间
        jedis.hset(hashKey, field, value);
        jedis.expire(hashKey, field, expireTimeInSeconds);

        // 验证哈希字段是否存在
        boolean exists = jedis.hexists(hashKey, field);
        System.out.println("Field exists: " + exists); // 输出 true

        // 等待一段时间以让字段过期
        try {
            Thread.sleep(expireTimeInSeconds * 1000 + 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 再次验证哈希字段是否存在
        exists = jedis.hexists(hashKey, field);
        System.out.println("Field exists after expiration: " + exists); // 输出 false

        jedis.close();
    }
}

在上述示例中,我们使用hset方法将字段添加到哈希中,并使用expire方法为该字段设置过期时间。然后,我们使用hexists方法验证字段是否存在。在字段过期后,再次执行hexists方法将返回false,表示字段已经不存在。

请注意,过期时间是以秒为单位的。如果您需要更精细的时间粒度,可以使用其他Redis命令和Jedis库的其他方法来实现。

【以下回答由 GPT 生成】

问题答案: Jedis 中的 expire 方法是用来设置 key 的过期时间的,它不适用于 hash 数据类型。所以在你的代码中,jedis.expire(key,1000) 并不会对 hash 类型的键生效。

要给 hash 数据类型设置过期时间,你可以借助 Redis 的另外一个特性:设置 key 的过期时间。当 key 过期之后,Redis 会自动删除对应的键值对,包括 hash 数据类型。

以下是一个解决方案:

  1. 首先使用 hset 方法向 hash 数据类型中设置键值对。
jedis.hset(key,field,value);
  1. 使用 expire 方法设置 key 的过期时间。由于不能直接设置 hash 数据类型的过期时间,我们需要为对应的 hash 键创建一个额外的键,用来设置过期时间。
// 设置额外的键,将 hash 键和过期时间进行关联
String expireKey = "expire:" + key;
jedis.set(expireKey, "expire");
jedis.expire(expireKey, 1000);
  1. 注意,当获取 hash 键的时候,你需要先判断额外的键是否过期,如果过期了,则说明对应的 hash 数据类型也应该被删除。
if (jedis.get(expireKey) == null) {
    jedis.del(key);
}

这样,当过期时间到达时,键对应的 hash 会被删除,并且可以节省空间和提高性能。

希望这个解决方案对你有所帮助。如果你有任何其他问题,请随时提问。



【相关推荐】


  • 这篇博客: jedis(自用)中的 4. hash类型常见操作 部分也许能够解决你的问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

redis版本是哪个版本的?