Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

วิธีเรียกใช้ Redis SQL Query โดยไม่หยุดชะงัก

การเรียกใช้แบบสอบถาม Redis SQL ไม่ใช่เรื่องยาก จริง ๆ แล้วฉันหยิบยกประเด็นนี้ขึ้นมาเมื่อสองสามปีก่อนเมื่อพูดถึงเพื่อนที่จัดการโซลูชันคลังข้อมูลในบริษัทค้าปลีก เราเริ่มพูดถึงคำถามของ Redis เมื่อเขาอธิบายปัญหาที่เขาเผชิญ

เรามีปัญหากับโซลูชันคลังข้อมูลของเรา เรามีกรณีการใช้งานที่เราจำเป็นต้องบันทึกข้อมูลและดำเนินการวิเคราะห์แบบเรียลไทม์ อย่างไรก็ตาม บางครั้งอาจใช้เวลาไม่กี่นาทีเพื่อให้ได้ผลลัพธ์ Redis สามารถช่วยที่นี่ได้ไหม โปรดทราบว่าเราไม่สามารถริปและแทนที่โซลูชันที่ใช้ SQL ได้ทั้งหมดในคราวเดียว เราทำได้ทีละก้าวเท่านั้น

ตอนนี้ ถ้าคุณอยู่ในสถานการณ์เดียวกับเพื่อนของฉัน เรามีข่าวดีสำหรับคุณ มีหลายวิธีที่คุณสามารถเรียกใช้แบบสอบถาม Redis และแนะนำ Redis ในสถาปัตยกรรมของคุณโดยไม่ต้อง รบกวนโซลูชันที่ใช้ SQL ปัจจุบันของคุณ

มาสำรวจกันว่าคุณจะทำสิ่งนี้ได้อย่างไร แต่ก่อนที่เราจะไปต่อ เรามีผู้เข้าแข่งขัน Redis Hackathon ที่สร้างแอปของตัวเองที่อนุญาตให้คุณสืบค้นข้อมูลใน Redis ด้วย SQL

ชมวิดีโอด้านล่าง

สร้างตารางของคุณใหม่เป็นโครงสร้างข้อมูล Redis

การแมปตารางของคุณกับโครงสร้างข้อมูล Redis ค่อนข้างตรงไปตรงมา โครงสร้างข้อมูลที่มีประโยชน์ที่สุดที่ควรปฏิบัติตามคือ 

  • แฮช
  • ชุดเรียง
  • ชุด

วิธีหนึ่งที่คุณสามารถทำได้คือการจัดเก็บทุกแถวเป็นแฮชด้วยคีย์ที่ยึดตามคีย์หลักของตารางและมีคีย์ที่จัดเก็บไว้ในชุดหรือชุดที่จัดเรียง

รูปที่ 1 แสดงตัวอย่างวิธีการแมปตารางลงในโครงสร้างข้อมูล Redis ในตัวอย่างนี้ เรามีตารางชื่อ Products ทุกแถวจะจับคู่กับโครงสร้างข้อมูลแฮช

แถวที่มีรหัสหลัก 10001 จะเข้าสู่ Hash พร้อมคีย์:ผลิตภัณฑ์:10001 เรามีชุดการเรียงลำดับสองชุดในตัวอย่างนี้:ชุดแรกจะทำซ้ำผ่านชุดข้อมูลโดยคีย์หลัก และชุดที่สองสำหรับการค้นหาตามราคา

วิธีเรียกใช้ Redis SQL Query โดยไม่หยุดชะงัก


ด้วยตัวเลือกนี้ คุณต้องทำการเปลี่ยนแปลงโค้ดของคุณเพื่อใช้การสืบค้น Redis แทนคำสั่ง SQL ด้านล่างนี้คือตัวอย่างบางส่วนของคำสั่ง SQL และ Redis ที่เทียบเท่ากัน:

ก. ใส่ข้อมูล

SQL:
insert into Products (id, name, description, price)
values = (10200, “ZXYW”,“Description for ZXYW”, 300);
Redis:
MULTI
HMSET product:10200 name ZXYW desc “Description for ZXYW” price 300
ZADD product_list 10200 product:10200
ZADD product_price 300 product:10200
EXEC

ข. ค้นหาตามรหัสผลิตภัณฑ์

SQL:
select * from Products where id = 10200
Redis:
HGETALL product:10200

ค. สอบถามตามราคา

SQL:
select * from Product where price < 300
Redis: 
ZRANGEBYSCORE product_price 0 300 

ส่งคืนคีย์:ผลิตภัณฑ์:10001, ผลิตภัณฑ์:10002, ผลิตภัณฑ์:10003 ตอนนี้เรียกใช้ HGETALL สำหรับแต่ละคีย์

HGETALL product:10001
HGETALL product:10002
HGETALL product:10003

ใช้ DataFrames เพื่อจับคู่ตารางของคุณกับโครงสร้างข้อมูล Redis โดยอัตโนมัติ

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

ไลบรารี Spark-Redis อนุญาตให้คุณใช้ DataFrame API เพื่อจัดเก็บและเข้าถึงข้อมูล Redis กล่าวคือ คุณสามารถแทรก อัปเดต และสืบค้นข้อมูลโดยใช้คำสั่ง SQL แต่ข้อมูลจะถูกแมปภายในกับโครงสร้างข้อมูล Redis

วิธีเรียกใช้ Redis SQL Query โดยไม่หยุดชะงัก

ก่อนอื่น คุณต้องดาวน์โหลด spark-redis และสร้างไลบรารีเพื่อรับไฟล์ jar ตัวอย่างเช่น ด้วย spark-redis 2.3.1 คุณจะได้รับ spark-redis-2.3.1-SNAPSHOT-jar-with- dependencies.jar

จากนั้นคุณต้องตรวจสอบให้แน่ใจว่าคุณมีอินสแตนซ์ Redis ของคุณทำงานอยู่ ในตัวอย่างของเรา เราจะเรียกใช้ Redis บน localhost และพอร์ตเริ่มต้น 6379
คุณยังสามารถเรียกใช้การสืบค้นของคุณบนเอ็นจิ้น Apache Spark นี่คือตัวอย่างวิธีการทำสิ่งนี้:

$ spark-shell --jars spark-redis-2.3.1-SNAPSHOT-jar-with-dependencies.jar
scala> import org.apache.spark.sql.SparkSession

scala> val spark = SparkSession
.builder()
.appName("redis-sql")
.master("local[*]")
.config("spark.redis.host","localhost")
.config("spark.redis.port","6379").getOrCreate()

scala> import spark.sql

scala> import spark.implicits._

scala> sql("create table if not exists products(id string, name string, description string, price int) using org.apache.spark.sql.redis options (table 'product')")

scala> sql("insert into products values = ('10200','ZXYW','Description of ZXYW', 300)")

scala> val results = sql("select * from products")

scala> results.show()
+-----+----+-------------------+-----+
| id|name| description|price|
+-----+----+-------------------+-----+
|10200|ZXYW|Description of ZXYW| 300|
+-----+----+-------------------+-----+

ตอนนี้ คุณยังสามารถใช้ไคลเอ็นต์ Redis เพื่อเข้าถึงข้อมูลนี้เป็นโครงสร้างข้อมูล Redis:

127.0.0.1:6379> keys product*
1) "product:2e3f8611dbe94a588706a2aaea547caa"

วิธีที่มีประสิทธิภาพมากขึ้นคือการใช้คำสั่งสแกน เพราะจะช่วยให้คุณจัดหน้าข้อมูลในขณะที่คุณเลื่อนดูข้อมูล

127.0.0.1:6379> scan 0 match product*
1) "3"
2) 1) "product:2e3f8611dbe94a588706a2aaea547caa"
127.0.0.1:6379> hgetall product:2e3f8611dbe94a588706a2aaea547caa
1) "name"
2) "ZXYW"
3) "price"
4) "300"
5) "description"
6) "Description of ZXYW"
7) "id"
8) "10200"

และเราก็ทำได้ – สองวิธีง่ายๆ ที่คุณสามารถเรียกใช้การสืบค้น Redis SQL ได้โดยไม่หยุดชะงัก ก้าวไปอีกขั้น คุณอาจต้องการค้นหา ทำไม SQL Server ของคุณจึงต้องการ Redis ในสมุดปกขาวฉบับใหม่ของเรา

แต่สำหรับข้อมูลแบบเรียลไทม์กับ Redis นี่เป็นเพียงหนึ่งในหลายวิธีที่คุณสามารถใช้เพื่อมอบประสบการณ์แบบเรียลไทม์

หากคุณต้องการทราบว่า Redis สามารถรับประกันการส่งข้อมูลแบบเรียลไทม์ได้อย่างไร โปรดติดต่อเรา