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看一下
© 著作权归作者所有
共有人打赏支持
相关文章 最新文章
说明:内容可能有点旧,需要在业务上做权衡。 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
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
没有更多内容
加载失败,请刷新页面
加载更多以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!