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协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
新媒体运营实战技能
张向南 勾俊伟 / 人民邮电出版社 / 2017-5 / 39.80元
《新媒体运营实战技能》共7章。第1章重点介绍了新媒体图片的创意思路及制作技巧,包括微信公众号封面图、信息长图、icon图标、九宫图、gif图片的具体实战操作;第2章重点介绍了创意云文字、微信排版、滑动看图等新媒体文字的排版方法与处理技巧;第3章是新媒体表单,引导读者对表单结构、设计场景及具体应用全面了解;第4章关于H5的创意思路及制作方法,解析了引发H5传播的心理因素,并重点介绍H5的制作工具与具......一起来看看 《新媒体运营实战技能》 这本书的介绍吧!