#spring-boot #redis #spring-data #spring-data-redis #lettuce
#spring-boot #redis #spring-данные #spring-data-redis #салат
Вопрос:
Я использую Spring Data Redis с Kotlin, но без репозиториев Spring data из-за недостатка 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) "xacxedx00x05tx00x0cuuid:test"
2) "xacxedx00x05tx00x10response:test"
Что это за странный строковый префикс? Как я уже сказал, это, похоже, не влияет на извлечение, но мне любопытно.
Spring Data Redis 2.3.5.RELEASE.
Ответ №1:
Оказалось, что это связано с использованием default JdkSerializationRedisSerializer
, и я предполагаю, что странность заключается в метаинформации поля (тип и т.д.). Другие сериализаторы Redis, подобные GenericJackson2JsonRedisSerializer
этому, этого не делают, и данные сохраняются в удобочитаемом формате.