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* 模式,但我肯定做错了,因为我没有得到任何数据。 scanScanOptions 上的链接或 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 格式或不同的转换器?

如何将默认过期的 RedisCacheManager 迁移到 Spring Data Redis 2.0?

谈谈spring-boot-starter-data-redis序列化