Spring data redis - 如何使用 hashOperation 的 scan 方法根据模式获取键或值?
Posted
技术标签:
【中文标题】Spring data redis - 如何使用 hashOperation 的 scan 方法根据模式获取键或值?【英文标题】:Spring data redis - How to use hashOperation's scan method to get keys or values based on pattern? 【发布时间】:2021-07-25 03:47:43 【问题描述】:我从未在 Redis 和 Spring boot 上工作过。我想用 Redis 作为缓存。
我一直在使用hashOperations
进行获取/设置操作。我已经配置了 RedisTemplate
来阻止奇怪的哈希值被添加到键中。
我有一个名为Post
的类,我正在缓存它。一个用户可以创建多个帖子。密钥生成如下:userId::postId
并且帖子数据被缓存。
如何使用 RedisTemplate 的scan
方法获取特定用户的所有帖子?我试过ScanOptions
和*
模式,但我肯定做错了,因为我没有得到任何数据。 scan
和 ScanOptions
上的链接或 youtube 视频并不多,所以我发现很难实现。
这是我为获取用户的所有帖子而写的:
public List<Post> getPostsByUid(String uid)
String key = uid + "::";
ScanOptions scanOptions = ScanOptions.scanOptions().match("*").count(20).build();
Cursor cursor = hashOperations.scan(key, scanOptions);
List<Post> posts = new ArrayList<>();
while(cursor.hasNext())
posts.add((Post)cursor.next());
return posts;
这是savePost
方法
public Post savePost(Post post)
String key = post.getUid() + "::" + post.getPostid();
hashOperations.put(key, "", post);
return post;
感谢您的帮助!
【问题讨论】:
【参考方案1】:hashOperations.scan
在散列中扫描。但是您想在整个数据库 (Redis) 中进行扫描。
String keyPattern = uid + "::" + "*";
ScanOptions scanOptions = ScanOptions.scanOptions().match(keyPattern).count(20).build();
Cursor c = redisConnection.scan(options); // scanning in db
while (c.hasNext())
// c.next() is Redis key. Use this in hashOperations to get your Post.
【讨论】:
Redis作为缓存时可以使用hashOperations还是只在Redis作为数据库时使用? 总是。 hashOperations 只是意味着操作将在 Redis 哈希数据结构上完成。以上是关于Spring data redis - 如何使用 hashOperation 的 scan 方法根据模式获取键或值?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot && Spring Cloud系列在spring-data-Redis中如何使用切换库
Spring data redis - 如何使用 hashOperation 的 scan 方法根据模式获取键或值?
如何在过期事件中访问spring data redis store对象?
Spring Data with Redis:如何使用不同的 LocalDateTime 格式或不同的转换器?