【问题标题】:Remove an entire hset from Redis (Jedis), having issues since it just won't remove从 Redis (Jedis) 中删除整个 hset,因为它不会删除而存在问题
【发布时间】:2019-03-19 00:50:38
【问题描述】:

pipe.hset(uuid, "name", "Archie");

这是我如何使用 hset 的示例。还有大约 10 个其他属性(姓名、年龄等)。

我正在尝试删除整个 hset,例如删除 uuid,使其不再是键(键是正确的术语吗?)。

我尝试通过管道单独删除每个元素;

for (String s : profileData)  {
                pipe.hdel("profile@" + uuid.toString(), s);
           }

但首先,这具有 O(n) 的时间复杂度,因此效率更高,其次它实际上对我不起作用,因为密钥仍然存在(认为这可能是我自己的编码错误)。

我看到过要求提供 hdelall 函数的问题,但我知道该函数不存在。

我也试过用,

pipe.del(uuid);

但这什么也没做——很明显我用错了。我以为它只会删除整个 hset 但它不会,它必须用于删除单个值吗?我不确定。

所以我的问题归结为: 如何有效地从 Redis 中删除整个 hset,使用 Jedis

谢谢。

【问题讨论】:

    标签: redis set pipeline jedis


    【解决方案1】:

    我不确定您的代码是什么样子,但我做了这个快速测试,它按预期对我有用。

        import redis.clients.jedis.JedisPool;
        import redis.clients.jedis.JedisPoolConfig;
        import redis.clients.jedis.Pipeline;
    
        import java.time.Duration;
        import java.util.Set;       
    
    public class TestRedisDelete {
        public static void main(String[] args) {
    
            TestRedisDelete redis = new TestRedisDelete();
            Pipeline p = redis.jedisPool.getResource().pipelined();
            p.hset("h1", "f", "v");
            p.hset("h2", "f", "v");
            p.hset("h3", "f", "v");
            p.del("h1");
            p.sync();
    
            Set<String> keys = redis.jedisPool.getResource().keys("*");
            System.out.println(keys);
        }
    
        final JedisPoolConfig poolConfig = buildPoolConfig();
        JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
    
        private JedisPoolConfig buildPoolConfig() {
            final JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxTotal(10);
            poolConfig.setMaxIdle(10);
            poolConfig.setMinIdle(4);
            poolConfig.setTestOnBorrow(true);
            poolConfig.setTestOnReturn(true);
            poolConfig.setTestWhileIdle(true);
            poolConfig.setMinEvictableIdleTimeMillis(Duration.ofSeconds(60).toMillis());
            poolConfig.setTimeBetweenEvictionRunsMillis(Duration.ofSeconds(30).toMillis());
            poolConfig.setNumTestsPerEvictionRun(3);
            poolConfig.setBlockWhenExhausted(true);
            return poolConfig;
        }
    }
    

    输出:[h2, h3]

    【讨论】:

      【解决方案2】:

      使用JEDIS的delete方法怎么样

      jedis.del(uuid);
      

      查看link了解更多详情

      【讨论】:

      • 我试过了,好像没用。我要再试一次。但我在想,也许是因为我通过管道抓取了一些响应(响应是从管道中的 GET 方法返回的对象),然后删除了响应在同一管道中引用的键。也许这是不允许的,因为正在获取数据,然后在一个 pipeline.sync()“循环”中删除。有什么线索吗?
      猜你喜欢
      • 2014-02-14
      • 2022-01-05
      • 2020-07-04
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多