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 สามารถรับประกันการส่งข้อมูลแบบเรียลไทม์ได้อย่างไร โปรดติดต่อเรา