前面已经写了四篇关于dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合的文章:
dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(一)Dubbo的使用
dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(二)之 JDBC连接池、监控组件 Druid
dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(三)使用Spring AOP实现mysql的读写分离
dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(四)Spring AOP中使用log4j实现http请求日志入mongodb
dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(五)Spring中spring-data-redis的使用
接着上一篇文章,今天来写一篇关于Spring-data-redis在Spring中的缓存的使用
缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都可以立即可用的。尽管Spring自身并没有实现缓存的解决方案,但是他对缓存功能提供了声明式的支持,能够与各种流行的缓存进行集成。几天主要介绍的是redis的缓存的支持。
1. Spring中启用对缓存管理的支持
Spring中对缓存管理器的支持有两种方式:
- 注解驱动的缓存
- XML声明的缓存
1.1 注解驱动的缓存
使用Spring的缓存抽象时,最为通用的方式就是在方法上添加@Cacheable和@CacheEvict注解。
在往bean添加缓存注解之前,必须要启用Spring对注解驱动的支持。如果我们使用java配置的话,那么可以在其中一个配置上添加@EnableCaching,这样的话就能启动注解驱动的缓存。
|
|
1.2 XML声明的缓存
如果以XML的方式配置应用的话,那么可以是使用Spring cache命名空间的
|
|
元素来启动注解驱动的缓存。
|
|
2. Spring中配置缓存管理器
Spring 3.1内置了五个缓存管理器
- SimpleCacheManager
- NoOpCacheManager
- ConcrrentMapCacheManager
- CompositeCacheManager
- EhCacheCacheManager
Spring 3.2引入了另外的一个缓存管理器,这个缓存管理器可以在基于JCache(JSR-107)的缓存提供商之中。除了核心的Spring框架,Spring data又提供了两个缓存管理器。
- RedisCacheManager 来自于Spring-data-redis项目
- GemfireCacheManager 来自于Spring-data-GemFire项目
所以我们选择缓存管理器时候,取决于使用底层缓存供应商。
3. Spring中配置Redis缓存管理器
缓存的条目不过就是一个键值对(key-vlaue),其中key描述了产生value的操作和参数。因此你,Redis作为key-value存储,非常适合于做缓存。
Redis可以用来为spring缓存抽象机制存储缓存条目,Spring-data-redis提供了RedisCacheManager,这是CacheManager的一个实现。RedisCacheManager 会与一个Redis服务器协作,并且通过RedisTemplate将缓存条目存储到Redis中。
|
|
4. 为方法添加注解以支持缓存
Spring 的缓存抽象在很大程度上是围绕切面的构建的。在Spring中启用缓存时,会创建一个切面,它触发一个或更多的Spring的缓存注解。
Spring中提供了四个注解来声明缓存规则
- @Cacheable 声明Spring在调用方法之前,首先应该在缓存中查找方法的返回值。如果这个值能够找到,就会返回存储的值,否则的话,这个方法就会被调用,返回值会放在缓存之中。
- @CachePut 表明Spring应该将方法的返回值放到缓存中,在方法的调用前并不会检查缓存,方法始终都会被调用
- @CacheEvict表明Spring应该在缓存中清除一个或多个条目
- @Caching 这是一个分组的注解,能够同时应用多个其他的缓存注解
在Service层缓存数据的数据
数据缓存成功
再次获取用户列表的时候;直接从缓存中读取用户的列表。
注意:缓存java对象时必须实现Serilaizable接口,因为Spring会将对象先序列化之后再存入到Redis中。