キャッシュSpringboot環境でのRedisの使用



こんにちは、今日はキャッシュサーバの1つであるredisを使用してspringfootに接続します.😀

Redisサーバのインストール


redisを使用するには、まずredisサーバをインストールする必要があります.
(springbootはredisクライアントとして使用されます)

まず、redisのホームページではオペレーティングシステムに基づいてredisサーバをダウンロードすることができて、私はdockerを使ってダウンロードしました!
dockerコマンドは次のとおりです.
1) docker network create redis-net
- 저는 redis-cli와 redis를 연결해서 결과들을 확인해보기 위해서 두 컨테이너를 연결하기 위한 네트워크(redis-net)를 생성했습니다 
- docker network ls 명령어로 생성 여부 확인 가능합니다 

2) docker pull redis
- redis image pull

3) docker run --name redis-server -p 6379:6379 --network redis-net -d redis redis-server --appendonly yes
- redis 기본 포트는 6379 
- redis-net에 연결 
- appendonly 명령어로 AOF 방식으로 저장을 하도록 했습니다 

4) docker run -it --network redis-net --rm redis redis-cli -h redis-server
- redis-cli를 이용해 redis 서버로 접속하도록 했습니다
次に、redisサーバで値を操作できます.
redisはkeyとvalue形式で値を格納する

Springbootとredis-clientバインド


ここでは、Springbootを使用してredisに接続する方法について説明します.
実際、JPAの使い方にほぼ近いと考えられます.😂

  • 必要なライブラリを最初に追加
    pom.xml
  •             <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>2.3.3.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>3.3.0</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
  • 以降相関設定
  • が行う.
    @Configuration
    public class RedisConfig {
        @Bean
        JedisConnectionFactory jedisConnectionFactory() {
    
            RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration();
            redisConfig.setHostName("192.168.0.20");
            redisConfig.setPort(6379);
    
            return new JedisConnectionFactory(redisConfig);
    
        }
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate() {
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(jedisConnectionFactory());
            return template;
        }
    }
    
  • は本来、ホスト名とポートを直接設定することができるが、廃棄されているため、RedisStationeConfigurationを使用して関連設定を行う.
  • 保存するEntityを作成します
    Student.java
    
    @RedisHash("Student")
    @AllArgsConstructor
    @ToString
    @Setter
    public class Student {
    
        public enum Gender{
            MALE, FEMALE
        }
    
        private String id;
        private String name;
        private Gender gender;
        private int grade;
    
    }
    
  • 2@RedisHashで値をKey、インスタンスで値
  • に設定.
  • JPAのレポートを作成しました
    StudentRepository.java
    @Repository
    public interface StudentRepository extends CrudRepository<Student, String> {
    }
    
    テストを行いました.
    RedisTest
    @SpringBootTest
    public class RedisTest {
    
        @Autowired
        StudentRepository studentRepository;
    	
        //insert
        @Test
        void saveTest(){
            Student student1 = new Student("1", "zzarbttoo1", Student.Gender.FEMALE, 1);
            Student student2 = new Student("2", "zzarbttoo2", Student.Gender.FEMALE, 2);
            Student student3 = new Student("3", "zzarbttoo3", Student.Gender.FEMALE, 3);
            Student student4 = new Student("4", "zzarbttoo4", Student.Gender.FEMALE, 4);
            Student student5 = new Student("5", "zzarbttoo5", Student.Gender.FEMALE, 5);
    
            studentRepository.save(student1);
            studentRepository.save(student2);
            studentRepository.save(student3);
            studentRepository.save(student4);
            studentRepository.save(student5);
        }
    
    	//select
        @Test
        void selectTest(){
    
            Student selectStudent1 = studentRepository.findById("1").get();
            Student selectStudent2 = studentRepository.findById("2").get();
            Student selectStudent3 = studentRepository.findById("3").get();
            Student selectStudent4 = studentRepository.findById("4").get();
            Student selectStudent5 = studentRepository.findById("5").get();
    
            System.out.println(selectStudent1.toString());
            System.out.println(selectStudent2.toString());
            System.out.println(selectStudent3.toString());
            System.out.println(selectStudent4.toString());
            System.out.println(selectStudent5.toString());
        }
    	
        //update
        @Test
        void updateTest(){
    
            Student selectStudent1 = studentRepository.findById("1").get();
            selectStudent1.setName("updated Name");
            studentRepository.save(selectStudent1);
            System.out.println(selectStudent1.toString());
    
        }
    	
        //delete
        @Test
        void deleteTest(){
            studentRepository.deleteById("2");
            Assertions.assertThrows(NoSuchElementException.class, () -> studentRepository.findById("2").get());
        }
    	
        //selectAll
        @Test
        void selectAllTest(){
            List<Student> students = new ArrayList<>();
            studentRepository.findAll().forEach(students::add);
            System.out.println(students.toString());
        }
    
    }
    
    
    
  • Jpaと同じ方法でredis,
  • を操作できます.
  • delete以降の値が消えていることがわかります
  • 次に、redisとmysqlを組み合わせて使用する方法を学びます.
    ソース
    https://www.baeldung.com/spring-data-redis-tutorial
    https://hub.docker.com/_/redis
    https://giles.tistory.com/38
    https://www.daleseo.com/docker-networks/
    https://jistol.github.io/docker/2017/09/01/docker-redis/
    https://littleshark.tistory.com/68
    https://stackoverflow.com/questions/49021994/jedisconnectionfactory-sethostname-is-deprecated
    https://sungwookkang.com/1313