跟着JHipster学做项目 (10) 缓存的应用

JHipster对于缓存的应用有两个层级,一种是对于DTO的缓存,另外是Hibernate第二级缓存。本文着重介绍第一种,对于DTO层的缓存。

在应用程序中往往需要对登录用户信息进行多次查询,比如验证用户的状态等等,将用户DTO放进缓存,会大大减少对数据库的访问。

JHipster支持五种缓存实现: Ehcache, Caffeine, Hazelcast, Infinispan and Memcached。以Ehcache为例,首先引入依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-cache</artifactId>
		</dependency>
        <dependency>
            <groupId>javax.cache</groupId>
            <artifactId>cache-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>

缓存配置代码如下:默认配置缓存对象1小时,最大缓存对象数目为100

@Configuration
@EnableCaching
public class CacheConfiguration {

    private final javax.cache.configuration.Configuration<Object, Object> jcacheConfiguration;

    public CacheConfiguration(JHipsterProperties jHipsterProperties) {
        JHipsterProperties.Cache.Ehcache ehcache = jHipsterProperties.getCache().getEhcache();

        jcacheConfiguration = Eh107Configuration.fromEhcacheCacheConfiguration(
            CacheConfigurationBuilder.newCacheConfigurationBuilder(Object.class, Object.class,
                ResourcePoolsBuilder.heap(ehcache.getMaxEntries()))
                .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(ehcache.getTimeToLiveSeconds())))
                .build());
    }


    @Bean
    public JCacheManagerCustomizer cacheManagerCustomizer() {
        return cm -> {
            createCache(cm, UserRepository.USERS_BY_USER_NAME_CACHE);
        };
    }

    private void createCache(javax.cache.CacheManager cm, String cacheName) {
        javax.cache.Cache<Object, Object> cache = cm.getCache(cacheName);
        if (cache == null) {
            cm.createCache(cacheName, jcacheConfiguration);
        }
    }

}

通过以上配置,只需在repository类中添加@Cacheable注解,便实现缓存处理,代码如下:

    String USERS_BY_USER_NAME_CACHE = "usersByUserName";
    
    @Cacheable(cacheNames = USERS_BY_USER_NAME_CACHE)
	Optional<ApplicationUser> findByUserName(String userName);

实现缓存以后需要注意,任何对用户信息产生变更的操作(通常位于UserService中),需要对缓存进行处理:例如

public Optional<User> activateRegistration(String key) {
        log.debug("Activating user for activation key {}", key);
        return userRepository.findOneByActivationKey(key)
            .map(user -> {
                // activate given user for the registration key.
                user.setActivated(true);
                user.setActivationKey(null);
                userRepository.save(user);
                this.clearUserCaches(user);
                log.debug("Activated user: {}", user);
                return user;
            });
    }
    
private void clearUserCaches(User user) {
            
 Objects.requireNonNull(cacheManager.getCache(UserRepository.USERS_BY_USER_NAME_CACHE)).evict(user.getUserName());

    }

Good Luck,

Cheers!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值