데이터 사전이 자주 변경되지 않고 시스템이 데이터 사전에 더 자주 액세스하므로 데이터베이스를 줄이기 위해 데이터 사전에 있는 데이터를 캐시에 저장해야 합니다. 압력을 가하고 액세스 속도를 향상시킵니다. 여기서는 시스템의 분산 캐시 미들웨어로 Redis를 사용합니다.
Spring Boot 프로젝트에는 Spring Data Redis가 기본적으로 통합되어 있습니다. Spring Data Redis는 Redis용 매우 편리한 작업 템플릿인 RedisTemplate을 제공하며 연결 풀을 자동으로 관리할 수 있습니다.
Spring Boot 2.0 이상은 기본적으로 commons-pool2 연결 풀을 통해 Redis에 연결됩니다
<!-- spring boot redis缓存引入 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 缓存连接池--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!-- redis 存储 json序列化 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
service - -core
#spring의 application.yml에 다음 구성을 추가합니다.
redis:
호스트: 192.168.100.100
포트: 6379
데이터베이스: 0
비밀번호: 123456 #기본값은 비어 있습니다
timeout: 3000ms #최대 대기 시간, 시간이 초과되면 예외가 발생하고 그렇지 않으면 요청이 계속 대기합니다
lettuce:
pool:
max-active: 20 #최대 연결 수, 음수 값은 제한 없음을 의미합니다. 기본값 8
max-wait: -1 #최대 차단 대기 시간, 음수 값 제한 없음을 나타냄, 기본값 -1
max-idle: 8 #최대 유휴 연결, 기본값 8
min-idle: 0 #최소 유휴 연결, 기본값 0
Linux 서버에 원격으로 연결(여기서 로컬) Centos 가상 머신에서 redis 사용
#서비스 시작
cd /usr/local/redis-5.0.7
bin/redis -server redis.conf
test
@SpringBootTest @RunWith(SpringRunner.class) public class RedisTemplateTests { @Resource private RedisTemplate redisTemplate; @Resource private DictMapper dictMapper; @Test public void saveDict(){ Dict dict = dictMapper.selectById(1); //向数据库中存储string类型的键值对, 过期时间5分钟 redisTemplate.opsForValue().set("dict", dict, 5, TimeUnit.MINUTES); } }
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); //首先解决key的序列化方式 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); //解决value的序列化方式 Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); //序列化时将类的数据类型存入json,以便反序列化的时候转换成正确的类型 ObjectMapper objectMapper = new ObjectMapper(); //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); // 解决jackson2无法反序列化LocalDateTime的问题 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.registerModule(new JavaTimeModule()); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); return redisTemplate; } }
@Test public void getDict(){ Dict dict = (Dict)redisTemplate.opsForValue().get("dict"); System.out.println(dict); }
@Resource private RedisTemplate redisTemplate; @Override public List<Dict> listByParentId(Long parentId) { //先查询redis中是否存在数据列表 List<Dict> dictList = null; try { dictList = (List<Dict>)redisTemplate.opsForValue().get("srb:core:dictList:" + parentId); if(dictList != null){ log.info("从redis中取值"); return dictList; } } catch (Exception e) { log.error("redis服务器异常:" + ExceptionUtils.getStackTrace(e));//此处不抛出异常,继续执行后面的代码 } log.info("从数据库中取值"); dictList = baseMapper.selectList(new QueryWrapper<Dict>().eq("parent_id", parentId)); dictList.forEach(dict -> { //如果有子节点,则是非叶子节点 boolean hasChildren = this.hasChildren(dict.getId()); dict.setHasChildren(hasChildren); }); //将数据存入redis try { redisTemplate.opsForValue().set("srb:core:dictList:" + parentId, dictList, 5, TimeUnit.MINUTES); log.info("数据存入redis"); } catch (Exception e) { log.error("redis服务器异常:" + ExceptionUtils.getStackTrace(e));//此处不抛出异常,继续执行后面的代码 } return dictList; }
위 내용은 Redis 캐시 예제 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!