使用 Spring Data Redis 将对象映射到哈希

Posted

技术标签:

【中文标题】使用 Spring Data Redis 将对象映射到哈希【英文标题】:Map an object to a hash with Spring Data Redis 【发布时间】:2018-05-20 01:58:50 【问题描述】:

假设我有一个用户类

class User 
    private Long id
    private String username
    private String password

我阅读了一些关于在哈希中使用 redis 存储存储库的文章/教程。

然而,他们对整个“表”都有一个键,放入 redis 的内容如下所示:

user 1 id:1,username:'',password:''
user 2 id:1,username:'',password:''

在这种情况下,他们都有id 作为hash key

我想要实现的是将每个field 用作hash key,如下所示:

user:1 id 1
user:1 username ''
user:1 password ''

经过相当多的时间搜索,我发现Jackson2HashMapper 可能是帮助。但是没有关于如何准确使用这个映射器的文章/文档。

有没有其他人遇到过类似的情况?

【问题讨论】:

您刚刚删除的***.com/q/48294485/6309 的答案是什么? @VonC 原来你应该避免在 nginx 中设置标题“X-Artifactory-Override-Base-Url” 太棒了!将其添加为答案并接受它会帮助其他有同样问题的人;) 【参考方案1】:

我只是这样使用:

@Bean
public HashMapper<Object, byte[], byte[]> hashMapper() 
    return new ObjectHashMapper();


@Component
public class HashMapping<T> 
    @NonNull
    private StringRedisTemplate                stringRedisTemplate;
    @NonNull
    private HashMapper<Object, byte[], byte[]> hashMapper;

    public void writeHash(String key, T t) 
        checkNotNull(key, "hash key cannot be null");
        checkNotNull(t, "hash value cannot be null");
        stringRedisTemplate.execute((RedisCallback<Void>) connection -> 
            Map<byte[], byte[]> mappedHash = hashMapper.toHash(t);
            connection.hMSet(key.getBytes(), mappedHash);
            return null;
        );
    

    public T loadHash(String key) 
        checkNotNull(key, "hash key cannot be null");
        Map<byte[], byte[]> loadedHash = 
stringRedisTemplate.getConnectionFactory()
                .getConnection().hGetAll(key.getBytes());
        return (T) hashMapper.fromHash(loadedHash);
    


【讨论】:

以上是关于使用 Spring Data Redis 将对象映射到哈希的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Data 在 Redis 中查询嵌套对象

Spring 4 中 Websockets 的自定义对象映射器

Spring Data Redis Repository 支持不回读嵌入的复杂对象

Spring对象映射器covertValue方法不转换某些字段

将 Spring Data 的 ReactiveCrudRepository 应用到 Redis

Spring中使用RedisTemplate操作Redis(spring-data-redis)