使用 Spring 数据保存在 Redis 中的值有奇怪的前缀
Values saved in Redis using Spring Data have weird prefixes
我在 Kotlin 中使用 Spring Data Redis,但没有 Spring 数据存储库,因为 DATAREDIS-1250 中的缺点。
所以,我创建了自己的小存储库。
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 数据 Redis 2.3.5.RELEASE.
原来是因为使用了默认 JdkSerializationRedisSerializer
,我猜奇怪的是字段元信息(类型等)。 GenericJackson2JsonRedisSerializer
等其他 Redis 序列化程序不会这样做,数据以人类可读的格式保存。
我在 Kotlin 中使用 Spring Data Redis,但没有 Spring 数据存储库,因为 DATAREDIS-1250 中的缺点。 所以,我创建了自己的小存储库。
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 数据 Redis 2.3.5.RELEASE.
原来是因为使用了默认 JdkSerializationRedisSerializer
,我猜奇怪的是字段元信息(类型等)。 GenericJackson2JsonRedisSerializer
等其他 Redis 序列化程序不会这样做,数据以人类可读的格式保存。