前言
传统的业务中,数据的查询是直接从数据库中查询,随着业务发展,用户的访问量会增加,这个时候再继续从数据库中查询
数据,系统IO开销就会很大,给系统造成压力,严重的话会造成宕机,系统崩溃等。为了解决这种问题,缓存机制就诞生了。
用户访问时就用户不经常修改的数据放到缓存中,下次请求时直接从缓存中取出,而是从缓存中取数据,这样就大大减少了
数据库访问的压力。以下介绍下在SpringBoot项目如何集成Redis实现数据的缓存。
一:添加redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.9.RELEASE</version>
</dependency>
二:Redis缓存配置
@Configuration
@EnableCaching
@CacheConfig
@SuppressWarnings("all")
public class RedisConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
return new RedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(factory),
this.cacheConfigEntryTtl(DEFAULT_EXPIRE_10, ChronoUnit.SECONDS),
this.redisCacheConfigMap());
}
@Bean
@ConditionalOnMissingBean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setDefaultSerializer(this.serializer());
return redisTemplate;
}
private Map<String, RedisCacheConfiguration> redisCacheConfigMap() {
Map<String, RedisCacheConfiguration> cacheConfigurationMap = new HashMap<>();
cacheConfigurationMap.put(USER_NAME_CACHE, cacheConfigEntryTtl(USER_NAME_EXPIRE_23, ChronoUnit.HOURS));
return cacheConfigurationMap;
}
private RedisCacheConfiguration cacheConfigEntryTtl(long time, TemporalUnit timeUnit) {
return RedisCacheConfiguration
.defaultCacheConfig()
.serializeKeysWith(fromSerializer(RedisSerializer.string()))
.serializeValuesWith(fromSerializer(this.serializer()))
.disableCachingNullValues()
.entryTtl(Duration.of(time, timeUnit));
}
private RedisSerializer serializer() {
return new FastJsonRedisSerializer(Object.class);
}
}
三:基于注解的缓存使用
@Override
@Cacheable(value = USER_NAME_CACHE, key = "#userName", unless = "#result==null")
public Optional<User> findByUserName(String userName) {
User user = userDao.findByUserName(userName).orElse(null);
if (Objects.isNull(user)) {
return Optional.empty();
}
Role role = roleDao.findByUserId(user.getId()).orElseGet(Role::new);
List<Permission> permissions = permissionDao.findByRoleId(role.getId()).orElseGet(PersistentBag::new);
user.setRoles(Lists.newArrayList(role));
user.setPermissions(permissions);
permissions.parallelStream().forEach(permission -> permission.setAllowUri("/22"));
return Optional.of(user);
}