Spring Boot 基于注解的 Redis 缓存使用详解
程序员文章站
2024-02-21 09:10:58
看文本之前,请先确定你看过上一篇文章《spring boot redis 集成配置》并保证 redis 集成后正常可用,因为本文是基于上文继续增加的代码。
一、创建 ca...
看文本之前,请先确定你看过上一篇文章《spring boot redis 集成配置》并保证 redis 集成后正常可用,因为本文是基于上文继续增加的代码。
一、创建 caching 配置类
rediskeys.java
package com.shanhy.example.redis; import java.util.hashmap; import java.util.map; import javax.annotation.postconstruct; import org.springframework.stereotype.component; /** * 方法缓存key常量 * * @author shanhy */ @component public class rediskeys { // 测试 begin public static final string _cache_test = "_cache_test";// 缓存key public static final long _cache_test_second = 20l;// 缓存时间 // 测试 end // 根据key设定具体的缓存时间 private map<string, long> expiresmap = null; @postconstruct public void init(){ expiresmap = new hashmap<>(); expiresmap.put(_cache_test, _cache_test_second); } public map<string, long> getexpiresmap(){ return this.expiresmap; } }
cachingconfig.java
package com.shanhy.example.redis; import java.lang.reflect.method; import java.util.arraylist; import java.util.list; import org.springframework.cache.cachemanager; import org.springframework.cache.annotation.cachingconfigurersupport; import org.springframework.cache.annotation.enablecaching; import org.springframework.cache.interceptor.keygenerator; import org.springframework.cache.interceptor.simplekeygenerator; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.data.redis.cache.rediscachemanager; import org.springframework.data.redis.core.redistemplate; /** * 注解式环境管理 * * @author 单红宇(csdn catoop) * @create 2016年9月12日 */ @configuration @enablecaching public class cachingconfig extends cachingconfigurersupport { /** * 在使用@cacheable时,如果不指定key,则使用找个默认的key生成器生成的key * * @return * * @author 单红宇(csdn catoop) * @create 2017年3月11日 */ @override public keygenerator keygenerator() { return new simplekeygenerator() { /** * 对参数进行拼接后md5 */ @override public object generate(object target, method method, object... params) { stringbuilder sb = new stringbuilder(); sb.append(target.getclass().getname()); sb.append(".").append(method.getname()); stringbuilder paramssb = new stringbuilder(); for (object param : params) { // 如果不指定,默认生成包含到键值中 if (param != null) { paramssb.append(param.tostring()); } } if (paramssb.length() > 0) { sb.append("_").append(paramssb); } return sb.tostring(); } }; } /** * 管理缓存 * * @param redistemplate * @return */ @bean public cachemanager cachemanager(redistemplate<string, object> redistemplate, rediskeys rediskeys) { rediscachemanager rcm = new rediscachemanager(redistemplate); // 设置缓存默认过期时间(全局的) rcm.setdefaultexpiration(1800);// 30分钟 // 根据key设定具体的缓存时间,key统一放在常量类rediskeys中 rcm.setexpires(rediskeys.getexpiresmap()); list<string> cachenames = new arraylist<string>(rediskeys.getexpiresmap().keyset()); rcm.setcachenames(cachenames); return rcm; } }
二、创建需要缓存数据的类
testservice.java
package com.shanhy.example.service; import org.apache.commons.lang3.randomstringutils; import org.springframework.cache.annotation.cacheable; import org.springframework.stereotype.service; import com.shanhy.example.redis.rediskeys; @service public class testservice { /** * 固定key * * @return * @author shanhy * @create 2017年4月9日 */ @cacheable(value = rediskeys._cache_test, key = "'" + rediskeys._cache_test + "'") public string testcache() { return randomstringutils.randomnumeric(4); } /** * 存储在redis中的key自动生成,生成规则详见cachingconfig.keygenerator()方法 * * @param str1 * @param str2 * @return * @author shanhy * @create 2017年4月9日 */ @cacheable(value = rediskeys._cache_test) public string testcache2(string str1, string str2) { return randomstringutils.randomnumeric(4); } }
说明一下,其中 @cacheable 中的 value 值是在 cachingconfig的cachemanager 中配置的,那里是为了配置我们的缓存有效时间。其中 methodkeygenerator 为 cachingconfig 中声明的 keygenerator。
另外,cache 相关的注解还有几个,大家可以了解下,不过我们常用的就是 @cacheable,一般情况也可以满足我们的大部分需求了。还有 @cacheable 也可以配置表达式根据我们传递的参数值判断是否需要缓存。
注: testservice 中 testcache 中的 mapper.get 大家不用关心,这里面我只是访问了一下数据库而已,你只需要在这里做自己的业务代码即可。
三、测试方法
下面代码,随便放一个 controller 中
package com.shanhy.example.controller; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; import org.springframework.data.redis.connection.jedis.redisclient; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; import com.shanhy.example.service.testservice; /** * 测试controller * * @author 单红宇(365384722) * @create 2017年4月9日 */ @restcontroller @requestmapping("/test") public class testcontroller { private static final logger log = loggerfactory.getlogger(testcontroller.class); @autowired private redisclient redisclient; @autowired private testservice testservice; @getmapping("/rediscache") public string rediscache() { redisclient.set("shanhy", "hello,shanhy", 100); log.info("getredisvalue = {}", redisclient.get("shanhy")); testservice.testcache2("aaa", "bbb"); return testservice.testcache(); } }
至此完毕!
最后说一下,这个 @cacheable 基本是可以放在所有方法上的,controller 的方法上也是可以的(这个我没有测试 ^_^)。
源码下载地址:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Spring Boot 基于注解的 Redis 缓存使用详解
-
基于Spring Boot的Environment源码理解实现分散配置详解
-
详解简单基于spring的redis配置(单机和集群模式)
-
Spring AOP如何整合redis(注解方式)实现缓存统一管理详解
-
实例详解Spring Boot实战之Redis缓存登录验证码
-
Spring Boot基础入门之基于注解的Mybatis
-
详解基于Spring Boot与Spring Data JPA的多数据源配置
-
使用Spring Boot快速构建基于SQLite数据源的应用
-
详解Spring boot使用Redis集群替换mybatis二级缓存
-
Dubbo在Spring和Spring Boot中的使用详解