spring 如何使用Redis模板从Redis获取所有密钥

xpcnnkqh  于 2023-03-07  发布在  Spring
关注(0)|答案(9)|浏览(187)

我已经被这个问题困扰了相当长的一段时间。我想用redis模板从redis获得密钥。我试过这个。redistemplate。keys(“*”);但这什么也取不出来,即使有模式也不起作用
你能告诉我什么是最好的解决办法吗?

j2cgzkjk

j2cgzkjk1#

我刚刚整理了答案,我们在这里看到了。
当我们使用RedisTemplate时,有两种方法可以从Redis获取密钥。

1.直接来自RedisTemplate

Set<String> redisKeys = template.keys("samplekey*"));
// Store the keys in a List
List<String> keysList = new ArrayList<>();
Iterator<String> it = redisKeys.iterator();
while (it.hasNext()) {
       String data = it.next();
       keysList.add(data);
}

注意:您应该已在Bean中使用StringRedisSerializer配置了redisTemplate

  • 如果使用基于Java的Bean配置 *
redisTemplate.setDefaultSerializer(new StringRedisSerializer());
  • 如果使用基于spring.xml的Bean配置 *
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

<!-- redis template definition -->
<bean
    id="redisTemplate"
    class="org.springframework.data.redis.core.RedisTemplate"
    p:connection-factory-ref="jedisConnectionFactory"
    p:keySerializer-ref="stringRedisSerializer"
    />

2.来自JedisconnectionFactory

RedisConnection redisConnection = template.getConnectionFactory().getConnection();
Set<byte[]> redisKeys = redisConnection.keys("samplekey*".getBytes());
List<String> keysList = new ArrayList<>();
Iterator<byte[]> it = redisKeys.iterator();
while (it.hasNext()) {
       byte[] data = (byte[]) it.next();
       keysList.add(new String(data, 0, data.length));
}
redisConnection.close();

如果您不显式关闭这个连接,就会遇到底层jedis连接池耗尽的情况,如https://stackoverflow.com/a/36641934/3884173中所述。

b09cbbtk

b09cbbtk2#

尝试:

Set<byte[]> keys = RedisTemplate.getConnectionFactory().getConnection().keys("*".getBytes());

Iterator<byte[]> it = keys.iterator();

while(it.hasNext()){

    byte[] data = (byte[])it.next();

    System.out.println(new String(data, 0, data.length));
}
imzjd6km

imzjd6km3#

尝试redisTemplate.setKeySerializer(new StringRedisSerializer());

v09wglhw

v09wglhw4#

避免使用keys命令。在对大型数据库执行该命令时,可能会破坏性能。

您应该使用scan命令来代替。下面是您的操作方法:

RedisConnection redisConnection = null;
try {
    redisConnection = redisTemplate.getConnectionFactory().getConnection();
    ScanOptions options = ScanOptions.scanOptions().match("myKey*").count(100).build();

    Cursor c = redisConnection.scan(options);
    while (c.hasNext()) {
        logger.info(new String((byte[]) c.next()));
    }
} finally {
    redisConnection.close(); //Ensure closing this connection.
}

或者使用Redisson Redis Java客户端更简单:

Iterable<String> keysIterator = redisson.getKeys().getKeysByPattern("test*", 100);
for (String key : keysIterator) {
    logger.info(key);
}
s71maibg

s71maibg5#

试试看

import org.springframework.data.redis.core.RedisTemplate;
import org.apache.commons.collections.CollectionUtils;

String key = "example*";
Set keys = redisTemplate.keys(key); 
if (CollectionUtils.isEmpty(keys)) return null;
List list = redisTemplate.opsForValue().multiGet(keys);
7gcisfzg

7gcisfzg6#

它确实有效,但似乎不推荐?因为我们不能在生产中使用Keys命令。我假设RedisTemplate.getConnectionFactory().getConnection().keys正在调用redis Keys命令。有什么替代方案吗?

1wnzp6jl

1wnzp6jl7#

我用的是redisTemplate.keys(),但是它不工作。所以我用了jedis,它工作了。下面是我用的代码。

Jedis jedis = new Jedis("localhost", 6379);
    Set<String> keys = jedis.keys("*".getBytes());
    for (String key : keys) {
        // do something
    } // for
368yc8dk

368yc8dk8#

解决方案可以是这样的

String pattern = "abc"+"*";
Set<String> keys = jedis.keys(pattern);
for (String key : keys) {
    jedis.keys(key);
}

或者您可以使用jedis.hscan()ScanParams

gev0vcfq

gev0vcfq9#

这应该行得通

Jedis jedis = new Jedis("localhost");
String cursor = "0";
ScanParams scanParams = new ScanParams().match("*").count(100);

do {
    ScanResult<String> scanResult = jedis.scan(cursor, scanParams);
    List<String> keys = scanResult.getResult();
    cursor = scanResult.getStringCursor();
    // do something with keys
} while (!cursor.equals("0"));

相关问题