>  기사  >  데이터 베이스  >  Redis 캐시 예제 코드 분석

Redis 캐시 예제 코드 분석

王林
王林앞으로
2023-06-03 20:37:561475검색

1. 소개

1. 시나리오

데이터 사전이 자주 변경되지 않고 시스템이 데이터 사전에 더 자주 액세스하므로 데이터베이스를 줄이기 위해 데이터 사전에 있는 데이터를 캐시에 저장해야 합니다. 압력을 가하고 액세스 속도를 향상시킵니다. 여기서는 시스템의 분산 캐시 미들웨어로 Redis를 사용합니다.

2. RedisTemplate

Spring Boot 프로젝트에는 Spring Data Redis가 기본적으로 통합되어 있습니다. Spring Data Redis는 Redis용 매우 편리한 작업 템플릿인 RedisTemplate을 제공하며 연결 ​​풀을 자동으로 관리할 수 있습니다.

2. Redis 소개

1. 프로젝트에 Redis 통합

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>

2. Redis 연결 구성

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

3. Redis 서비스 시작

Linux 서버에 원격으로 연결(여기서 로컬) Centos 가상 머신에서 redis 사용

#서비스 시작
cd /usr/local/redis-5.0.7
bin/redis -server redis.conf

3. RedisTemplate 테스트

1. 값 저장 테스트

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);
    }
}
에서 테스트 클래스 RedisTemplateTests를 생성합니다. RedisTemplate은 기본적으로 JDK 직렬화 방법을 사용하여 키와 값을 저장합니다. 읽을 수 없습니다

Redis 캐시 예제 코드 분석

2. Redis 구성 파일

service-base에 RedisConfig를 추가할 수 있습니다. Redis 직렬화 구성표는 이 구성 파일

@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;
    }
}

에서 다시 테스트합니다. 키는 문자열 저장소를 사용합니다. , 값은 json 스토리지를 사용합니다

Redis 캐시 예제 코드 분석

3. 값 테스트

@Test
public void getDict(){
    Dict dict = (Dict)redisTemplate.opsForValue().get("dict");
    System.out.println(dict);
}

4. redis

DictServiceImpl

에 데이터 사전을 저장합니다. 참고: Redis 서버가 다운되면 예외를 발생시키지 말고 실행해야 합니다. 비즈니스가 정상적으로 실행될 수 있도록 다음 프로세스를 수행합니다

@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 요약:

(1) 관련 종속성 가져오기

(2) Redis 연결 정보 구성

(3) 연결 테스트, 값 테스트, 값 테스트를 저장합니다.

(4) 필요에 따라 직렬 변환기를 구성합니다. 그렇지 않으면 JDK 직렬 변환기가 기본적으로 사용됩니다.

redis 업무 요약:

(1) 먼저 Redis에 해당 캐시 정보가 있는지 쿼리하고, 있으면 실행 없이 직접 검색하여 반환합니다. (2) 어떤 이유로 Redis를 연결할 수 없는 경우. 다운타임으로 이때 오류 로그를 인쇄하고 데이터베이스를 계속 쿼리합니다.

(2) 그렇지 않은 경우 데이터베이스를 쿼리하고 데이터를 redis에 저장한 후 데이터를 반환합니다.

위 내용은 Redis 캐시 예제 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제