springboot整合redis案例分析-亚博电竞手机版
springboot整合redis案例分析
这篇文章主要介绍了springboot整合redis案例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot整合redis案例分析文章都会有所收获,下面我们一起来看看吧。
springboot整合redis
如果没有redis,就先去下载
下载路径cmd,然后
redis-server.exe redis.windows.conf
命令既可以启动服启动服务后,后面的才可以进行整合
在redis目录下点击redis-cli.exe进行测试结果查看,基本操作如下
key * :查看存储内容
flushdb :清空数据库
如果redis不熟悉去看
undefined
springdata也是和springboot齐名的项目!
说明:在springboot2.x之后,原来使用的jedis被替换为了lettuce
jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedis pool连接池!【类似于bio:同步阻塞io】
lettuce:采用netty【异步请求,性能更高点】,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数量了【类似于nio:同步非阻塞io】
异步请求一般都需要序列化
源码分析:
源码位置:
@bean//当这个bean不存在的时候,这个类就生效//这就说明,我们可以自己定义一个redistemplate来替换这个默认的!@conditionalonmissingbean(name="redistemplate")@conditionalonsinglecandidate(redisconnectionfactory.class)publicredistemplate
上手测试【默认的redistemplate了解】
1.导入依赖
2.配置连接
#springboot所有的配置类,都有一个自动配置类redisautoconfiguration#自动配置类都会绑定一个properties配置文件redispropertiesspring:redis:host:127.0.0.1#redis服务器连接端口port:6379#redis数据库索引(默认为0)database:0#redis服务器连接密码(默认为空)password:#连接池最大连接数(使用负值表示没有限制)pool:max-active:200#连接池最大阻塞等待时间(使用负值表示没有限制)max-wait:-1#连接池中的最大空闲连接max-idle:10#连接池中的最小空闲连接min-idle:0#连接超时时间(毫秒)timeout:1000
3.测试
实际开发中我们都不会用这种原生的方式来编写代码
一般我们会将这些常用的操作编写成工具类:redisutils【后面就会有】
前面还有jdbcutils和mybatisutils等
@springboottestclassredis03springbootapplicationtests{//注入redisautoconfiguration里面配置的类@autowiredpublicredistemplateredistemplate;@testvoidcontextloads(){//redistemplate:操作我们的数据库,api和我们的是一样的//opsforvalue:操作字符串类似string//opsforlist:操作list//除了基本的操作,我们常用的方法都可以直接通过redistemplate进行操作//比如事务和基本的crud//获取redis的连接对象,就可以操作数据库的连接了【一般很少来用】/*redisconnectionconnection=redistemplate.getconnectionfactory().getconnection();connection.flushdb();connection.flushall();*/redistemplate.opsforvalue().set("kami","g1x");system.out.println(redistemplate.opsforvalue().get("kami"));}}
4.结果
问题:写到中文的时候,springboot是正常的,但是从redis中的redis.cli.exe运行keys *
会出来乱码
解决方法:默认的redistemplate没有过多的设置,redis,对象都是需要序列化的!
这是默认的序列化配置
默认序列化方式是jdk序列化
6.这时候我们就需要自己来写配置类
自己写了后,原来默认的redistemplate就会失效
创建一个config
@configurationpublicclassredisconfig{//编写我们自己的redistemplate@beanpublicredistemplate
redistemplate(redisconnectionfactoryredisconnectionfactory){redistemplate template=newredistemplate<>();//这里面到底怎么配置看后面template.setconnectionfactory(redisconnectionfactory);returntemplate;}}
上手测试【自定义的redistemplate——实际一般使用】
1.先创建一个pojo,user
//将它变为组件,方便调用@component@data@allargsconstructor@noargsconstructorpublicclassuser{privatestringname;privateintegerage;}
2.测试类写序列化json对象操作【这里默认的序列化是jdk序列化】
@testpublicvoidtest()throwsjsonprocessingexception{//真实开发中一般都使用json来传递对象,所以要序列化jsonuseruser=newuser("葛",3);//所以要序列化成json对象【变成了json字符串】stringjsonuser=newobjectmapper().writevalueasstring(user);redistemplate.opsforvalue().set("user",jsonuser);system.out.println(redistemplate.opsforvalue().get("user"));}
如果不用上面的序列化json对象操作会报错!
string jsonuser = new objectmapper().writevalueasstring(user);
下面是关于对象的保存,但是一般都是用json对象
解决方法:在实体类中序列化即可【在企业中,我们所有的pojo都会序列化!springboot】
//将它变为组件,方便调用@component@data@allargsconstructor@noargsconstructorpublicclassuserimplementsserializable{privatestringname;privateintegerage;}
3.刚才测试的是默认的序列化(jdk),这时候我们自己写其他方式的序列化
创建一个config
//这里面到底怎么配置看后面jackson2jsonredisserializer
多种序列化方式
写法例子
自己写很费劲,用已经写好的例子即可
连接中有不同地方,复制连接中importcom.fasterxml.jackson.annotation.jsonautodetect;importcom.fasterxml.jackson.annotation.propertyaccessor;importcom.fasterxml.jackson.databind.objectmapper;importorg.springframework.context.annotation.bean;importorg.springframework.context.annotation.configuration;importorg.springframework.data.redis.connection.redisconnectionfactory;importorg.springframework.data.redis.core.redistemplate;importorg.springframework.data.redis.serializer.jackson2jsonredisserializer;importorg.springframework.data.redis.serializer.stringredisserializer;importjava.rmi.unknownhostexception;/***@authorzhangzhixi*/@configurationpublicclassredisconfig{@bean@suppresswarnings("all")publicredistemplate
redistemplate(redisconnectionfactoryredisconnectionfactory)throwsunknownhostexception{//自定义stringobjectredistemplate template=newredistemplate();template.setconnectionfactory(redisconnectionfactory);//json序列化配置jackson2jsonredisserializer 企业中直接拿去使用即可
编写工具类
packagecom.kami.utils;/***@authorzhangzhixi*@date2021/3/123:33*/importorg.springframework.beans.factory.annotation.autowired;importorg.springframework.data.redis.core.redistemplate;importorg.springframework.stereotype.component;importorg.springframework.util.collectionutils;importjava.util.list;importjava.util.map;importjava.util.set;importjava.util.concurrent.timeunit;/***@authormxz*/@componentpublicfinalclassredisutil{@autowiredprivateredistemplate
redistemplate;/***指定缓存失效时间**@paramkey键*@paramtime时间(秒)*@return*/publicbooleanexpire(stringkey,longtime){try{if(time>0){redistemplate.expire(key,time,timeunit.seconds);}returntrue;}catch(exceptione){e.printstacktrace();returnfalse;}}/***根据key获取过期时间**@paramkey键(不能为null)*@return时间(秒)返回0代表永久有效*/publiclonggetexpire(stringkey){returnredistemplate.getexpire(key,timeunit.seconds);}/***判断key是否存在**@paramkey键(不能为null)*@returntrue存在false不存在*/publicbooleanhashkey(stringkey){try{returnredistemplate.haskey(key);}catch(exceptione){e.printstacktrace();returnfalse;}}/***删除缓存**@paramkey可以传一个值或多个*/publicvoiddel(string...key){if(key!=null&&key.length>0){redistemplate.delete(key[0]);}else{redistemplate.delete(collectionutils.arraytolist(key));}}//==================================string====================================/***普通缓存获取**@paramkey键*@return值*/publicobjectget(stringkey){returnkey==null?null:redistemplate.opsforvalue().get(key);}/***普通缓存放入**@paramkey键*@paramvalue值*@returntrue成功false失败*/publicbooleanset(stringkey,objectvalue){try{redistemplate.opsforvalue().set(key,value);returntrue;}catch(exceptione){e.printstacktrace();returnfalse;}}/***普通缓存放入并设置时间**@paramkey键*@paramvalue值*@paramtime时间(秒)time>0若time<=0将设置无限期*@returntrue成功false失败*/publicbooleanset(stringkey,objectvalue,longtime){try{if(time>0){redistemplate.opsforvalue().set(key,value,time,timeunit.seconds);}else{set(key,value);}returntrue;}catch(exceptione){e.printstacktrace();returnfalse;}}/***递增**@paramkey键*@paramdelta要增加几(大于0)*@return*/publiclongincr(stringkey,longdelta){if(delta<0){thrownewruntimeexception("递增因子必须大于0");}returnredistemplate.opsforvalue().increment(key,delta);}/***递减**@paramkey键*@paramdelta要减少几(小于0)*@return*/publiclongdecr(stringkey,longdelta){if(delta<0){thrownewruntimeexception("递减因子必须大于0");}returnredistemplate.opsforvalue().decrement(key,delta);}//================================map=================================/***hashget**@paramkey键不能为null*@paramitem项不能为null*/publicobjecthget(stringkey,stringitem){returnredistemplate.opsforhash().get(key,item);}/***获取hashkey对应的所有键值**@paramkey键*@return对应的多个键值*/publicmap hmget(stringkey){returnredistemplate.opsforhash().entries(key);}/***hashset**@paramkey键*@parammap对应多个键值*/publicbooleanhmset(stringkey,map map){try{redistemplate.opsforhash().putall(key,map);returntrue;}catch(exceptione){e.printstacktrace();returnfalse;}}/***hashset并设置时间**@paramkey键*@parammap对应多个键值*@paramtime时间(秒)*@returntrue成功false失败*/publicbooleanhmset(stringkey,map map,longtime){try{redistemplate.opsforhash().putall(key,map);if(time>0){expire(key,time);}returntrue;}catch(exceptione){e.printstacktrace();returnfalse;}}/***向一张hash表中放入数据,如果不存在将创建**@paramkey键*@paramitem项*@paramvalue值*@returntrue成功false失败*/publicbooleanhset(stringkey,stringitem,objectvalue){try{redistemplate.opsforhash().put(key,item,value);returntrue;}catch(exceptione){e.printstacktrace();returnfalse;}}/***向一张hash表中放入数据,如果不存在将创建**@paramkey键*@paramitem项*@paramvalue值*@paramtime时间(秒)注意:如果已存在的hash表有时间,这里将会替换原有的时间*@returntrue成功false失败*/publicbooleanhset(stringkey,stringitem,objectvalue,longtime){try{redistemplate.opsforhash().put(key,item,value);if(time>0){expire(key,time);}returntrue;}catch(exceptione){e.printstacktrace();returnfalse;}}/***删除hash表中的值**@paramkey键不能为null*@paramitem项可以使多个不能为null*/publicvoidhdel(stringkey,object...item){redistemplate.opsforhash().delete(key,item);}/***判断hash表中是否有该项的值**@paramkey键不能为null*@paramitem项不能为null*@returntrue存在false不存在*/publicbooleanhhaskey(stringkey,stringitem){returnredistemplate.opsforhash().haskey(key,item);}/***hash递增如果不存在,就会创建一个并把新增后的值返回**@paramkey键*@paramitem项*@paramby要增加几(大于0)*/publicdoublehincr(stringkey,stringitem,doubleby){returnredistemplate.opsforhash().increment(key,item,by);}/***hash递减**@paramkey键*@paramitem项*@paramby要减少记(小于0)*/publicdoublehdecr(stringkey,stringitem,doubleby){returnredistemplate.opsforhash().increment(key,item,-by);}//============================set=============================/***根据key获取set中的所有值**@paramkey键*/publicset 我们真实的分发中,或者在你们的公司,一般都可以看到一个公司自己封装redisutil
转到测试类
@springboottestclassredis02springbootapplicationtests{@autowired//指定我们自己定义的redis序列化配置privateredistemplate
redistemplate;@autowiredprivateredisutilredisutil;@testvoidtest1(){//清空数据库redistemplate.getconnectionfactory().getconnection().flushdb();useruser=newuser("zhangsha",23);redisutil.set("user",user);system.out.println(redisutil.get("user"));}} 这时候注入的
redistemplate
需要导入的是我们的结果就是输出前加了转译【不再是乱码】
redis目录中的
redis-cle.exe
执行结果
关于“springboot整合redis案例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“springboot整合redis案例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道。