kotlin使用spring data redis(二)

自定义序列化器

1.标准json序列化器,时间类型禁用时间戳

import com.fasterxml.jackson.core.JsonProcessingException
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import org.springframework.data.redis.serializer.RedisSerializer
import org.springframework.data.redis.serializer.SerializationException

open class Jackson2Serializer : RedisSerializer<Any> {
    private var mapper: ObjectMapper = jacksonObjectMapper()

    init {
        mapper.registerModules(Jdk8Module(), JavaTimeModule())
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
    }

    override fun serialize(t: Any?): ByteArray? {
        if (t == null) {
            return ByteArray(0)
        }

        try {
            return mapper.writeValueAsBytes(t)
        } catch (e: JsonProcessingException) {
            throw SerializationException("Could not write JSON: " + e.message, e)
        }


    }

    override fun deserialize(bytes: ByteArray?): Any? {
        if (bytes == null) {
            return null
        }

        try {
            return mapper.readValue(bytes)
        } catch (e: Exception) {
            throw SerializationException("Could not read JSON: " + e.message, e)
        }
    }

}

2.支持压缩(zstd)

import com.fasterxml.jackson.core.JsonProcessingException
import com.github.luben.zstd.Zstd
import org.springframework.data.redis.serializer.SerializationException
import java.lang.Exception

class Jackson2ZstdSerializer : Jackson2Serializer() {


    override fun serialize(t: Any?): ByteArray? {

        if (t == null) {
            return ByteArray(0)
        }
        try {
            val json = super.serialize(t)
            val compressContent = Zstd.compress(json)
            val compressHeader = "zstd_${json!!.size}_".toByteArray()
            return compressHeader + compressContent
        } catch (e: JsonProcessingException) {
            throw e
        } catch (ex: Exception) {
            throw SerializationException("Could not compress JSON: " + ex.message, ex)
        }
    }

    override fun deserialize(bytes: ByteArray?): Any? {
        if (bytes == null) {
            return null
        }

        try {
            var counter = 0
            bytes.forEachIndexed { index, byte ->
                run {
                    if (byte == '_'.toByte()) {
                        counter++
                        if(counter == 2){
                            counter = index
                            return@forEachIndexed
                        }
                    }
                }
            }


            val compressHeader = bytes.sliceArray(0..counter)
            val compressHeaderString = String(compressHeader)
            if (!compressHeaderString.contains("zstd")) {
                return null
            }
            val originContentLength = "[0-9]+".toRegex().find(compressHeaderString)?.value ?: return null
            val compressContent = bytes.sliceArray((counter + 1)..(bytes.size - 1))
            val decompressLength = if (compressContent.size > originContentLength.length) compressContent.size else originContentLength.length
            val decompressContent = Zstd.decompress(compressContent, decompressLength)
            return super.deserialize(decompressContent)

        } catch (e: Exception) {
            throw SerializationException("Could not read JSON: " + e.message, e)
        }
    }

3.启用Jackson2ZstdSerializer

@Configuration
class RedisCacheAutoConfiguration {

    @Bean
    fun redisTemplate(redisConnectionFactory: LettuceConnectionFactory): RedisTemplate<String, Any> {

        val template = RedisTemplate<String, Any>()
        template.keySerializer = StringRedisSerializer()
        template.valueSerializer = Jackson2ZstdSerializer()
        template.setConnectionFactory(redisConnectionFactory)
        return template
    }
}

4.用起来吧

@Autowired
  private lateinit var redisTemplate: RedisTemplate<String, Any>
  
    redisTemplate.opsForValue().set("aaa","aa",100,TimeUnit.SECONDS)
        val p = Passenger(1,"zhangsan", LocalDateTime.parse("2018-08-09T12:33:22.123"))
        redisTemplate.opsForValue().set("user",p,100,TimeUnit.SECONDS)

5.用Redis Desk Manager看一下

转载于:https://my.oschina.net/weidedong/blog/2218577

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值