带着新人学springboot的应用04(springboot+mybatis+redis 完)
对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的SimpleCacheConfiguration,用其他缓存公司提供的)
就像我们使用数据库一样,从mysql换到orcle,不需要把我们所有的配置都改一遍吧,只需要改一下数据库驱动,再修改一些配置就ok了,一些主要的东西都是不变的。
我们用切换redis一样,只需要修改一点东西,那些@Cacheable注解什么的,还是一样的用。
而且比较好玩的是的上面这些配置类是按照从上到下的顺序依次尝试加载的,例如redis那个配置类加载成功,默认的SimpleCacheConfiguration就失效了。理由嘛,很简单,看下图;
1.redis简单使用
springboot自带的缓存是不用下载的,已经给你安装好了,但是redis是第三方提供的,可以看作一个软件,需要额外下载的,然后springboot通过一个starter和这个redis软件适配,然后就能够使用了。
当然,会用docker更好(强烈建议学会使用docker,快速安装一切,mysql,tomcat,redis等等),几十秒钟redis就能下载好并启动,不过新手嘛,还是常规操作,嘿嘿!
哎,我还特地去github下载了一个redis,有兴趣的小伙伴可以试试https://github.com/ServiceStack/redis-windows,直接下载zip,解压,随便选个版本放到一个指定文件夹,继续解压。(这里就是简单用一下redis,不搞花里胡哨的东西,其实我就是比较懒,我没配环境变量,没设置密码,没下载可视化工具,需要的小伙伴自己去配置啊!)
准备工作:redis的基本命令要瞄两眼,记不住没关系,用到什么命令直接查啊!
一定要在空白的地方哦~当然你也可以在运行打开cmd,emmm...那慢慢切换目录到这里吧。。。
输入命令启动服务端,显示下面的画面就启动成功,默认6379端口;
记住,这个黑窗口不要关了!!!这就是相当于远程服务器,关了还用个鬼的redis。
继续刚刚那个位置再打开一个cmd,运行客户端命令,用几个简单粗暴的命令,get set可以用,ok
后来补充:emmmm,本来不想用redis可视化工具的,只是写到后面出了点问题,没有可视化工具不方便查看数据,哎,打脸!默默地下载了一个。
推荐一个可视化工具,http://www.treesoft.cn/dms.html#exam,选择TreeNMS,然后下载解压就可以了,一定要打开readme文件看看怎么使用。(这个东西居然是用java写的,直接在浏览器输入网址就可以使用,跟之前的Druid用法几乎一样,哈哈,比较方便,当然最重要的是免费!本来想下载一个RedisDesktopManager的,结果发现居然要收费了,弄个破解版又比较懒。。。)
2.springboot整合redis
ok,现在开始整合springboot+redis,在springboot需要导入依赖,就是导入一个stater
yml再配置一下redis的远程ip地址,我们就是localhost,所以直接用spring.redis.host: localhost,
好了,到这里可以说redis基本的配置就完成了,以前该怎么用,现在还是怎么用!!!只是使用的redis的话现在就可以正常使用了!
我们启动应用也能在控制台发现redis已经启动。
比较深入一点的配置
service中的方法存数据就是向redis中存,但是假如我们想要在代码中获取缓存中的东西怎么办?例如以前用的JdbcTemplate,我们取连接成功mysql,但是我们在Dao里要得到数据库里的东西,我们就可以用JdbcTemplate的某些方法的获取,也可以插入数据;
同理,我们想要在代码中获取缓存里的数据,也有xxxTempalte方便我们的使用。
打开RedisAutoConfiguration,只要导入了redis依赖,这个自动配置类就会生效,然后向容器里导入两个模板
我们要用的话,直接@Autowired就行了,这个我用的比较少(方法太多有的时候还要想好久才知道用哪个),我比较喜欢用@Autowired注入CacheManager,然后通过cacheManager.getCache(“指定的cacheName名字”)就能获得Cache,然后直接存数据比较简单粗暴一点,哈哈。
简单的看一看模板的方法,具体的用法百度一下很多。
两个模板的方法几乎一样,只是一个针对对象,一个针对字符串。
模板的这么多方法就是对redis支持的所有数据类型进行操作,例如字符串,list,set,有序的set等等
自己查查资料,也简单的测试一下就ok,什么时候用到什么时候再来研究吧!
开始测试,输入url,看看缓存数据 ,但是看不懂,这样很不好,因为我们要看看数据的正确性如何。。。(没有可视化工具很烦躁,我都不知道key是什么,查了一下用keys *查看所有的key,然后有个stu,这个是我设置的cacheName,可以自己判断那个是你的key),那就要配置一下缓存管理器才能转化一下数据让我们看懂了。
【注意:假如没有数据,看看你们的javabean有没有实现Serializable接口,没有实现的话应该会报错的。。。】
缓存管理器:
我们先看一看RedisCacheConfiguration这个配置类,打开
我都不用打开那个creatRedisCache这个方法内创建RedisCache对象的内部,里面肯定有lookup,put,remove方法或者封装一下,这个就不多说了,几乎和上一节一模一样。
这里稍微提一下上面那两个模板的作用:要加载RedisCacheConfiguration------------->首先会加载RedisAutoCOnfiguration---------->自动配置类往容器里加载两个模板--------->RedisCacheConfiguration起作用,往容器里导入缓存管理器,缓存管理器内部就是用这两个模板才能实现和redis实现交互(CacheManager内部使用那两个模板操作redis,springboot1.5.9之前的版本还能从源码看到,现在已经看不到了,估计是进行封装了,有兴趣的可以自己查查资料)
为什么把对象存入redis里面就变得看不懂了,因为序列化的原因。(序列化就是把一个程序的对象写在硬盘上)默认使用JDK序列化,具体的可以打开模板类看看,我简要的截一下图:
jdk序列化我们人肯定是看不懂的,所以我们要用json去序列化,把对象以字符串的样子写出来。
这里有兴趣的还可以继续跟进看看哦~
不扯这么多了,再说又要增加很多内容,就这样吧!
下面的这段代码属于通用代码,我在一个老哥的博客那里找到的,挺管用的,随便写个配置类,粘上去就ok,你的redis中的数据就看得懂了。
@Configuration public class MyTemplateCon{ @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解决乱码的问题) RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build(); return cacheManager; } }
用过之后,查一下缓存的数据,就可以显示正常数据了!这里的数据就是用json序列化的方式
缓存就说到这里了,东西很多,我也是大概说了一部分,其实还有很多东西我都没有讲到,比如@Cacheable...这三个注解里面每一个属性的作用,其中keyGenerator比较重要,可以自定义key的生成规则,SpEL表达式我也只是一语带过,很多源码也没有一起看一看;还有,假如在执行service的方法的时候有个需求,就是把所有返回的对象的名字给保存到缓存,应该怎么做? 代码和redis的结果如下所示:
这里还要说一下springboot的版本差异,我用的是1.5.17,所以最后的那个直接配置一个缓存管理器就ok了,但是我在查这个资料的时候,貌似1.5.9版本还是之前,要先自定义一个RedisTemplate,然后把这个模板传到自定义的CacheManager中(我就在这个问题纠结了好久。。。),总之,暂时尽量别用2.0版本的,版本太高代码变化比较大,而且进行过再封装,学起来难度增加了不少。
我对这一篇写的内容不是很满意,我自己都感觉很乱,东西很杂,没有什么逻辑性。。。。。几乎都是我想到什么就自己测试一下,查查资料,就写上去了, 东拼西凑的东西,还是水平不够,下次继续努力!