gpt4 book ai didi

java - 使用分页从redis缓存中检索数据

转载 作者:行者123 更新时间:2023-12-01 16:20:53 25 4
gpt4 key购买 nike

我的redis缓存结构如下

private HashOperations<String, Long, Object> hashOperations;
//put data in cache
hashOperations.put("Key", 1, SomeObject);

我需要使用分页从缓存中获取数据(第一页 50 个结果,第二页接下来 50 个结果,依此类推)。用spring data redis如何实现这一点。如有任何帮助,我们将不胜感激。

最佳答案

如果您需要保证元素的顺序,我认为您将需要某种排序集(HSCAN 是读取整个哈希的好方法,但它不能保证内容的排序它返回并且不保证返回的数据中不会有重复的数据)。唯一符合排序集描述的 Redis 数据类型是:ZSETZSET 具有与 HASH 类似的字段,但是它们的字段内不是字符串值,而是一个 double“分数”,即用于对字段进行排序。

因此,要获得“哈希分页”,您可以做的一件事就是拥有一个具有与 HASH 相同字段的 ZSETHASH 将包含您字段中的数据,ZSET 将跟踪它们的顺序。

ZSET 有一个名为 ZRANGE ( documentation ) 的方法,它允许您从集合中获取特定数量的元素。对于 50 的“页面”大小,它看起来像这样:

# this gets you the "page" with the first 50 elements
ZRANGE 0 50

# this gets you the "page" with the second 50 elements
ZRANGE 50 100

# etc.

因此,要向 zset/hash 添加一些数据,然后获取页面,您可以执行如下操作(伪代码 - 可能无法编译):

RedisTemplate<String, String> redisTemplate;

String myKey = "exampleKey";

// example of adding one record to the HASH + ZSET
String myField = "field1";
String myData = "123ABC";

// in this example data inserted into the ZSET is ordered based on when it was inserted.
// if you want to order it differently you can figure out your own way of coming up with scores
redisTemplate.opsForZSet().add(myKey + "zset", myField, System.getCurrentTimeMillis());
redisTemplate.opsForHash.put(mykey + "hash", myField, myData);

// Get one page from the hash
Set<String> first50hashFields = redisTemplate.opsForZSet().range(myKey + "zset", 0, 50);

List<String> firstPage = LinkedList<>();
for (String hashFieldKey : first50hashFields) {
String hashFieldValue = redisTemplate.opsForHash().get(myKey + "hash", hashFieldKey);

firstPage.add(hashFieldValue);
}

希望全字符串示例足以说明如何完成此操作。

关于java - 使用分页从redis缓存中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62285166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com