Question Details

No question body available.

Tags

spring spring-boot kotlin redis

Answers (2)

Accepted Answer Available
Accepted Answer
August 10, 2025 Score: 1 Rep: 3,518 Quality: High Completeness: 80%

If you want to reduce boilerplate code and have ReactiveRedisTemplate for different value types,
then you can create a factory for typed Redis templates - RedisTemplateFactory.
The factory itself can be defined as a Spring Bean:

@Component
class RedisTemplateFactory(
    val connectionFactory: ReactiveRedisConnectionFactory,
    val json: Json
) {
    final inline fun  getTemplate(): ReactiveRedisTemplate {
        val keySerializer = StringRedisSerializer()
        val valueSerializer = KotlinxRedisSerializer(serializer(), json)

val serializationContext = RedisSerializationContext .newSerializationContext() .key(keySerializer) .value(valueSerializer) .hashKey(keySerializer) .hashValue(valueSerializer) .build()

return ReactiveRedisTemplate(connectionFactory, serializationContext) } }

class KotlinxRedisSerializer( private val serializer: KSerializer, private val json: Json = Json ) : RedisSerializer { override fun serialize(t: T?): ByteArray? = t?.let { json.encodeToString(serializer, it).toByteArray(Charsets.UTF8) }

override fun deserialize(bytes: ByteArray?): T? = bytes?.let { json.decodeFromString(serializer, String(it, Charsets.UTF8)) } }

Then you can obtain a Redis template for any required type in your service beans:

@Service
class UserService(
    private val redisTemplateFactory: RedisTemplateFactory
) {
    private val userTemplate by lazy { redisTemplateFactory.getTemplate() }
    private val userTtl = Duration.ofDays(1)

private fun userKey(id: String) = "user:$id"

suspend fun saveUser(userDetails: UserDetails): Boolean = userTemplate .opsForValue() .set(userKey(userDetails.id), userDetails, userTtl) .awaitSingle()

suspend fun getUserById(id: String): UserDetails? = userTemplate .opsForValue() .get(userKey(id)) .awaitSingleOrNull() }

I kept the example minimal,
but you could add the exception handling from your original question and
use the KotlinxRedisSerializer definition from the answer to your other question

August 8, 2025 Score: -2 Rep: 456 Quality: Low Completeness: 80%

Don’t manually serialize JSON with ReactiveRedisTemplate. Instead, create a custom RedisSerializer using Kotlinx Serialization and configure ReactiveRedisTemplate to handle serialization automatically.

Example serializer:

class KotlinxRedisSerializer(
    private val serializer: KSerializer,
    private val json: Json
) : RedisSerializer {
    override fun serialize(t: T?) = t?.let { json.encodeToString(serializer, it).toByteArray() }
    override fun deserialize(bytes: ByteArray?) = bytes?.let { json.decodeFromString(serializer, it.toString(Charsets.UTF_8)) }
}

Configure RedisTemplate:

val context = RedisSerializationContext.newSerializationContext()
    .key(StringRedisSerializer())
    .value(KotlinxRedisSerializer(MyType.serializer(), json))
    .build()

ReactiveRedisTemplate(factory, context)

Benefits:

  • Cleaner service code (no manual JSON encode/decode)
  • Centralized, consistent serialization
  • Better type safety