https://my.oschina.net/u/3866531/blog/1840386java
Spring提供CompositeCacheManager的主要目的就是为了混合使用多种缓存时进行管理。redis
package com.ding.data.cache; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.annotation.PostConstruct; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service //@CacheConfig(cacheManager = "guavaCacheManager") public class GuavaDataCache { private Map<Long, String> dataMap = new HashMap<Long, String>(); /** * 初始化 */ @PostConstruct public void init() { dataMap.put(1L, "张三"); dataMap.put(2L, "李四"); dataMap.put(3L, "王五"); } /** * 查询 * 若是数据没有缓存,那么从dataMap里面获取,若是缓存了, * 那么从guavaDemo里面获取 * 而且将缓存的数据存入到 guavaDemo里面 * 其中key 为 #id+dataMap */ @Cacheable(value="guavaDemo" ,key="#id + 'dataMap'") public String query(Long id) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : query id is " + id); return dataMap.get(id); } /** * 插入 或者更新 * 插入或更新数据到dataMap中 * 而且缓存到 guavaDemo中 * 若是存在了那么更新缓存中的值 * 其中key 为 #id+dataMap */ @CachePut(value="guavaDemo" ,key="#id + 'dataMap'") public String put(Long id, String value) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : add data ,id is "+ id); dataMap.put(id, value); // data persistence return value; } /** * 删除 * 删除dataMap里面的数据 * 而且删除缓存guavaDemo中的数据 * 其中key 为 #id+dataMap */ @CacheEvict(value="guavaDemo" , key="#id + 'dataMap'") public void remove(Long id) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : remove id is "+ id + " data"); dataMap.remove(id); // data remove } }
package com.ding.data.cache; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.annotation.PostConstruct; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service //@CacheConfig(cacheManager = "redisCacheManager") public class RedisDataCache { private Map<Long, String> dataMap = new HashMap<Long, String>(); /** * 初始化 */ @PostConstruct public void init() { dataMap.put(1L, "111"); dataMap.put(2L, "222"); dataMap.put(3L, "333"); } /** * 查询 * 若是数据没有缓存,那么从dataMap里面获取,若是缓存了, * 那么从guavaDemo里面获取 * 而且将缓存的数据存入到 guavaDemo里面 * 其中key 为 #id+dataMap */ @Cacheable(value="redisDemo" ,key="#id + 'dataMap'") public String query(Long id) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : query id is " + id); return dataMap.get(id); } /** * 插入 或者更新 * 插入或更新数据到dataMap中 * 而且缓存到 guavaDemo中 * 若是存在了那么更新缓存中的值 * 其中key 为 #id+dataMap */ @CachePut(value="redisDemo" ,key="#id + 'dataMap'") public String put(Long id, String value) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : add data ,id is "+ id); dataMap.put(id, value); // data persistence return value; } /** * 删除 * 删除dataMap里面的数据 * 而且删除缓存guavaDemo中的数据 * 其中key 为 #id+dataMap */ @CacheEvict(value="redisDemo" , key="#id + 'dataMap'") public void remove(Long id) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : remove id is "+ id + " data"); dataMap.remove(id); // data remove } }
package com.ding.data.config; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; import javax.annotation.Resource; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.cache.CacheManager; import org.springframework.cache.guava.GuavaCacheManager; import org.springframework.cache.support.CompositeCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; @Configuration public class CacheConfig implements ApplicationRunner { @Resource private List<CacheManager> cacheManagers; public void run(ApplicationArguments args) throws Exception { System.out.println("CacheManager大小为=========" + cacheManagers.size()); System.out.println("================================================="); for(CacheManager c:cacheManagers){ System.out.println(c.getCacheNames()); } } @Bean(name = "redisCacheManager") public RedisCacheManager redisCacheManager( RedisTemplate<Object, Object> redisTemplate) { redisTemplate.setKeySerializer(new StringRedisSerializer()); RedisCacheManager redisCacheManager = new RedisCacheManager( redisTemplate); redisCacheManager.setCacheNames(Arrays.asList("redisDemo")); redisCacheManager.setUsePrefix(true); return redisCacheManager; } @Bean(name = "guavaCacheManager") public GuavaCacheManager getGuavaCacheManager() { GuavaCacheManager guavaCacheManager = new GuavaCacheManager(); guavaCacheManager.setCacheBuilder(CacheBuilder.newBuilder() .expireAfterWrite(3600, TimeUnit.SECONDS).maximumSize(1000)); ArrayList<String> guavaCacheNames = Lists.newArrayList(); guavaCacheNames.add("guavaDemo"); guavaCacheManager.setCacheNames(guavaCacheNames); return guavaCacheManager; } @Bean(name = "cacheManager") @Primary public CompositeCacheManager cacheManager( RedisCacheManager redisCacheManager, GuavaCacheManager guavaCacheManager) { CompositeCacheManager cacheManager = new CompositeCacheManager( redisCacheManager, guavaCacheManager); return cacheManager; } }
package com.ding.data.cache; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.annotation.PostConstruct; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service @CacheConfig(cacheManager = "guavaCacheManager") public class GuavaDataCache { private Map<Long, String> dataMap = new HashMap<Long, String>(); /** * 初始化 */ @PostConstruct public void init() { dataMap.put(1L, "张三"); dataMap.put(2L, "李四"); dataMap.put(3L, "王五"); } /** * 查询 * 若是数据没有缓存,那么从dataMap里面获取,若是缓存了, * 那么从guavaDemo里面获取 * 而且将缓存的数据存入到 guavaDemo里面 * 其中key 为 #id+dataMap */ @Cacheable(value="guavaDemo" ,key="#id + 'dataMap'") public String query(Long id) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : query id is " + id); return dataMap.get(id); } /** * 插入 或者更新 * 插入或更新数据到dataMap中 * 而且缓存到 guavaDemo中 * 若是存在了那么更新缓存中的值 * 其中key 为 #id+dataMap */ @CachePut(value="guavaDemo" ,key="#id + 'dataMap'") public String put(Long id, String value) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : add data ,id is "+ id); dataMap.put(id, value); // data persistence return value; } /** * 删除 * 删除dataMap里面的数据 * 而且删除缓存guavaDemo中的数据 * 其中key 为 #id+dataMap */ @CacheEvict(value="guavaDemo" , key="#id + 'dataMap'") public void remove(Long id) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : remove id is "+ id + " data"); dataMap.remove(id); // data remove } }
package com.ding.data.cache; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.annotation.PostConstruct; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service @CacheConfig(cacheManager = "redisCacheManager") public class RedisDataCache { private Map<Long, String> dataMap = new HashMap<Long, String>(); /** * 初始化 */ @PostConstruct public void init() { dataMap.put(1L, "111"); dataMap.put(2L, "222"); dataMap.put(3L, "333"); } /** * 查询 * 若是数据没有缓存,那么从dataMap里面获取,若是缓存了, * 那么从guavaDemo里面获取 * 而且将缓存的数据存入到 guavaDemo里面 * 其中key 为 #id+dataMap */ @Cacheable(value="redisDemo" ,key="#id + 'dataMap'") public String query(Long id) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : query id is " + id); return dataMap.get(id); } /** * 插入 或者更新 * 插入或更新数据到dataMap中 * 而且缓存到 guavaDemo中 * 若是存在了那么更新缓存中的值 * 其中key 为 #id+dataMap */ @CachePut(value="redisDemo" ,key="#id + 'dataMap'") public String put(Long id, String value) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : add data ,id is "+ id); dataMap.put(id, value); // data persistence return value; } /** * 删除 * 删除dataMap里面的数据 * 而且删除缓存guavaDemo中的数据 * 其中key 为 #id+dataMap */ @CacheEvict(value="redisDemo" , key="#id + 'dataMap'") public void remove(Long id) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(new Date()) + " : remove id is "+ id + " data"); dataMap.remove(id); // data remove } }
package com.ding.data.config; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; import javax.annotation.Resource; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.cache.CacheManager; import org.springframework.cache.guava.GuavaCacheManager; 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; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; @Configuration public class CacheConfig implements ApplicationRunner { @Resource private List<CacheManager> cacheManagers; public void run(ApplicationArguments args) throws Exception { System.out.println("CacheManager大小为=========" + cacheManagers.size()); System.out.println("================================================="); for(CacheManager c:cacheManagers){ System.out.println(c.getCacheNames()); } } @Bean(name = "redisCacheManager") public RedisCacheManager redisCacheManager( RedisTemplate<Object, Object> redisTemplate) { redisTemplate.setKeySerializer(new StringRedisSerializer()); RedisCacheManager redisCacheManager = new RedisCacheManager( redisTemplate); redisCacheManager.setCacheNames(Arrays.asList("redisDemo")); redisCacheManager.setUsePrefix(true); return redisCacheManager; } @Bean(name = "guavaCacheManager") public GuavaCacheManager getGuavaCacheManager() { GuavaCacheManager guavaCacheManager = new GuavaCacheManager(); guavaCacheManager.setCacheBuilder(CacheBuilder.newBuilder() .expireAfterWrite(3600, TimeUnit.SECONDS).maximumSize(1000)); ArrayList<String> guavaCacheNames = Lists.newArrayList(); guavaCacheNames.add("guavaDemo"); guavaCacheManager.setCacheNames(guavaCacheNames); return guavaCacheManager; } // @Bean(name = "cacheManager") // @Primary // public CompositeCacheManager cacheManager( // RedisCacheManager redisCacheManager, // GuavaCacheManager guavaCacheManager) { // CompositeCacheManager cacheManager = new CompositeCacheManager( // redisCacheManager, guavaCacheManager); // return cacheManager; // } }
java.lang.IllegalStateException: No CacheResolver specified, and no unique bean of type CacheManager found. Mark one as primary (or give it the name 'cacheManager') or declare a specific CacheManager to use, that serves as the default one.spring
at org.springframework.cache.interceptor.CacheAspectSupport.afterSingletonsInstantiated(CacheAspectSupport.java:186) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]缓存
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:792) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]spring-boot
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]测试
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]ui
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]google
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]spa
at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE].net
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
at com.ding.data.App.main(App.java:33) [classes/:na]
package com.ding.data.config; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; import javax.annotation.Resource; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.cache.CacheManager; import org.springframework.cache.guava.GuavaCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; @Configuration public class CacheConfig implements ApplicationRunner { @Resource private List<CacheManager> cacheManagers; public void run(ApplicationArguments args) throws Exception { System.out.println("CacheManager大小为=========" + cacheManagers.size()); System.out.println("================================================="); for(CacheManager c:cacheManagers){ System.out.println(c.getCacheNames()); } } @Bean(name = "redisCacheManager") public RedisCacheManager redisCacheManager( RedisTemplate<Object, Object> redisTemplate) { redisTemplate.setKeySerializer(new StringRedisSerializer()); RedisCacheManager redisCacheManager = new RedisCacheManager( redisTemplate); redisCacheManager.setCacheNames(Arrays.asList("redisDemo")); redisCacheManager.setUsePrefix(true); return redisCacheManager; } @Bean(name = "guavaCacheManager") @Primary public GuavaCacheManager getGuavaCacheManager() { GuavaCacheManager guavaCacheManager = new GuavaCacheManager(); guavaCacheManager.setCacheBuilder(CacheBuilder.newBuilder() .expireAfterWrite(3600, TimeUnit.SECONDS).maximumSize(1000)); ArrayList<String> guavaCacheNames = Lists.newArrayList(); guavaCacheNames.add("guavaDemo"); guavaCacheManager.setCacheNames(guavaCacheNames); return guavaCacheManager; } // @Bean(name = "cacheManager") // @Primary // public CompositeCacheManager cacheManager( // RedisCacheManager redisCacheManager, // GuavaCacheManager guavaCacheManager) { // CompositeCacheManager cacheManager = new CompositeCacheManager( // redisCacheManager, guavaCacheManager); // return cacheManager; // } }