专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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

  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,apachexmlbeans;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();returnredisTemplate;}定义对应的StringRedisTemplate对象类
  但是对于string类型的数据,SpringBoot还专门提供了StringRedisTemplate类,而且官方也建议使用该类来操作String类型的数据。stringRedisTemplate默认采用的是String的序列化策略。
  javaBeanpublicStringRedisTemplatestringRedisTemplate(RedisConnectionFactoryredisConnectionFactory){StringRedisTemplatestringRedisTemplatenewStringRedisTemplate();stringRedisTemplate。setConnectionFactory(redisConnectionFactory);returnstringRedisTemplate;}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();returntemplate;}定义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,StringredisTemplate;默认过期时长,单位:秒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

雅安水面说实话,我很担心雅安面馆老板的精神状态!预警!这可能是一篇非常容易引起吵嘴的稿子因为今天我们要来聊聊雅安的水面对!水面至于为啥子是水面而不是挞挞面榨榨面烩面?请看下面这篇稿子说起雅安好吃的水面每个人都有自己心目中的天花板下次ChatGPT出现在中国的概率有多大?会是伯乐和千里马的故事吗网上这段时间讨论ChatGPT非常火爆,风头几乎盖过了马斯克的星链计划火星殖民和脑机接口,似乎又一场科技革命即将到来,如果说马斯克影响的是人类的未来,那么ChatGPT颠覆的就是现詹姆斯复出打替补得到19分5失误,湖人不敌公牛湖人主场108118不敌公牛。勒布朗詹姆斯在连续缺席13场比赛后复出,生涯第二次打替补。特洛伊布朗开场命中三分,公牛回敬一波70。戴维斯连续篮下得分,特洛伊布朗再进三分,湖人取得领他用漫画当日记,却画出人生最好的状态人间小满人生最好的状态是怎样的?常言,月圆则亏,水溢则满。人生在世,总在跌跌撞撞向前,一直在追求,或为名利,或为富贵,最终被夹在世俗的单行道,走不远,却也回不去。就这样,身不由己,言不由衷烟台公交明日开通杏花谷赏花定制专线,票价1元,接驳免费!记者于洋通讯员王柯然为进一步丰富乘公交游烟台文旅品牌内涵,方便市民到牟平区十里杏花谷景区赏花踏青,助力烟台旅游经济发展,3月26日,烟台公交开通1条杏花谷赏花定制专线和2条杏花谷接明日操作分析(3月27日周一)日线2885(11月1日开始)日线1浪上涨83天(空间28853342457)日线2浪调整(2浪A9天时间空间33423224118)(2浪B7天时间空间3224328662)今天三连胜西部第八!湖人战胜雷霆重回正轨,本赛季夺冠概率飙升北京时间3月25日NBA常规赛还在如火如荼的进行中。而且就在不久前结束的一场西部焦点大战中,湖人主场经过四节的比拼最终是以5分的分差战胜了雷霆队。当然本场比赛对于两支球队来说都是非雷霆亚历山大我从来不喜欢詹姆斯的比赛,他靠身体我靠技术而雷霆队当家球星亚历山大本赛季可谓是炙手可热,场均能够拿到31。4分4。8篮板5。5助攻,投篮和三分命中率分别是51和34。9,生涯首次入选全明星,在他的带领下,雷霆队取得了相当大东契奇34108独行侠不敌残阵黄蜂痛失卡位关键战!NBA常规赛3月25日继续进行,本场鲍尔罗齐尔和乌布雷缺阵,独行侠这边哈达威不打。最终,黄蜂以117109战胜独行侠,独行侠遭遇3连败。此战过后独行侠以36胜38负从西部第8暂时掉阿根廷在非正式友谊赛中4科雷亚双响直播吧3月25日讯ESPN记者JuanPatricioBalbi报道,阿根廷国家队和河床踢了一场非正式友谊赛,阿根廷国家队41击败了对手。本场比赛时长60分钟,分上下半场,两队都有喜忧参半!泰山放弃25岁外援,将签30岁归化球员山东泰山队已经签约了四五名本土球员,这几名球员基本都有国字号经历,实力还是响当当的。山东媒体报道,泰山队的引援还没有停止,未来还将引进三四名本土球员。那么山东队在外援方面会有新的面
中国球迷的老熟人,里皮,米卢近况如何?米卢在迪拜晒太阳,他眯着眼睛,嘴含微笑,喃喃自语道什么世界级教练里皮,中国青年才俊李铁,李霄鹏,哪里比得上我这个神奇教练,奇怪中国为什么不请我出山,否则我一定会带领中国队在亚洲赛场张本智和世界杯取得亚军的好成绩,日本球迷会尊重喜欢他吗?在日本,部分球迷不喜欢也不尊重他。说得第二没有用。还说他是中国的内战。张本智和从小出生在日本,在日本长大,但他父母是中国人,祖籍四川。所以部分日本球迷对他并不感冒,也不喜欢他。对张有人说王曼昱在世界杯第一轮被淘汰是让球,您认可吗?什么原因都有可能,就是让球不可能,职业道德是要有的,鳗鱼可不是这样的人,偶尔输一次并不一定是坏事。绝对不可能,王曼昱第一轮被淘汰,因为她刚争夺世乒赛冠军,过份兴奋的心态还末平静,加尿酸高,如何吃肉类?高尿酸痛风还能吃肉吗?选择什么肉类吃?这都是很多高尿酸痛风朋友的困惑,其实完全不必太担忧,高尿酸患者当然是可以吃肉的,但应该坚持两个原则有所选择,适量进食。高尿酸患者如何选择肉类对癌症越早发现越好吗?我们来看看韩启德院士的原话,韩启德院士在2016年医学与人文高峰论坛上的演讲中说到我并不提倡健康人做癌症筛查,因为早期筛查出癌症后,其实死亡率也并没有降低,这样的检查其实意义真的不基金现在可以加仓吗,年后一直上涨?这也是最近很困扰我的问题,我也重来不会去听专家分析,重来不会听投资者的建议,个人认为,如果你们都这么厉害早就闷声发大财,那还会有空出来教人赚钱。很多股市大神熊市不出现,一点点牛市行睡不着了,中了百济神州新股是祸还是福?您就安心睡!不然加价一万卖给我?百济神州是一家研发抗癌药的龙头药企,2016年在美股上市,2018年又在港股上市,这只股是高瓴资本的重仓股,公司成立至今累计亏损300多亿,今年亏损当领导的不要让人怕你,怕你就离骂你不远了。你认为这话有道理吗?不对。首先要有超前智慧身先士卒以身作则关心下属不怒而威恩威并至奖惩分明。这话说得不无道理。现实中很多这样的领导,刻意与员工保持距离,管理作风亦非常粗暴,员工犯点小错,就被骂的狗血喷孩子能学会独立,家长们能学会放手吗?如果孩子能自己独立做某件事,我会鼓励他让独立完成,直至养成习惯如果孩子需要再努力一下才能做到某件事,我会在旁边鼓励帮助他完成,让他感受到自信的力量如果孩子想尝试挑战一下从未做过的事卵泡发育不好的原因是什么?卵泡发育不好的原因是什么?卵泡发育不好的原因主要有卵巢功能早衰卵巢储备功能下降多囊卵巢综合征等。环境改变心理因素垂体的病变也都可能导致卵泡发育不好。卵泡发育不好是指卵泡大小及功能均电视剧中有些尴尬的穿帮镜头,让人哭笑不得,大家有注意过吗?古装剧最爱穿帮,当然,古装剧的道具准备难度也比现代剧大很多。1大明王朝1566向来以制作精良著称,也难逃穿帮镜头。2剧情明显不符,剧中宁嫔说熹妃回宫时称病未见过熹妃,镜头中却明显出
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网