使用spring cacheManager配置Guava Cache和Redis Cache

13 篇文章 0 订阅
3 篇文章 0 订阅
简单两步,利用spring的cacheManager配置 Guava Cache,同时还可以配置以redis实现的cache。使用时通过配置自由切换不同的cache实现。

1、创建配置类:
/**
 * Cache配置類,用于缓存方法返回的数据
 * @author XuJijun
 *
 */
@Configuration
@EnableCaching
public class CacheConfig {

    public static final int DEFAULT_MAXSIZE = 50000;
    public static final int DEFAULT_TTL = 10;

    /**
     * 定義cache名稱、超時時長(秒)、最大size
     * 每个cache缺省10秒超时、最多缓存50000条数据,需要修改可以在构造方法的参数中指定。
     */
    public enum Caches{
        messageContent(8640000),
        getSomeData,
        qiniuUpToken(1800, 1),

        getCommonAds(60),
        getAndAssembleAreaSpecificAds(60);

        Caches() {
        }

        Caches(int ttl) {
            this.ttl = ttl;
        }

        Caches(int ttl, int maxSize) {
            this.ttl = ttl;
            this.maxSize = maxSize;
        }

        private int maxSize=DEFAULT_MAXSIZE;    //最大數量
        private int ttl=DEFAULT_TTL;        //过期时间(秒)

        public int getMaxSize() {
            return maxSize;
        }
        public void setMaxSize(int maxSize) {
            this.maxSize = maxSize;
        }
        public int getTtl() {
            return ttl;
        }
        public void setTtl(int ttl) {
            this.ttl = ttl;
        }
    }

    /**
     * 创建基于guava的Cache Manager
     * @return
     */
    @Bean
    @Primary
    public CacheManager guavaCacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();

        //把各个cache注册到cacheManager中,GuavaCache实现了org.springframework.cache.Cache接口
        ArrayList<GuavaCache> caches = new ArrayList<GuavaCache>();
        for(Caches c : Caches.values()){
            caches.add(new GuavaCache(c.name(), CacheBuilder.newBuilder().recordStats().expireAfterWrite(c.getTtl(), TimeUnit.SECONDS).maximumSize(c.getMaxSize()).build()));
        }
        cacheManager.setCaches(caches);
        return cacheManager;
    }

    @Autowired
    private JedisCluster jedisCluster;

    /**
     * 创建基于redis的Cache Manager
     * @return
     */
    @Bean
    public CacheManager redisCacheManager() {
        JedisClusterCacheManager cacheManager = new JedisClusterCacheManager(jedisCluster);

        ArrayList<JedisClusterCache> caches = new ArrayList<JedisClusterCache>();

        //把各个cache注册到cacheManager中,JedisClusterCache实现了org.springframework.cache.Cache接口
        for(Caches c: Caches.values()){
            caches.add(new JedisClusterCache(c.name(), jedisCluster, c.getTtl()));
        }
        cacheManager.setCaches(caches);
        return cacheManager;
    }
}


2、使用:
    /**
     * 根据模块获取有效的、通用的广告列表
     * 
     * @author XuJijun
     * @param mType 广告模块
     * @return
     */
    @Override
    @Cacheable("getCommonAds")
    public List<Advert> getCommonAds(int mType) {
        return advertDAO.getAdvertsByModuleType(mType);
    }


注:@Cacheable注解里面指定了value=cacheName,这个注解的其他主要参数:
  • cacheManager:指定由哪个cacheManager(比如可以指定为"redisCacheManager")来管理这个cache,不指定的话使用spring注解@Primary的那个;
  • key:指定key的SpEL表达式,不指定的话,使用方法的参数作为key;
  • GuavaCache需要依赖Guava的jar包:
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>19.0</version>
		</dependency>


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
使用SpringCacheRedis可以很方便地实现数据缓存,下面是具体的步骤: 1. 配置Redis 首先需要在项目中引入Redis相关的依赖,如下: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 然后在application.properties文件中配置Redis的连接信息,如下: ```properties spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password=123456 ``` 2. 配置SpringCacheSpringBoot中,可以使用@Cacheable、@CachePut、@CacheEvict等注解来实现缓存,但是需要配置一个CacheManager来管理缓存。可以使用RedisCacheManager来管理Redis缓存,如下: ```java @Configuration @EnableCaching public class CacheConfig extends CachingConfigurerSupport { @Bean public RedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); jedisConnectionFactory.setHostName("127.0.0.1"); jedisConnectionFactory.setPort(6379); jedisConnectionFactory.setPassword("123456"); return jedisConnectionFactory; } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory()); redisTemplate.setDefaultSerializer(new StringRedisSerializer()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } @Bean public CacheManager cacheManager() { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory()) .cacheDefaults(redisCacheConfiguration) .transactionAware() .build(); return redisCacheManager; } } ``` 其中,redisConnectionFactory方法是用来创建Redis连接的,redisTemplate方法是用来进行Redis操作的,cacheManager方法是用来创建RedisCacheManager的。 3. 使用缓存 有了上面的配置之后,就可以在项目中使用缓存了。例如,我们可以对一个方法进行缓存,如下: ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Cacheable(value = "userCache", key = "#id") public User getUserById(Long id) { System.out.println("getUserById from DB"); return userRepository.findById(id).orElse(null); } } ``` 在这个例子中,我们使用了@Cacheable注解将getUserById方法进行了缓存,value属性表示缓存的名称,key属性表示缓存的键值。如果缓存中已经有了对应的数据,则直接从缓存中获取数据,否则就从数据库中获取数据,并将数据加入到缓存中。 4. 清除缓存 有时候需要从缓存中清除某些数据,可以使用@CacheEvict注解来实现,如下: ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Cacheable(value = "userCache", key = "#id") public User getUserById(Long id) { System.out.println("getUserById from DB"); return userRepository.findById(id).orElse(null); } @CacheEvict(value = "userCache", key = "#id") public void deleteUserById(Long id) { userRepository.deleteById(id); } } ``` 在这个例子中,我们使用了@CacheEvict注解将deleteUserById方法进行了缓存清除,value属性表示缓存的名称,key属性表示缓存的键值。如果有对应的数据,则从缓存中清除该数据。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值