版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、redis 系列三 -springboot 如何使用 redis 做缓存及缓存注解的 用法总结1. 概述本文介绍 spring boot 如何使用 Redis 做缓存,如何对 redis 缓存进行定制化配置 (如 key 的有效期 )以及 spring boot 如何 初始化 redis 做缓存。使用具体的代码介绍了Cacheable,CacheEvict , CachePut, CacheConfig 等注解及其属性 的用法。2. spring boot 集成 redis2.1. perties配置 perties ,包含如下信息:
2、指定缓存的类型配置 redis 的服务器信息请不要配置 spring.cache.cache-names值,原因后面再说# 缓存# spring.cache.cache-names=book1,book2 spring.cache.type=REDIS # REDIS (RedisProperties) spring.redis.database=0 spring.redis.host= spring.redis.password= spring.redis.port=6379 spring.redis.pool.max-idle=8 spring.redis.poo
3、l.min-idle=0 spring.redis.pool.max-active=100 spring.redis.pool.max-wait=-1123456789101112131234567891 01112132.2. 配置启动类EnableCaching: 启动缓存重新配置RedisCacheManager,使用新的配置的值SpringBootApplicationEnableCaching / 启动缓存 public class CacheApplication private static final Logger log =LoggerFactory.getLogger(Ca
4、cheApplication.class);public static void main(String args) ("Start CacheApplication. ");SpringApplication.run(CacheApplication.class, args);/* 重新配置 RedisCacheManager* param rd*/Autowiredpublic void configRedisCacheManger(RedisCacheManagerrd)rd.setDefaultExpiration(100L); 1234567891
5、01112131415161718192012345678910111213141 51617181920经过以上配置后, redis 缓存管理对象已经生成。下面简单介 绍 spring boot 如何初始化 redis 缓存。2.3. spring boot 如何初始化 redis 做缓存缓存管理接口 org.springframework.cache.CacheManager , spring boot 就是通过此类实现缓存的管理。 redis 对应此接口 的实现类是org.springframework.data.redis.cache.RedisCacheManager 。下 面介绍此
6、类如何生成。首先我们配置 perties 的 spring.redis.* 属性后 EnableCaching 后, spring 会执行 RedisAutoConfiguration , 初始化 RedisTemplate 和 StringRedisTemplate ConfigurationConditionalOnClass( JedisConnection.class, RedisOperations.class, Jedis.class )EnableConfigurationProperties(RedisProperties.class)public
7、 class RedisAutoConfiguration /* Standard Redis configuration.*/Configurationprotected static class RedisConfiguration BeanConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException RedisTem
8、plate template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory);return template;BeanConditionalOnMissingBean(StringRedisTemplate.class) public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException StringRedisTemp
9、late template = newStringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;12345678910111213141516171819202122232425262728293031323334123456789101112131415161718192021222324252627 28293031323334然后 RedisCacheConfiguration 会将 RedisAutoConfiguration 生 成的 RedisTemplat
10、e 注入方法生成 RedisCacheManager 后。 ConfigurationAutoConfigureAfter(RedisAutoConfiguration.class)ConditionalOnBean(RedisTemplate.class)ConditionalOnMissingBean(CacheManager.class)Conditional(CacheCondition.class)class RedisCacheConfiguration private final CacheProperties cacheProperties;private final Cach
11、eManagerCustomizers customizerInvoker;RedisCacheConfiguration(CachePropertiescacheProperties,CacheManagerCustomizers customizerInvoker) this.cacheProperties = cacheProperties; this.customizerInvoker = customizerInvoker;Beanpublic RedisCacheManager cacheManager(RedisTemplate redisTemplate) RedisCache
12、Manager cacheManager = newRedisCacheManager(redisTemplate); cacheManager.setUsePrefix(true);List cacheNames =this.cacheProperties.getCacheNames();if (!cacheNames.isEmpty() cacheManager.setCacheNames(cacheNames);returnthis.customizerInvoker.customize(cacheManager);123456789101112131415161718192021222
13、324252627282930123456789101112131415161718192021222324252627282930 根据以上的分析,我们知道在 spring 已经帮我们生成一个 RedisCacheManager 并进行了配置。最后我们再可以对这个 RedisCacheManager 进行二次配置, 这里只列出配置 key 的有效期/* 重新配置 RedisCacheManager* param rd*/Autowiredpublic void configRedisCacheManger(RedisCacheManager rd)rd.setDefaultExpiratio
14、n(100L);123456789123456789请不要在 perties 中配置:spring.cache.cache-names=book1,book2,否贝U会导致我们新的 配置无法作用到这些配置的cache上。这是因为RedisCacheConfiguration 初始化 RedisCacheManager 后,会 立即调用RedisCacheConfiguration的初始化cache,而此时 configRedisCacheManger 还没有执行此方法,使得我们的配 置无法启作用。反之,如果不配置,则后创建cache,会使用我们的配置。3. spri
15、ng 缓存注解的用法上节已经介绍如何配置缓存,这节介绍如何使用缓存3.1 辅助类下方会使用到的辅助类Book:public class Book implements Serializable private static final long serialVersionUID =2629983876059197650L;private String id;private String name; / 书名 private Integer price; / 价格 private Date update; /public Book(String id, String name, Integer
16、price, Date update) super();this.id = id; = name;this.price = price;this.update = update;/ set/get 略1234567891011121314151617181234567891011121314151617 18BookQry : 封装请求类 public class BookQry private String id;private String name; / 书名/ set/get 略 12345671234567AbstractService抽象类:初始化 reposit
17、oryBook 值,模拟数据库数据。BookService 和 BookService2 都是继承此类 public abstract class AbstractService protected static Map repositoryBook = new HashMap();public AbstractService() super();PostConstruct public void init() / 1Book book1 = new Book("1", "name_1", 11, new Date();repositoryBook.pu
18、t(book1.getId(), book1);/ 2Book book2 = new Book("2", "name_2", 11, new Date();repositoryBook.put(book2.getId(), book2);/ 3Book book3 = new Book("3", "name_3", 11, new Date();repositoryBook.put(book3.getId(), book3);/ 4Book book4 = new Book("4", &quo
19、t;name_4", 11, new Date();repositoryBook.put(book4.getId(), book4);123456789101112131415161718192021222324251234567891 01112131415161718192021222324253.2. Cacheable Cacheable 的属性的意义cacheNames:指定缓存的名称key:定义组成的key值,如果不定义,则使用全部的参数计 算一个 key 值。可以使用 spring El 表达式* cacheNames 设置缓存的值* key:指定缓存的key,这是指参
20、数id值。key可 以使用 spEl 表达式* param id* return*/Cacheable(cacheNames="book1", key="#id")public Book queryBookCacheable(String id) ("queryBookCacheable,id=",id); return repositoryBook.get(id);/*这里使用另一个缓存存储缓存* param id* return*/Cacheable(cacheNames="book2",
21、 key="#id") public Book queryBookCacheable_2(String id) ("queryBookCacheable_2,id=",id); return repositoryBook.get(id);* 缓存的 key 也可以指定对象的成员变量* param qry* return*/Cacheable(cacheNames="book1", key="#qry.id")public Book queryBookCacheableByBookQry(Boo
22、kQry qry) ("queryBookCacheableByBookQry,qry=",qry);String id = qry.getId();Assert.notNull(id, "id can't be null!");String name = qry.getName();Book book = null; if(id != null)book = repositoryBook.get(id);if(book != null && !(name != null &&book.get
23、Name().equals(name)book = null;return book;12345678910111213141516171819202122232425262728 2930313233343536373839404142434412345678910111213141 516171819202122232425262728293031323334353637383940 41424344 keyGenerator:定义key生成的类,和 key的不能同时存在/*以上我们使用默认的keyGenerator,对应spring的SimpleKeyGenerator* 如果你的使用很
24、复杂,我们也可以自定义myKeyGenerator 的生成 keykey 和 keyGenerator 是互斥,如果同时制定会出异* The key and keyGenerator parameters are mutually exclusive and an operation specifying both will result in an exception.* param id* return*/Cacheable(cacheNames="book3", keyGenerator="myKeyGenerator")public Book q
25、ueryBookCacheableUseMyKeyGenerator(String id)("queryBookCacheableUseMyKeyGenerator,id=",i d);return repositoryBook.get(id);/ 自定义缓存 key 的生成类实现如下: Componentpublic class MyKeyGenerator implements KeyGenerator Overridepublic Object generate(Object target, Method method,Object. param
26、s) System.out.println(" 自定义缓存, 使用第一参数作为 缓存 key. params = " + Arrays.toString(params);/ 仅仅用于测试,实际不可能这么写return params0 + "0"123456789101112131415161718192021222324252627281234 5678910111213141516171819202122232425262728sync:如果设置sync=true: a.如果缓存中没有数据,多个线 程同时访问这个方法,则只有一个方法会执行到方法,其它
27、方法需要等待 ; b. 如果缓存中已经有数据,则多个线程可以 同时从缓存中获取数据如果设置 sync=true,如果缓存中没有数据,多个线程同时访问这个方 法,则只有一个方法会执行到方法,其它方法需要等待* 如果缓存中已经有数据,则多个线程可以同时从缓 存中获取数据* param id* return*/Cacheable(cacheNames="book3", sync=true) public Book queryBookCacheableWithSync(String id) ("begin .queryBookCacheableByB
28、ookQry,id=",id);try Thread.sleep(1000 * 2); catch (InterruptedException e) ("end .queryBookCacheableByBookQry,id=",id);return repositoryBook.get(id);12345678910111213141516171234567891011121314151 617 condition 和 unless 只满足特定条件才进行缓存:condition: 在执行方法前, condition 的值为 true ,则缓
29、存数据 unless :在执行方法后,判断unless,如果值为true,则不缓存数据conditon和unless可以同时使用,则此时只缓存同时满足两 者的记录/* 条件缓存:* 只有满足 condition 的请求才可以进行缓存,如果不满足条件,则跟方法没有 Cacheable 注解的方法一样* 如下面只有 id < 3 才进行缓存*/Cacheable(cacheNames="book11",condition="T(java.lang.Integer).parseInt(#id) < 3 ")public Book queryBook
30、CacheableWithCondition(String id)("queryBookCacheableByBookQry,id=",id);return repositoryBook.get(id);/*条件缓存:对不满足 unless 的记录,才进行缓存"unless expressions" are evaluated after the method has been called* 如下面:只对不满足返回'T(java.lang.Integer).parseInt(#result.id) <3 '
31、的记录进行缓存* param id* return*/Cacheable(cacheNames="book22", unless ="T(java.lang.Integer).parseInt(#result.id) <3 ")public Book queryBookCacheableWithUnless(String id) ("queryBookCacheableByBookQry,id=",id);return repositoryBook.get(id);123456789101112131415
32、16171819202122232425123456 789101112131415161718192021222324253.3. CacheEvict删除缓存allEntries = true: 清空缓存 book1 里的所有值allEntries = false: 默认值,此时只删除 key 对应的值/* allEntries = true: 清空 book1 里的所有缓存*/CacheEvict(cacheNames="book1", allEntries=true) public void clearBook1All()("clea
33、rAll");/* 对符合 key 条件的记录从缓存中 book1 移除*/CacheEvict(cacheNames="book1", key="#id") public void updateBook(String id, String name) ("updateBook"); Book book = repositoryBook.get(id); if(book != null) book.setName(name); book.setUpdate(new Date();12345678910111213141516171819123456789101112131415161718193.4. CachePut 每次执行都会执行方法,无论缓存里是否有值,同时使用新 的返回值的替换缓存中的值。这里不同于Cacheable:Cacheable 如果缓存没有值, 从则执行方法并缓存数据, 如 果缓存有值,则从缓存中获取值CachePut(cacheNames="book1", key="#id") public Book queryBookCachePut(String id) ("queryBook
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论