转载

原 荐 kotlin使用spring data redis(二)

weidedong的个人空间 工作日志

正文

原 荐 kotlin使用spring data redis(二)

kotlin使用spring data redis(二)

原 荐 kotlin使用spring data redis(二)
  weidedong 发布于 17分钟前

字数 373

阅读 1

收藏 0

Kotlin fasterxml Spring Jackson Spring Data Redis

开发十年,就只剩下这套Java开发体系了 >>> 原 荐 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看一下

原 荐 kotlin使用spring data redis(二)

© 著作权归作者所有

共有人打赏支持

原 荐 kotlin使用spring data redis(二)

weidedong

粉丝 2

博文 67

码字总数 21409

作品 0

深圳

相关文章 最新文章

Spring Data Redis与Jedis的选择(转)

说明:内容可能有点旧,需要在业务上做权衡。 Redis的客户端有两种实现方式,一是可以直接调用Jedis来实现,二是可以使用Spring Data Redis,通过Spring的封装来调用。应该使用哪一个呢?基于...

easonjim

2017/11/08

0

0

技术专题讨论:如何对 JPA 或者 MyBatis 进行技术选型

在我们平时的项目中,大家都知道可以使用 JPA 或者 Mybatis 作为 ORM 层。对 JPA 和 Mybatis 如何进行技术选型? 下面看看大精华总结如下: 最佳回答 首先表达个人观点,JPA必然是首选的。 ...

后海

06/27

0

0

Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点。并且会与一些低版本的Spring有冲突,要看官方文档...

easonjim

2017/10/05

0

0

spring data mongo如何查询给定多边形内所有坐标点?

使用spring data mongodb 如何查询给定多边形内所有坐标点?能否给个使用示例看看?

K哥

04/12

0

0

使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。本文介绍使用Spring Data MongoDB来访问mongodb数据库的几种方法: 使用Query和Criteria类 ...

xiaomin0322

06/28

0

0

没有更多内容

加载失败,请刷新页面

加载更多
kotlin使用spring data redis(二)

自定义序列化器 1.标准json序列化器,时间类型禁用时间戳 import com.fasterxml.jackson.core.JsonProcessingExceptionimport com.fasterxml.jackson.databind.ObjectMapperimport com.fa......

weidedong

17分钟前

1

0

原 荐 kotlin使用spring data redis(二)
26个你不知道的Python技巧,打包带走!

导读:Python是目前世界上最流行的编程语言之一。因为: 它容易学习 它用途超广 它有非常多的开源支持(大量的模块和库) 本文作者 Peter Gleeson 是一名数据科学家,日常工作几乎离不开pytho...

酒逢知己千杯少

18分钟前

0

0

vim介绍、一般模式操作

9月28日任务 5.1 vim介绍 5.2 vim颜色显示和移动光标 5.3 vim一般模式下移动光标 5.4 vim一般模式下复制、剪切和粘贴 vim工具介绍 系统自带编辑器vi的升级版,是带颜色显示的。 系统最小化安...

robertt15

23分钟前

1

0

Jenkins 配置 gitlab push 自动发版

测试环境发版,每次登录 jenkins 点构建很麻烦,jenkins的构建触发器可以解决这个问题 配置也不复杂,这里简单记录一下: 1.勾选构建触发器中相应的触发方式,我们用的是 gitlab 2.进入 gitl...

dubox

25分钟前

0

0

原 荐 kotlin使用spring data redis(二)
concat的使用

业务需求:要将api_name和price拼接到一起并在前端进行展示(api_name和price是api表的两列) 如上图,可使用concat进行

shimmerkaiye

29分钟前

0

0

原 荐 kotlin使用spring data redis(二)

没有更多内容

加载失败,请刷新页面

加载更多
原文  https://my.oschina.net/weidedong/blog/2218577
正文到此结束
Loading...