查看“Spring 的 Redis缓存注解”的源代码
←
Spring 的 Redis缓存注解
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Redis]] == 关于 == 前面讲的 Redis 缓存实现都是基于 Java 代码实现的。在 Spring 中,通过合理的添加缓存注解,也能实现和前面示例程序中一样的缓存功能。 为了方便地提供缓存能力,Spring 提供了一组缓存注解。但是,'''这组注解不仅仅是针对 Redis,它本质上并不是一种具体的缓存实现方案(例如:Redis、EHCache等),而是对缓存使用的统一抽象'''。 * 通过这组缓存注解,然后加上与具体缓存相匹配的 Spring 配置,不用编码就可以快速达到缓存的效果。 == 配置 spring-redis.xml == 在使用 Spring 缓存注解前,首先需要配置文件中启用 Spring 对基于注解的 Cache 的支持: : 在“'''spring-redis.xml'''”中,加上“'''<cache:annotationdriven/>'''”配置项。 * 还需要配置一个名为 CacheManager 的'''缓存管理器''' Spring Bean。 '''spring-redis.xml''' 增加的配置项,具体如下: : <syntaxhighlight lang="xml" highlight=""> <!-- 省略其他的spring-redis.xml配置,具体参见源代码 --> <!-- (redis 数据源、Spring-redis 连接池管理工厂、redis template definition、将 redisTemplate 封装成通用服务,等) --> <!-- . . . --> <!--启用缓存注解功能,这个是必须的,否则注解不会生效 --> <cache:annotation-driven/> <!--自定义 redis 工具类,在需要缓存的地方注入此类 --> <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> <constructor-arg ref="redisTemplate"/> <constructor-arg name="cacheNames"> <set> <!--声明 userCache--> <value>userCache</value> </set> </constructor-arg> </bean> </syntaxhighlight> === <cache:annotationdriven/> 的属性 === 如果使用了 <cache:annotation-driven />,还需要配置一个名为 CacheManager 的缓存管理器 Spring Bean。 # '''cache-manager 属性''':用来指定所需要用到的'''缓存管理器'''(CacheManager)的 Spring Bean 的名称。 #* 如果不进行特别设置,默认的名称是 CacheManager。 #* 设置的这个 Bean,要求实现 CacheManager 接口——CacheManager 接口是 Spring 定义的一个用来管理 Cache 缓存的通用接口。对应于不同的缓存,需要使用不同的 CacheManager 实现。 #** Spring 自身已经提供了一种 CacheManager 的实现,是基于 Java API 的 ConcurrentMap 简单的内存 Key-Value 缓存实现。 #** 但是,这里需要使用的缓存是 Redis,所以使用 spring-data-redis 包中的 '''RedisCacheManager''' 实现。 #* 在配置 RedisCacheManager 缓存管理器 Bean 时,需要配置两个构造参数:(如上示例) #*# redisTemplate:模板 Bean。 #*# cacheNames:缓存名称。【???】 #*#* 在 Redis 中其实际上即为命名空间。【默认使用“'''::'''”作为命名空间的分隔符(即 Redis 的 key 有“<cacheName>::”的前缀)】 #*#* 系统可以配置多个 cacheName 用以区分不同业务的 key 的存储位置(命名空间)。 # '''mode 属性''':可选值有 proxy 和 aspectj。 ## “'''proxy'''”模式:【默认】 ##* 只有当有缓存注解的方法被对象外部的方法调用时,Spring Cache 才会发生作用(反过来说,如果一个缓存方法,被其所在对象的内部方法调用时,Spring Cache 是不会发生作用的); ##* 只有加在 public 类型方法上的 @Cacheable 等注解,才会让 Spring Cache 发生作用。 ## “'''aspectj'''”模式: ##* 只有注解方法被内部调用,缓存才会生效; ##* 非 public 类型的方法上,也可以使用 Spring Cache 注解。 # '''proxy-target-class 属性''':设置代理类的创建机制,有两个值: ## 值为“'''true'''”: ##* 表示使用 '''CGLib''' 创建代理类; ##* @Cacheable 和 @CacheInvalidate 等注解,必须标记在具体类(Concrete Class)上,不能标记在接口上,否则不会发生作用。 ## 值为“'''false'''”:【默认】 ##* 表示使用 JDK 的'''动态代理'''机制创建代理类。 ##* @Cacheable 和 @CacheInvalidate 等注解,可以标记在接口上,也能发挥作用。 1、JDK 的动态代理是利用反射机制生成一个实现代理接口的匿名类(Class-based Proxies),在调用具体方法前,通过调用 InvokeHandler 来调用实际的代理方法。 2、而使用 CGLib 创建代理类,则不同。CGLib 底层采用 ASM 开源 .class 字节码生成框架,生成字节码级别的代理类(Interface-based Proxies)。 对比来说,在实际的运行时,CGLib代理类比使用Java反射代理类的效率要高。【参见:[[动态代理、CGLIB 与 切面编程]]】 == 使用 RedisTemplate 模板 API 完成 CRUD 的实践案例 == == 注解详解 ==
返回至“
Spring 的 Redis缓存注解
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息