原 荐 kotlin使用spring data redis(二)

栏目: Java · 发布时间: 6年前

原 荐 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(二)

没有更多内容

加载失败,请刷新页面

加载更多

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cracking the Coding Interview

Cracking the Coding Interview

Gayle Laakmann McDowell / CareerCup / 2015-7-1 / USD 39.95

Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hund......一起来看看 《Cracking the Coding Interview》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具