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)publicredistemplateredistemplate(redisconnectionfactoryredisconnectionfactory){//默认的redistemplate没有过多的设置,redis,对象都是需要序列化的!//两个泛型都是object类型,我们后面使用需要强制转换:我们需要的类型redistemplatetemplate=newredistemplate<>();template.setconnectionfactory(redisconnectionfactory);returntemplate;}@bean@conditionalonmissingbean//由于string是redis最常用的类型,所以说单独提出来了一个bean@conditionalonsinglecandidate(redisconnectionfactory.class)publicstringredistemplatestringredistemplate(redisconnectionfactoryredisconnectionfactory){stringredistemplatetemplate=newstringredistemplate();template.setconnectionfactory(redisconnectionfactory);returntemplate;}

上手测试【默认的redistemplate了解】

1.导入依赖

org.springframework.bootspring-boot-starter-data-redisorg.springframework.bootspring-boot-starter-data-redisio.lettucelettuce-coreredis.clientsjedis

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@beanpublicredistemplateredistemplate(redisconnectionfactoryredisconnectionfactory){redistemplatetemplate=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),这时候我们自己写其他方式的序列化

  1. 创建一个config

  2. //这里面到底怎么配置看后面jackson2jsonredisserializer

    • 多种序列化方式

    1. 写法例子

  3. 自己写很费劲,用已经写好的例子即可

    连接中有不同地方,复制连接中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")publicredistemplateredistemplate(redisconnectionfactoryredisconnectionfactory)throwsunknownhostexception{//自定义stringobjectredistemplatetemplate=newredistemplate();template.setconnectionfactory(redisconnectionfactory);//json序列化配置jackson2jsonredisserializer

    • 企业中直接拿去使用即可

  4. 编写工具类

    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{@autowiredprivateredistemplateredistemplate;/***指定缓存失效时间**@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对应的多个键值*/publicmaphmget(stringkey){returnredistemplate.opsforhash().entries(key);}/***hashset**@paramkey键*@parammap对应多个键值*/publicbooleanhmset(stringkey,mapmap){try{redistemplate.opsforhash().putall(key,map);returntrue;}catch(exceptione){e.printstacktrace();returnfalse;}}/***hashset并设置时间**@paramkey键*@parammap对应多个键值*@paramtime时间(秒)*@returntrue成功false失败*/publicbooleanhmset(stringkey,mapmap,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

  5. 转到测试类

    @springboottestclassredis02springbootapplicationtests{@autowired//指定我们自己定义的redis序列化配置privateredistemplateredistemplate;@autowiredprivateredisutilredisutil;@testvoidtest1(){//清空数据库redistemplate.getconnectionfactory().getconnection().flushdb();useruser=newuser("zhangsha",23);redisutil.set("user",user);system.out.println(redisutil.get("user"));}}


    • 这时候注入的redistemplate需要导入的是我们的

  6. 结果就是输出前加了转译【不再是乱码】

    1. redis目录中的redis-cle.exe

    2. 执行结果

关于“springboot整合redis案例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“springboot整合redis案例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道。

展开全文
内容来源于互联网和用户投稿,文章中一旦含有亚博电竞手机版的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系亚博电竞手机版删除

最新文章

网站地图