纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

从零开始教你舒服的使用RedisTemplate操作Redi

12月8日 飞虹谷投稿
  SpringBoot快速操作Redis数据
  在SpringBoot框架中提供了springbootstarterdataredis的依赖组件进行操作Redis服务,当引入了该组件之后,只需要配置Redis的配置即可进行链接Redis服务并且进行操作Redis服务数据。
  针对于不同的版本有了不同的底层客户端的支持的底层客户端框架是不同的:目前常见的客户端为Jedis和Lettuce。低版本SpringBoot支持的Jedis
  Jedis是很常用的Redis的Java实现的客户端。支持基本的数据类型如:String、Hash、List、Set、SortedSet。
  特点:使用阻塞的IO,方法调用同步,程序流需要等到socket处理完IO才能执行,不支持异步操作。Jedis客户端实例不是线程安全的,需要通过连接池来使用Jedis。高版本版本SpringBoot支持的Lettuce
  Lettuce客户端主要用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。
  基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作。springdataredis针对jedis提供了如下功能:
  SpringBoot的springbootstarterdataredis为Redis的相关操作提供了一个高度封装的RedisTemplate类,而且对每种类型的数据结构都进行了归类,实现连接池自动管理,提供了一个高度封装的RedisTemplate类。针对jedisLettuce客户端中大量api进行了归类封装,将同一类型操作封装为operation接口。通用的接口类型工厂方法
  提供了对key的bound(绑定)便捷化操作API,可以通过bound封装指定的key,然后进行一系列的操作而无须显式的再次指定Key,即BoundKeyOperations:
  ValueOperationsBoundValueOperations:String类型的简单KV操作SetOperationsBoundSetOperations:set类型数据操作ZSetOperationsBoundListOperations:zset类型数据操作HashOperationsBoundSetOperations:针对map类型的数据操作ListOperationsBoundHashOperations:针对list类型的数据操作序列化反序列化的扩展机制
  针对数据的序列化反序列化,提供了多种可选择策略(RedisSerializer)
  JdkSerializationRedisSerializer
  POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStreamObjectOutputStream进行序列化操作,最终redisserver中将存储字节序列。是目前最常用的序列化策略。StringRedisSerializer
  Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是newString(bytes,charset)和string。getBytes(charset)的直接封装。是最轻量级和高效的策略。JacksonJsonRedisSerializer
  jacksonjson工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jacksonmapperasl工具支持】Jackson2JsonRedisSerializer
  使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍,不需要实现Serializable接口。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(。class对象)。通过查看源代码,发现其只在反序列化过程中用到了类型信息。OxmSerializer
  提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率最低;不建议使用。【需要springoxm模块的支持】扩展第三方序列化工具
  当然了除了以上这几种基本的序列化器之外您还可以进行自定义一些更加优秀、速度更块的序列化方式,例如:FastJsonRedisSerializer和KryoRedisSerializer、FSTRedisSerializer等。RedisSerializer接口
  RedisSerializer基础接口定义了将对象转换为字节数组(二进制数据)的序列化和反序列化方法。建议将实现设计为在序列化和反序列化端处理空对象空字节数组。注意,Redis不接受空键或空值,但可以返回null(对于不存在的键)。RedisSerializer接口方法定义
  序列化
  序列化方法定义如下:
  javabyte〔〕serialize(Tt)
  该方法将给定对象t序列化为二进制数据,及字节数组。注意:对象t和返回值可以为null。反序列化
  反序列化方法定义如下:
  javaTdeserialize(byte〔〕bytes)
  该方法将从给定的二进制数据(字节数组)反序列化为一个对象。注意:bytes字节数组和返回值T均可以为null。
  注意:如果上面的serialize()和deserialize()方法在执行时报错,将抛出org。springframework。data。redis。serializer。SerializationException异常。引入springbootstarterdataredis组件
  springboot与redis的整合,pom文件,依赖如下:
  xmldependencygroupIdorg。springframework。bootgroupIdspringbootstarterdataredisartifactIddependency配置对应的application。properties文件
  针对于配置我们按照jedis的配置为基础案例,如下所示。
  propertiesRedis数据库索引(默认为0)spring。redis。database0Redis服务器地址spring。redis。host127。0。0。1Redis服务器连接端口spring。redis。port6379Redis服务器连接密码(默认为空)spring。redis。password连接池最大连接数(使用负值表示没有限制)spring。redis。pool。maxactive8连接池最大阻塞等待时间(使用负值表示没有限制)spring。redis。pool。maxwait1连接池中的最大空闲连接spring。redis。pool。maxidle8连接池中的最小空闲连接spring。redis。pool。minidle0连接超时时间(毫秒)spring。redis。timeout0对应的SpringBootRedis的核心配置类
  此处需要定义RedisTemplate对象的配置类,其中需要配置对应的RedisConnectionFactory对象类以及对应类型的序列化和反序列化组件起。如下所示定义对应的redisTemplate对象类
  默认是JDK的序列化策略,这里配置redisTemplate采用的是Jackson2JsonRedisSerializer的序列化策略,参数为redisConnectionFactory。
  javaBeanpublicRedisTemplateString,ObjectredisTemplate(RedisConnectionFactoryredisConnectionFactory){使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)Jackson2JsonRedisSerializerObjectjackson2JsonRedisSerializernewJackson2JsonRedisSerializer(Object。class);ObjectMapperomnewObjectMapper();指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和publicom。setVisibility(PropertyAccessor。ALL,JsonAutoDetect。Visibility。ANY);指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会抛出异常om。enableDefaultTyping(ObjectMapper。DefaultTyping。NONFINAL);jackson2JsonRedisSerializer。setObjectMapper(om);RedisTemplateString,ObjectredisTemplatenewRedisTemplate();配置连接工厂redisTemplate。setConnectionFactory(redisConnectionFactory);使用StringRedisSerializer来序列化和反序列化redis的key值redisTemplate。setKeySerializer(newStringRedisSerializer());redisTemplate。setKeySerializer(jackson2JsonRedisSerializer);值采用json序列化redisTemplate。setValueSerializer(jackson2JsonRedisSerializer);redisTemplate。setHashKeySerializer(jackson2JsonRedisSerializer);redisTemplate。setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate。afterPropertiesSet();returnredisT}定义对应的StringRedisTemplate对象类
  但是对于string类型的数据,SpringBoot还专门提供了StringRedisTemplate类,而且官方也建议使用该类来操作String类型的数据。stringRedisTemplate默认采用的是String的序列化策略。
  javaBeanpublicStringRedisTemplatestringRedisTemplate(RedisConnectionFactoryredisConnectionFactory){StringRedisTemplatestringRedisTemplatenewStringRedisTemplate();stringRedisTemplate。setConnectionFactory(redisConnectionFactory);returnstringRedisT}StringRedisTemplate和RedisTemplate又有啥区别呢?RedisTemplate是一个泛型类,而StringRedisTemplate不是,后者只能对键和值都为String类型的数据进行操作,而前者则可以操作任何类型。两者的数据是不共通的,StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。定义组合序列化方式
  key采用String序列化,value使用jackson序列化,如下代码所示。
  javaBeanpublicRedisTemplateString,ObjectredisTemplate(RedisConnectionFactoryfactory){RedisTemplateString,ObjecttemplatenewRedisTemplateString,Object();template。setConnectionFactory(factory);Jackson2JsonRedisSerializerjackson2JsonRedisSerializernewJackson2JsonRedisSerializer(Object。class);ObjectMapperomnewObjectMapper();om。setVisibility(PropertyAccessor。ALL,JsonAutoDetect。Visibility。ANY);om。enableDefaultTyping(ObjectMapper。DefaultTyping。NONFINAL);jackson2JsonRedisSerializer。setObjectMapper(om);StringRedisSerializerstringRedisSerializernewStringRedisSerializer();key采用String的序列化方式template。setKeySerializer(stringRedisSerializer);hash的key也采用String的序列化方式template。setHashKeySerializer(stringRedisSerializer);value序列化方式采用jacksontemplate。setValueSerializer(jackson2JsonRedisSerializer);hash的value序列化方式采用jacksontemplate。setHashValueSerializer(jackson2JsonRedisSerializer);template。afterPropertiesSet();}定义RedisTemplate的脚手架
  将形成一个快速操作数据的工具类,将各种类型的操作类进行封装处理控制。HashOperations:对hash类型的数据操作ValueOperations:对redis字符串类型数据操作ListOperations:对链表类型的数据操作SetOperations:对无序集合类型的数据操作ZSetOperations:对有序集合类型的数据操作
  将以上各种类型的类直接进行暴漏,减少调用链路的路径长度。
  java对hash类型的数据操作paramredisTemplatereturnBeanpublicHashOperationsString,String,ObjecthashOperations(RedisTemplateString,ObjectredisTemplate){returnredisTemplate。opsForHash();}对redis字符串类型数据操作paramredisTemplatereturnBeanpublicValueOperationsString,ObjectvalueOperations(RedisTemplateString,ObjectredisTemplate){returnredisTemplate。opsForValue();}对链表类型的数据操作paramredisTemplatereturnBeanpublicListOperationsString,ObjectlistOperations(RedisTemplateString,ObjectredisTemplate){returnredisTemplate。opsForList();}对无序集合类型的数据操作paramredisTemplatereturnBeanpublicSetOperationsString,ObjectsetOperations(RedisTemplateString,ObjectredisTemplate){returnredisTemplate。opsForSet();}对有序集合类型的数据操作paramredisTemplatereturnBeanpublicZSetOperationsString,ObjectzSetOperations(RedisTemplateString,ObjectredisTemplate){returnredisTemplate。opsForZSet();}定义基础层的操作处理定义RedisSupport
  除了以上这几种类型的操作之外,还有一些基础相关的核心操作类,包含重命名,转移以及情况整个库的操作、设置TTL生命周期等。
  javaComponentpublicclassRedisSupport{AutowiredprivateRedisTemplateString,StringredisT默认过期时长,单位:秒publicstaticfinallongDEFAULTEXPIRE606024;不设置过期时长publicstaticfinallongNOTEXPIRE1;publicbooleanexistsKey(Stringkey){returnredisTemplate。hasKey(key);}重名名key,如果newKey已经存在,则newKey的原值被覆盖paramoldKeyparamnewKeypublicvoidrenameKey(StringoldKey,StringnewKey){redisTemplate。rename(oldKey,newKey);}newKey不存在时才重命名paramoldKeyparamnewKeyreturn修改成功返回truepublicbooleanrenameKeyNotExist(StringoldKey,StringnewKey){returnredisTemplate。renameIfAbsent(oldKey,newKey);}删除keyparamkeypublicvoiddeleteKey(Stringkey){redisTemplate。delete(key);}删除多个keyparamkeyspublicvoiddeleteKey(String。。。keys){SetStringkSetStream。of(keys)。map(kk)。collect(Collectors。toSet());redisTemplate。delete(kSet);}删除Key的集合paramkeyspublicvoiddeleteKey(CollectionStringkeys){SetStringkSetkeys。stream()。map(kk)。collect(Collectors。toSet());redisTemplate。delete(kSet);}设置key的生命周期paramkeyparamtimeparamtimeUnitpublicvoidexpireKey(Stringkey,longtime,TimeUnittimeUnit){redisTemplate。expire(key,time,timeUnit);}指定key在指定的日期过期paramkeyparamdatepublicvoidexpireKeyAt(Stringkey,Datedate){redisTemplate。expireAt(key,date);}查询key的生命周期paramkeyparamtimeUnitreturnpubliclonggetKeyExpire(Stringkey,TimeUnittimeUnit){returnredisTemplate。getExpire(key,timeUnit);}将key设置为永久有效paramkeypublicvoidpersistKey(Stringkey){redisTemplate。persist(key);}}
  至此整体对应的RedisTemplate对象的封装和扩展就到这里,可以把代码介入到你的项目里面,非常方便的进行操作Redis了,是不是很OK呢?
  原文链接:https:www。cnblogs。comlibowarep17035032。html
投诉 评论 转载

七月份可以种火龙果吗?火龙果什么时候种植?火龙果是一种非常好的额水果,里面的籽含有丰富的营养物质,可以直接食用。因此,喜欢吃火龙果的人可以尝试自己种植。那么,七月份可以种火龙果吗?火龙果什么时候种植?七月份可以种火龙果……六月份能种丝瓜吗?丝瓜几月份种植?丝瓜的播种分为冬夏两季,夏季的温度和光照十分适合丝瓜的生长。如今正是夏季六月。那么,六月份能种丝瓜吗?丝瓜几月份种植?六月份能种丝瓜吗丝瓜栽培季节1、冬春栽培:11……怀孕能吃火锅吗火锅孕妇可以吃吗孕妇在怀孕期间由于身体激素变化,会出现胃口不佳,口味异常的情况。有许多孕妇在吃不下饭的时候,特别想吃麻辣鲜香的火锅。那么,究竟孕妇能不能吃火锅呢?今天就跟大家介绍一下,孕妇吃火……15岁变声正常吗?女生15岁才变声正不正常?进入青春期之后人的声音也会随着身体的变化一起进行,你会发现自己原来稚嫩的声音开始越来越成熟,男生是最为明显的,声音会越来越低沉,女生的声音则会越来越羹尖更细在变声期的时候可能会……电解质水卖断货Z世代成功能饮料消费主力军来源:【消费日报】电解质水可能没想到,有一天会成为超市最畅销的饮品。近期,随着进一步优化落实疫情防控新十条措施的出台,人们对常用药物及辅助产品的需求明显增长,被视为安慰剂……2022买手机眼光要放长远,这三款一步到位,轻松用四五年2022买手机眼光要放长远,这三款一步到位,轻松用四五年!RedmiK50RedmiK50采用了天玑8100处理器,8GB内存和128GB存储的组合,相比骁龙870,天玑……丽江市古城区入选春天最受喜爱的乡村旅游目的地TOP10来源:【云南日报】3月初,由文化和旅游部资源开发司指导、抖音公益和抖音生活服务联合发起的遇见春天活动,是文化和旅游部美好乡村等你来乡村旅游数字提升行动的首期春季乡村旅游推……从零开始教你舒服的使用RedisTemplate操作RediSpringBoot快速操作Redis数据在SpringBoot框架中提供了springbootstarterdataredis的依赖组件进行操作Redis服务,当引入了……员工转正领导意见员工转正领导意见怎么写?下面请参考公文站小编给大家整理收集的员工转正领导意见,希望对大家有帮助。员工转正领导意见【一】1、xxx同学工作积极主动,学习认真,尊敬师长,待人……怀孕后爱吃肉是怎么回事?怀孕后爱吃肉正常吗?怀孕后妈妈的饮食口味会有所变化,有些孕妇会比较的爱吃肉。那么怀孕后爱吃肉是怎么回事?怀孕后爱吃肉正常吗?怀孕后爱吃肉的原因有些人怀孕后会出现口味变化的,这是正常的。……3月份开什么花?3月份开的花有哪些?春天正是百花齐放的季节,三月份已经进入春天有一段时间了,各种花也开始开放了,到处花香四溢。那么,3月份开什么花?3月份开的花有哪些?3月份开什么花1、梅花,是蔷薇科杏属梅……六月份可以种生菜吗?夏天可以种生菜吗?生菜是一种四季都比较常见的蔬菜,夏天的蔬菜凉拌一下就可以吃了。因此,夏季的需求量还是蛮大的。那么,六月份可以种生菜吗?夏天可以种生菜吗?六月份可以种生菜吗夏季遮阳网覆盖栽……
五年级数学整数乘法推广到小数教学反思第1课祖国境内的远古居民见微知著造句给予是快乐的第二课时的优秀教学设计背书的造句利用科学研究纲领引导教学设计的理论研究我的家在这里教案初中化学肥料教案小班活动有用的小布垫教案音乐教案作者李祎娜中东教案五霸的解释及造句
能够在微博上获得产品公司回复的用户更愿意消费李小萌为什么不接吻戏不接吻戏女明星都有谁?帝舵是一个怎样的腕表品牌?和劳力士有什么关系?小狗钱钱读后感染发后身上过敏怎么办如何查看手机的CPU和GPU型号在2022年NBA选秀大会上,班切罗上演了令人震惊的剧情转折至In非主流假发轻松打造韩国萌妹风格,发型站美发推荐非主流假华为watch3怎么更新版本在哪更新版本残影空间电影带你了解这位时尚辣妈戚薇的秘密武器老师生病了陈平:“民富国强”与“国泰民安”的两条道路之争谈起

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形