详解SpringBoot集成Redis来实现缓存技术方案
概述
在我们的日常项目开发过程中缓存是无处不在的,因为它可以极大的提高系统的访问速度,关于缓存的框架也种类繁多,今天主要介绍的是使用现在非常流行的nosql数据库(redis)来实现我们的缓存需求。
redis简介
redis 是一个开源(bsd许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,redis 的优势包括它的速度、支持丰富的数据类型、操作原子性,以及它的通用性。
案例整合
本案例是在之前一篇springboot + mybatis + restful的基础上来集成redis的,具体完整案例代码可以看这里:https://github.com/aifeinik/springboot-learn/tree/master/spring-boot-redis2,关于redis如何安装可自行google。
1、在maven pom.xml文件中加入redis包
<!--redis--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-redis</artifactid> <version>${boot.version}</version> </dependency>
2、springboot配置文件中配置redis连接(yaml方式配置)
spring: application: name: spring-boot-redis redis: host: 192.168.145.132 port: 6379 timeout: 20000 cluster: nodes: 192.168.211.134:7000,192.168.211.134:7001,192.168.211.134:7002 maxredirects: 6 pool: max-active: 8 min-idle: 0 max-idle: 8 max-wait: -1
解释:本配置采用redis一主三从的的配置方式来提高缓存的吞吐量
3、redis配置类
@configuration public class redisconfig { @bean public redistemplate<object, object> redistemplate(redisconnectionfactory connectionfactory) { redistemplate<object, object> template = new redistemplate<>(); template.setconnectionfactory(connectionfactory); //使用jackson2jsonredisserializer来序列化和反序列化redis的value值 jackson2jsonredisserializer serializer = new jackson2jsonredisserializer(object.class); objectmapper mapper = new objectmapper(); mapper.setvisibility(propertyaccessor.all, jsonautodetect.visibility.any); mapper.enabledefaulttyping(objectmapper.defaulttyping.non_final); serializer.setobjectmapper(mapper); template.setvalueserializer(serializer); //使用stringredisserializer来序列化和反序列化redis的key值 template.setkeyserializer(new stringredisserializer()); template.afterpropertiesset(); return template; } }
解释:springboot提供了对redis的自动配置功能,在redisautoconfiguration中默认为我们配置了jedisconnectionfactory(客户端连接)、redistemplate以及stringredistemplate(数据操作模板),其中stringredistemplate模板只针对键值对都是字符型的数据进行操作,本示例采用redistemplate作为数据操作模板,该模板默认采用jdkserializationredisserializer的二进制数据序列化方式,为了方便演示本示例采用jackson2jsonredisserializer来序列化和反序列化redis的value值,使用stringredisserializer来序列化和反序列化redis的key值。
4、service层应用缓存(注解方式)
@service public class personservice { @autowired private personrepo personrepo; /** * @cacheable 应用到读取数据的方法上,先从缓存中读取,如果没有再从db获取数据,然后把数据添加到缓存中 * unless 表示条件表达式成立的话不放入缓存 * @param username * @return */ @cacheable(value = "user", key = "#root.targetclass + #username", unless = "#result eq null") public person getpersonbyname(string username) { person person = personrepo.getpersonbyname(username); return person; } /** * @cacheput 应用到写数据的方法上,如新增/修改方法,调用方法时会自动把相应的数据放入缓存 * @param person * @return */ @cacheput(value = "user", key = "#root.targetclass + #result.username", unless = "#person eq null") public person saveperson(person person) { return personrepo.saveperson(person); } /** * @cacheevict 应用到删除数据的方法上,调用方法时会从缓存中删除对应key的数据 * @param username * @return */ @cacheevict(value = "user", key = "#root.targetclass + #username", condition = "#result eq true") public boolean removepersonbyname(string username) { return personrepo.removepersonbyname(username) > 0; } public boolean isexistpersonname(person person) { return personrepo.existpersonname(person) > 0; } }
解释:
1、这里的缓存key为简单的字符串组合,也可根据具体需要实现自定义的key生成器,然后在注解中使用keygenerator来引用。
2、spring cache提供了一些供我们使用的spel上下文数据,通过#来引用,具体可查看spring官网:。
5、数据访问资源类
@component @path("personmgr") public class personmgrresource { @autowired private personservice personservice; @get @path("getpersonbyname") @produces(mediatype.application_json) public jsonresp getpersonbyname(@queryparam("username") string username) { person person = personservice.getpersonbyname(username); return jsonresp.success(person); } @post @path("removepersonbyname") @produces(mediatype.application_json) public jsonresp removepersonbyname(@queryparam("username") string username) { if (personservice.removepersonbyname(username)) { return jsonresp.success(); } return jsonresp.fail("系统错误!"); } @post @path("saveperson") @produces(mediatype.application_json) public jsonresp saveperson(person person) { if (personservice.isexistpersonname(person)) { return jsonresp.fail("用户名已存在!"); } if (personservice.saveperson(person).getid() > 0) { return jsonresp.success(); } return jsonresp.fail("系统错误!"); } }
6、通过postman工具来测试缓存是否生效
第一次访问查找用户:
第一次通过用户名称来查找用户可以看到是从库中查询的数据,我们可以通过redisclient工具来查看数据已放入了缓存
第二次查找用户:发现服务端并未打印任何数据库查询日志,可以知道第二次查询是从缓存中查询得到的数据。
总结
本文介绍如何通过springboot来一步步集成redis缓存,关于redis的使用它不仅可以用作缓存,还可以用来构建队列系统,pub/sub实时消息系统,分布式系统的的计数器应用,关于redis更多的介绍,请前往查阅官方文档。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。