前言

有兴趣的同学,可以看我上一篇文章,然后再过来看会比较清楚点:https://www.cnblogs.com/yhc-910/p/14884678.html

springcache,简单说,就是用来根据条件缓存请求的结果,从而提高整体服务性能和请求速度。

 

springcache有四种注解

@Cacheable:核心注解,请求的返回值会进行缓存,下次请求前,会直接从缓存获取后返回,如缓存不存在,就进入请求并缓存返回(一般用于查询)
@CachePut:对请求的返回值进行缓存(一般用户更新)
@CacheEvict:清理缓存
@Cacheing:用户以上多个注解的组合,一般不会使用,有兴趣的同学可以查下相关资料

下面简单描述下,@Cacheable里的一些属性,其它注解基本字段一样
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
@AliasFor("cacheNames")
String[] value() default {}; // cache别名
@AliasFor("value")
String[] cacheNames() default {}; // cache的key
String key() default ""; // 指定key的生成器,自定义需实现KeyGenerator
String keyGenerator() default ""; // cache管理器,文章使用redis进行存储
String cacheManager() default ""; // cache解析器,管理cache管理器
String cacheResolver() default ""; // 请求时条件判断,如符合则取缓存,若无缓存,则执行代码,返回时进行缓存
String condition() default ""; // 去除符合条件的数据
String unless() default ""; // 是否同步缓存
boolean sync() default false;
}

keyGenerator:key生成器,springcache提供了默认的生成器org.springframework.cache.interceptor.SimpleKeyGenerator,其实无非就是根据注解、方法、参数来生成。当然,我们也可以自定义,只需实现org.springframework.cache.interceptor.KeyGenerator即可

cacheManager:缓存管理器,默认使用ConCurrentHashMap来进行缓存,当然,如果接入redis,则默认使用redis来进行存储,cache已自动集成,如需自定义redis配置,可通过org.springframework.data.redis.cache.RedisCacheManager实现

cacheResolver:缓存解析器,与cacheManager冲突,只需配置一个,有兴趣可自学

condition:请求时判断参数,如符合,则取缓存返回(正则表达式可自行前往官网查看)

unless:返回时判断结果,如符合,则从返回结果中过滤不进行缓存(正则表达式可自行前往官网查看)

sync:并发请求下,只会有一个请求进行缓存处理,其它请求等待

实战

1、添加依赖

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、启动类添加注解@EnableCaching,接入springcache

3、添加redis配置(redis的信息,请自行配置)

    @Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory); // 指定序列化器
RedisSerializer<?> stringRS = new StringRedisSerializer();
RedisSerializer<?> objectRS = new GenericJackson2JsonRedisSerializer();
template.setKeySerializer(stringRS);
template.setHashKeySerializer(stringRS);
template.setValueSerializer(objectRS);
template.setHashValueSerializer(objectRS); // 初始化redis配置
template.afterPropertiesSet(); return template;
}

4、自定义缓存配置,设置RedisCacheManager

@Configuration
public class CacheConfig extends CachingConfigurerSupport { // 指定cachemanager【因cache默认指定的是RedisTemplate,所以此处进行指定设置】(引入redis时,spring会自动引入redis作为存储)[否则,使用cafficeCache或者其它,比如guavacache]
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig() // 创建默认缓存配置对象
.disableCachingNullValues() // 如果值为空,则不进行缓存
.entryTtl(Duration.ofMinutes(30)) // 设置缓存失效时间
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build();
}
}

5、测试

返回String测试

@RestController
@RequestMapping("single")
public class SingleCacheTest { private static final String CACHE_KEY = "single"; protected final Log logger = LogFactory.getLog(this.getClass()); @GetMapping("test")
public String test() throws Exception {
logger.info("single test come in");
return "success";
} @Cacheable(value = CACHE_KEY,sync = true)
@GetMapping("set")
public String set() throws Exception {
logger.info("single set come in");
return "success";
} @CachePut(value = CACHE_KEY)
@GetMapping("put")
public String put() throws Exception {
logger.info("single put come in");
return "success";
} @CacheEvict(CACHE_KEY)
@GetMapping("delete")
public String delete() throws Exception {
logger.info("single delete come in");
return "success";
} }

返回对象测试

@RestController
@RequestMapping("object")
public class ObjectCacheTest { private static final String CACHE_KEY = "object"; protected final Log logger = LogFactory.getLog(this.getClass()); @GetMapping(value = "test")
public People test() throws Exception {
logger.info("object test come in");
return new People("yhc", 30, "武汉");
} @Cacheable(value = CACHE_KEY, condition = "#name.equals('yhc')")
@GetMapping("put1")
public People put1(@RequestParam String name) throws Exception {
logger.info("object put1 come in");
return new People("yhc", 30, "武汉");
} @Cacheable(value = CACHE_KEY, unless = "#result.address.equals('武汉')")
@GetMapping("put2")
public People put2(@RequestParam String name) throws Exception {
logger.info("object put2 come in");
return new People("yhc", 30, "武汉");
} @Cacheable(value = CACHE_KEY, condition = "#name.equals('yhc')", unless = "#result.address.equals('武汉1')")
@GetMapping("put")
public People put(@RequestParam String name) throws Exception {
logger.info("object put come in");
return new People("yhc", 30, "武汉");
} @CacheEvict(CACHE_KEY)
@GetMapping("delete")
public People delete() throws Exception {
logger.info("object delete come in");
return new People("yhc", 30, "武汉");
}
}

springcache+redis实战的更多相关文章

  1. Redis实战阅读笔记——开始

    Redis实战这本书,看完以后最大的不是redis本身的东西,而是作者面对实际问题的分析而给出的设计方案,可以看成NoSql设计的应用.个人从这方面收获很多,至于Redis本身的东西,这个就花一两个小 ...

  2. Redis实战阅读笔记——第一章

    Redis 实战 中文版 的20-21页看的人郁闷死了,最后看英文版才明白意思,哎,我理解能力差成这样了 其中,图 1-12 有错误,草,这个是英文版的错--应该是group:programming

  3. redis实战(01)_redis安装

    早就想对redis进行实战操作了,最近看了一些视频和参考书籍,总结总结一下,redis实战内容: 实战前先对redis做一个大概的认识: 现在开始安装redis了... redis的安装下载地址 ht ...

  4. C# Redis实战(二) [转]

    二.Redis服务  在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图               ...

  5. (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景

    随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...

  6. C# Redis实战

    转自  :http://blog.csdn.net/qiujialongjjj/article/details/16945569 一.初步准备 Redis 是一个开源的使用ANSI C 语言编写.支持 ...

  7. Redis实战

    大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...

  8. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...

  9. Redis实战之征服 Redis + Jedis + Spring (一)

    Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...

  10. Redis实战之征服 Redis + Jedis + Spring (二)

    不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实 ...

随机推荐

  1. ES6迭代器(Iterator)和生成器(Generator)

    平时我们迭代数据用得最多的应该就是for循环了 来看个简单的例子 var colors = ["red", "green", "blue"] ...

  2. 如何使用Go中的Weighted实现资源管理

    1. 简介 本文将介绍 Go 语言中的 Weighted 并发原语,包括 Weighted 的基本使用方法.实现原理.使用注意事项等内容.能够更好地理解和应用 Weighted 来实现资源的管理,从而 ...

  3. 爆肝万字带你超级详细全面了解Linux命令大全

    前言 作者主页:CSDN丨博客园 学习交流:在下周周ovoの社区 对这篇万字博客目录总结如下: 关机命令.重启命令,创建用户.删除用户.修改密码.切换用户.切换到超级用户.禁用/解锁用户账户.修改信息 ...

  4. C++面试八股文:std::string是如何实现的?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第18面: 面试官:std::string用过吧? 二师兄:当然用过(废话,C++程序员就没有没用过std::string的). 面试官:std::s ...

  5. Linux系统运维之Web服务器Nginx安装

    一.介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.本文先整理web服务器内容. 二.环境及软件版本 操作 ...

  6. Vue3从入门到精通(三)

    vue3插槽Slots 在 Vue3 中,插槽(Slots)的使用方式与 Vue2 中基本相同,但有一些细微的差异.以下是在 Vue3 中使用插槽的示例: // ChildComponent.vue ...

  7. JavaScript高级学习

    JavaScript 进阶 学习作用域.变量提升.闭包等语言特征,加深对 JavaScript 的理解,掌握变量赋值.函数声明的简洁语法,降低代码的冗余度. 理解作用域对程序执行的影响 能够分析程序执 ...

  8. GGTalk 开源即时通讯系统源码剖析之:服务端全局缓存

    继上篇<GGTalk 开源即时通讯系统源码剖析之:数据库设计>介绍了 GGTalk 数据库中所有表的结构后,接下来我们将进入GGTalk服务端的核心部分. GGTalk 对需要频繁查询数据 ...

  9. 平时容易忽视的地方之一:java在抽取方法时,什么时候该用void

    当一个类中多个方法有相同编码,或该部分编码可以作为一个整体,适合抽取出一个方法时,要注意这个抽取的方法的返回值,什么时候可以用void,什么时候不能用void? 先看代码: import lombok ...

  10. 信奥赛题1001:Hello,World!

    这个题实在是太简单的了,无法比喻,直接付代码! //c++ #include<bits/stdc++.h> using namespace std; int main() { cout&l ...