从零开始教你舒服的使用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
中国球迷的老熟人,里皮,米卢近况如何?米卢在迪拜晒太阳,他眯着眼睛,嘴含微笑,喃喃自语道什么世界级教练里皮,中国青年才俊李铁,李霄鹏,哪里比得上我这个神奇教练,奇怪中国为什么不请我出山,否则我一定会带领中国队在亚洲赛场
张本智和世界杯取得亚军的好成绩,日本球迷会尊重喜欢他吗?在日本,部分球迷不喜欢也不尊重他。说得第二没有用。还说他是中国的内战。张本智和从小出生在日本,在日本长大,但他父母是中国人,祖籍四川。所以部分日本球迷对他并不感冒,也不喜欢他。对张
有人说王曼昱在世界杯第一轮被淘汰是让球,您认可吗?什么原因都有可能,就是让球不可能,职业道德是要有的,鳗鱼可不是这样的人,偶尔输一次并不一定是坏事。绝对不可能,王曼昱第一轮被淘汰,因为她刚争夺世乒赛冠军,过份兴奋的心态还末平静,加
尿酸高,如何吃肉类?高尿酸痛风还能吃肉吗?选择什么肉类吃?这都是很多高尿酸痛风朋友的困惑,其实完全不必太担忧,高尿酸患者当然是可以吃肉的,但应该坚持两个原则有所选择,适量进食。高尿酸患者如何选择肉类对
癌症越早发现越好吗?我们来看看韩启德院士的原话,韩启德院士在2016年医学与人文高峰论坛上的演讲中说到我并不提倡健康人做癌症筛查,因为早期筛查出癌症后,其实死亡率也并没有降低,这样的检查其实意义真的不
基金现在可以加仓吗,年后一直上涨?这也是最近很困扰我的问题,我也重来不会去听专家分析,重来不会听投资者的建议,个人认为,如果你们都这么厉害早就闷声发大财,那还会有空出来教人赚钱。很多股市大神熊市不出现,一点点牛市行
睡不着了,中了百济神州新股是祸还是福?您就安心睡!不然加价一万卖给我?百济神州是一家研发抗癌药的龙头药企,2016年在美股上市,2018年又在港股上市,这只股是高瓴资本的重仓股,公司成立至今累计亏损300多亿,今年亏损
当领导的不要让人怕你,怕你就离骂你不远了。你认为这话有道理吗?不对。首先要有超前智慧身先士卒以身作则关心下属不怒而威恩威并至奖惩分明。这话说得不无道理。现实中很多这样的领导,刻意与员工保持距离,管理作风亦非常粗暴,员工犯点小错,就被骂的狗血喷
孩子能学会独立,家长们能学会放手吗?如果孩子能自己独立做某件事,我会鼓励他让独立完成,直至养成习惯如果孩子需要再努力一下才能做到某件事,我会在旁边鼓励帮助他完成,让他感受到自信的力量如果孩子想尝试挑战一下从未做过的事
卵泡发育不好的原因是什么?卵泡发育不好的原因是什么?卵泡发育不好的原因主要有卵巢功能早衰卵巢储备功能下降多囊卵巢综合征等。环境改变心理因素垂体的病变也都可能导致卵泡发育不好。卵泡发育不好是指卵泡大小及功能均
电视剧中有些尴尬的穿帮镜头,让人哭笑不得,大家有注意过吗?古装剧最爱穿帮,当然,古装剧的道具准备难度也比现代剧大很多。1大明王朝1566向来以制作精良著称,也难逃穿帮镜头。2剧情明显不符,剧中宁嫔说熹妃回宫时称病未见过熹妃,镜头中却明显出