使用 Spring Data 保存在 Redis 中的值具有奇怪的前缀

Posted

技术标签:

【中文标题】使用 Spring Data 保存在 Redis 中的值具有奇怪的前缀【英文标题】:Values saved in Redis using Spring Data have weird prefixes 【发布时间】:2021-02-24 00:49:37 【问题描述】:

由于DATAREDIS-1250 的缺点,我正在使用带有 Kotlin 的 Spring Data Redis,但没有使用 Spring 数据存储库。 所以,我创建了自己的小存储库。

interface CoroutinesRepository<T : Serializable> 
    suspend fun save(entity: T): T
    suspend fun findByIdOrNull(id: String): T?
    suspend fun deleteById(id: String)

及其实现:

abstract class AbstractCoroutinesRepository<T : Serializable>(clazz: Class<T>) : CoroutinesRepository<T> 
    private val hash: String = clazz.simpleName
        .// convert class name to hyphenated string
    private val idField: Field = clazz.declaredFields
        .// find field with @Id annotation

    @Autowired
    private lateinit var redisTemplate: ReactiveRedisTemplate<Any, Any>
    @Autowired
    private lateinit var persistenceProperties: PersistenceProperties

    override suspend fun save(entity: T): T 
        val valueOps = redisTemplate
            .opsForValue()
        valueOps.set("$hash:$idField.get(entity)", entity, getTtl(persistenceProperties))
            .awaitFirst()
        return entity
    
    // Other methods omitted

用作:

@Repository
class ResponseRepositoryImpl : AbstractCoroutinesRepository<Response>(Response::class.java)

这可行,上面的代码可以从 Redis 设置和获取值。但是,当我从 Redis CLI 查询时,我看到:

127.0.0.1:6379> SCAN 0
1) "0"
2) 1) "\xac\xed\x00\x05t\x00\x0cuuid:test"
   2) "\xac\xed\x00\x05t\x00\x10response:test"

这个奇怪的字符串前缀是什么?正如我所说,它似乎不影响检索,但我很好奇。

Spring Data Redis 2.3.5.RELEASE。

【问题讨论】:

【参考方案1】:

这原来是由于使用了默认的JdkSerializationRedisSerializer,我猜奇怪的是字段元信息(类型等)。 GenericJackson2JsonRedisSerializer 等其他 Redis 序列化程序不这样做,数据以人类可读的格式保存。

【讨论】:

以上是关于使用 Spring Data 保存在 Redis 中的值具有奇怪的前缀的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data Redis 序列化

Spring Session Data Redis实现session共享

spring-data-redis ValueOperations

spring-boot-data-redis,使用redisson作为redis客户端

Spring data redis的使用

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