Redis พร้อม Spring Boot
ในโพสต์นี้ เราจะพูดถึง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
- สามารถใช้ Redis เป็นฐานข้อมูล NoSQL ที่ใช้คีย์-ค่าได้
- สามารถใช้ Redis เป็นผู้ให้บริการแคชได้
- Redis สามารถใช้เป็นผู้เผยแพร่และผู้สมัครสมาชิกซึ่งใช้ในการประมวลผลเหตุการณ์
- สามารถใช้ Redis เป็นที่เก็บเซสชันได้
- สามารถใช้ Redis ในแอปพลิเคชันแชทได้
ดังนั้น หากคุณได้รับความสนใจหลังจากอ่านข้อความนี้ และตอนนี้คุณต้องการฝึกปฏิบัติจริงเกี่ยวกับ Redis ให้ตั้งค่าเซิร์ฟเวอร์ Redis ในระบบของคุณ
- ติดตั้ง homebrew ในระบบของคุณหากไม่มี
- คำสั่ง Run ด้านล่างตามลำดับ
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 เป็นผู้ให้บริการแคช
ขอบคุณที่อ่าน!!