正文
kotlin使用spring data redis(二)
原
荐
字数 373
阅读 1
收藏 0
Kotlin fasterxml Spring Jackson Spring Data Redis
开发十年,就只剩下这套Java开发体系了 >>>
自定义序列化器
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看一下
© 著作权归作者所有
共有人打赏支持
粉丝 2
博文 67
码字总数 21409
作品 0
深圳
相关文章 最新文章
说明:内容可能有点旧,需要在业务上做权衡。 Redis的客户端有两种实现方式,一是可以直接调用Jedis来实现,二是可以使用Spring Data Redis,通过Spring的封装来调用。应该使用哪一个呢?基于...
easonjim
2017/11/08
0
0
在我们平时的项目中,大家都知道可以使用 JPA 或者 Mybatis 作为 ORM 层。对 JPA 和 Mybatis 如何进行技术选型? 下面看看大精华总结如下: 最佳回答 首先表达个人观点,JPA必然是首选的。 ...
后海
06/27
0
0
说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点。并且会与一些低版本的Spring有冲突,要看官方文档...
easonjim
2017/10/05
0
0
使用spring data mongodb 如何查询给定多边形内所有坐标点?能否给个使用示例看看?
K哥
04/12
0
0
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库。本文介绍使用Spring Data MongoDB来访问mongodb数据库的几种方法: 使用Query和Criteria类 ...
xiaomin0322
06/28
0
0
没有更多内容
加载失败,请刷新页面
加载更多自定义序列化器 1.标准json序列化器,时间类型禁用时间戳 import com.fasterxml.jackson.core.JsonProcessingExceptionimport com.fasterxml.jackson.databind.ObjectMapperimport com.fa......
weidedong
17分钟前
1
0
导读:Python是目前世界上最流行的编程语言之一。因为: 它容易学习 它用途超广 它有非常多的开源支持(大量的模块和库) 本文作者 Peter Gleeson 是一名数据科学家,日常工作几乎离不开pytho...
酒逢知己千杯少
18分钟前
0
0
9月28日任务 5.1 vim介绍 5.2 vim颜色显示和移动光标 5.3 vim一般模式下移动光标 5.4 vim一般模式下复制、剪切和粘贴 vim工具介绍 系统自带编辑器vi的升级版,是带颜色显示的。 系统最小化安...
robertt15
23分钟前
1
0
测试环境发版,每次登录 jenkins 点构建很麻烦,jenkins的构建触发器可以解决这个问题 配置也不复杂,这里简单记录一下: 1.勾选构建触发器中相应的触发方式,我们用的是 gitlab 2.进入 gitl...
dubox
25分钟前
0
0
业务需求:要将api_name和price拼接到一起并在前端进行展示(api_name和price是api表的两列) 如上图,可使用concat进行
shimmerkaiye
29分钟前
0
0
没有更多内容
加载失败,请刷新页面
加载更多