从 Redis (Jedis) 中删除整个 hset,有问题,因为它不会删除
Remove an entire hset from Redis (Jedis), having issues since it just won't remove
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 但它不会,它必须用于删除单个值吗?我不确定。
所以我的问题归结为;
如何使用 Jedis.
从 Redis 有效地删除整个 hset
谢谢。
使用JEDIS的delete方法怎么样
jedis.del(uuid);
查看此link了解更多详情
我不确定您的代码是什么样子,但我做了这个快速测试,它对我来说如预期的那样有效。
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]
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 但它不会,它必须用于删除单个值吗?我不确定。
所以我的问题归结为; 如何使用 Jedis.
从 Redis 有效地删除整个 hset谢谢。
使用JEDIS的delete方法怎么样
jedis.del(uuid);
查看此link了解更多详情
我不确定您的代码是什么样子,但我做了这个快速测试,它对我来说如预期的那样有效。
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]