Redis พร้อม Spring Boot

Nov 28 2022
บทนำ
ในโพสต์นี้ เราจะพูดถึง Redis ซึ่ง Redis เป็นฐานข้อมูล NoSQL ที่ใช้คีย์-ค่า ซึ่งสามารถใช้ได้หลายวัตถุประสงค์ เป็นโอเพ่นซอร์สและเป็นที่เก็บโครงสร้างข้อมูล InMemory
ภาพถ่ายโดย josh Glauser บน Unsplash

ในโพสต์นี้ เราจะพูดถึงRedis Redis คือฐานข้อมูล NoSQL ที่ใช้คีย์-ค่า ซึ่งสามารถใช้ได้หลายวัตถุประสงค์ เป็นโอเพ่นซอร์สและเป็นที่เก็บโครงสร้างข้อมูล InMemory เนื่องจาก Redis รองรับโครงสร้างข้อมูลพื้นฐานทั้งหมด เช่น รายการ ชุด แมป และชุดที่เรียงลำดับ

การใช้ Redis ทำให้เราสามารถพัฒนาแอปพลิเคชันประเภทต่างๆ ได้ เช่น แอปพลิเคชันแชท แอปพลิเคชันพื้นที่เก็บข้อมูลเซสชัน แดชบอร์ดเกม เป็นต้น

หากคุณต้องการเรียนรู้ Redis ก่อนอื่นให้ทำความเข้าใจเกี่ยวกับโครงสร้างข้อมูลต่างๆ ที่ Redis รองรับนอกเหนือจากคำสั่งที่ใช้ซึ่งเราสามารถจัดเก็บและรับข้อมูลจาก Redis

คำสั่งที่สำคัญบางอย่าง

Redis รองรับ String, Set, Sorted Set, List และ HashMap เป็นคีย์ — ค่า ด้านล่างนี้เป็นคำสั่งพื้นฐานบางส่วนเพื่อทำความเข้าใจเกี่ยวกับโครงสร้างข้อมูลต่างๆ

String 
SET foo bar (foo is key, bar is value)
GET foo
bar
HashMap

HMSET student name: "shubham" age: 25
HGETALL student
List
LPUSH product car
LPUSH product bike

LRANGE product 0 10
Set
SADD product car
SADD product bike

SMEMBERS product

ใช้กรณีของ Redis

  1. สามารถใช้ Redis เป็นฐานข้อมูล NoSQL ที่ใช้คีย์-ค่าได้
  2. สามารถใช้ Redis เป็นผู้ให้บริการแคชได้
  3. Redis สามารถใช้เป็นผู้เผยแพร่และผู้สมัครสมาชิกซึ่งใช้ในการประมวลผลเหตุการณ์
  4. สามารถใช้ Redis เป็นที่เก็บเซสชันได้
  5. สามารถใช้ Redis ในแอปพลิเคชันแชทได้

ดังนั้น หากคุณได้รับความสนใจหลังจากอ่านข้อความนี้ และตอนนี้คุณต้องการฝึกปฏิบัติจริงเกี่ยวกับ Redis ให้ตั้งค่าเซิร์ฟเวอร์ Redis ในระบบของคุณ

  1. ติดตั้ง homebrew ในระบบของคุณหากไม่มี
  2. คำสั่ง Run ด้านล่างตามลำดับ
  3. brew install redis
    
    After succesfull installation 
    
    brew services start redis
    
    After starting redis if you want to try above commands
    
    redis-cli
    
    To test whether redis server is working
    
    PING
    
    If yu get PONG then its connected
    
    If you want to monitor which all commands are getting executed on redis
    
    redis-monitor
    

หลังจากนี้ หากคุณต้องการใช้ Redis จากระบบอื่น คุณต้องมีไคลเอนต์ที่จะโต้ตอบกับเซิร์ฟเวอร์ Redis

ในส่วนนี้ เราจะมาดูกันว่าเราสามารถใช้ Redis กับสปริงบูตและใช้เป็น NoSQL DB ได้อย่างไร

ติดตั้ง

ขั้นตอนแรกคือการสร้างตัวอย่างโครงการ Spring boot จาก spring initializer และเพิ่มการพึ่งพาspring-boot-starter-data-redis

หลังจากนำเข้าโครงการไปยัง IDE ที่คุณชื่นชอบแล้ว ให้สร้างแพ็คเกจและคลาส

คลาสแรกจะเป็นการกำหนดค่า เรามีไดรเวอร์สองตัวสำหรับ Redis อันหนึ่งคือ Jedis อีกอันคือผักกาดหอม (เริ่มต้นอย่างขี้เกียจ และประสิทธิภาพก็ดีกว่าด้วย)

นอกจากไดรเวอร์แล้ว เราต้องการเทมเพลตสำหรับดำเนินการบนเซิร์ฟเวอร์ Redis เช่นเดียวกับที่เรามี RestTemplate สำหรับการดำเนินการพัก

package com.redisexample.redisdemo.config;

import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
//@EnableRedisRepositories
public class AppConfig {

    //There are two ways of creating driver, one is jedis another is lettuce,
    //lettuce is bit lazy in intialization so it creates beans  lazily
//It is using default host and port
    @Bean
    RedisConnectionFactory jedisConnectionFactory() {
        return new LettuceConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(jedisConnectionFactory());
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new JdkSerializationRedisSerializer());
        template.setValueSerializer(new JdkSerializationRedisSerializer());
        template.setEnableTransactionSupport(true);
        template.afterPropertiesSet();
        return template;
    }

    //For setting host and port
//    @Bean
//    JedisConnectionFactory jedisConnectionFactory() {
//        JedisConnectionFactory jedisConFactory
//                = new JedisConnectionFactory();
//        jedisConFactory.setHostName("localhost");
//        jedisConFactory.setPort(6379);
//        return jedisConFactory;
//    }

}

สร้างคลาสเอนทิตี

@RedisHash("student") // this is a set so we can use set command to see data via redis cli
public class Student {

    public enum Gender {
        MALE, FEMALE
    }

    private Long id;
    private String name;
    private int age;
    private String city;

    //getters and setters
}

@Repository
public interface StudnetRepo extends CrudRepository<Student, Long> {

}

package com.redisexample.redisdemo.controller;

import com.redisexample.redisdemo.model.Student;
import com.redisexample.redisdemo.repo.StudnetRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/student")
public class StudentController {

    @Autowired
    private StudnetRepo studnetRepo;

    @PostMapping
    public void saveStudent(@RequestBody Student student){
        studnetRepo.save(student);
    }

    @GetMapping
    public Iterable<Student> getStudent(){
        return studnetRepo.findAll();
    }
}

นี่เป็นตัวอย่างง่ายๆ ของการใช้ Redis เป็น DB กับแอปพลิเคชันสปริงบูต

ในโพสต์ถัดไป เราจะดูวิธีใช้ Redis เป็นผู้ให้บริการแคช

ขอบคุณที่อ่าน!!