带着新人学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版本的,版本太高代码变化比较大,而且进行过再封装,学起来难度增加了不少。
我对这一篇写的内容不是很满意,我自己都感觉很乱,东西很杂,没有什么逻辑性。。。。。几乎都是我想到什么就自己测试一下,查查资料,就写上去了, 东拼西凑的东西,还是水平不够,下次继续努力!
带着新人学springboot的应用04(springboot+mybatis+redis 完)的更多相关文章
- 带着新人学springboot的应用01(springboot+mybatis+缓存 上)
上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...
- 带着新人学springboot的应用07(springboot+RabbitMQ 下)
说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发 ...
- 带着新人学springboot的应用13(springboot+热部署)
spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫 ...
- 带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)
这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用 ...
- 带着新人学springboot的应用10(springboot+定时任务+发邮件)
接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件. 1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写 ...
- 带着新人学springboot的应用09(springboot+异步任务)
本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...
- 带着新人学springboot的应用08(springboot+jpa的整合)
这一节的内容比较简单,是springboot和jpa的简单整合,jpa默认使用hibernate,所以本质就是springboot和hibernate的整合. 说实话,听别人都说spring data ...
- 带着新人学springboot的应用06(springboot+RabbitMQ 中)
上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...
- 带着新人学springboot的应用05(springboot+RabbitMQ 上)
这次就来说说RabbitMQ,这个应该不陌生了,随便一查就知道这个是用来做消息队列的.(注意:这一节很多都是概念的东西,需要操作的比较少) 至于AMQP协议(Advanced Message Queu ...
随机推荐
- 手写数字识别 ----Softmax回归模型官方案例注释(基于Tensorflow,Python)
# 手写数字识别 ----Softmax回归模型 # regression import os import tensorflow as tf from tensorflow.examples.tut ...
- 数据库和Content Provider
SQLite提供了强大的SQL数据库的库文件,从而使应用程序拥有一个具备完全控制权的健壮的持久化层. Content Provider实现在应用程序内和应用程序之间存储.共享和使用结构化数据.通过将数 ...
- tensorflow 使用 3 模型学习
模型学习 import tensorflow as tf import numpy as np # 生成 100 个随机的点 x_data = np.random.rand( 100 ) y_data ...
- HttpWebRequest的Timeout和ReadWriteTimeout
HttpWebRequest.Timeout在发起请求开始,如果未从远程请求的URL得到任何数据的情况下,超过Timeout后,触发超时异常 HttpWebRequest.ReadWriteTimeo ...
- web基础要点记录
最近公司项目做完了,不怎么忙,翻看了一些基础的资料,文章.就做了个简单的记录. 1.Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示, 可通过加入 CSS 属性 -we ...
- React事件绑定几种方法测试
前提 es6写法的类方法默认没有绑定this,不手动绑定this值为undefined. 因此讨论以下几种绑定方式. 一.构造函数constructor中用bind绑定 class App exten ...
- 关于部署php遇到的坑
业务突然要启动一个久不使用的PHP项目, 发现部署到centos7上后 各种报错 就是不行. 我怀疑是apache或者php问题 就重新安装 编译安装也试过就是不行. 只能按笨办法 在测试环境安装了a ...
- [LeetCode] New 21 Game 新二十一点游戏
Alice plays the following game, loosely based on the card game "21". Alice starts with 0 p ...
- Spring + SpringMVC + Mybatis项目中redis的配置及使用
maven文件 <!-- redis --> <dependency> <groupId>redis.clients</groupId> <art ...
- Java语法细节 - synchronized和volatile
目录 synchronized关键字 关键字volatile synchronized关键字 synchronized关键字锁住方法和this的不同之处: public synchronized vo ...