Redis เป็นเพียงแคชหรือไม่


255

ผมได้อ่านบางเอกสาร Redis และพยายามที่กวดวิชาที่http://try.redis-db.com/ จนถึงตอนนี้ฉันไม่เห็นความแตกต่างระหว่าง Redis และเทคโนโลยีการแคชเช่น Velocity หรือ Enterprise Library Caching Framework

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

ฉันพลาดอะไรไป


3
จากredis.io : Redis เป็นโอเพ่นซอร์สที่เก็บคีย์ - ค่าขั้นสูง มันมักจะเรียกว่าเซิร์ฟเวอร์โครงสร้างข้อมูลเนื่องจากคีย์สามารถมีสตริง, แฮช, รายการ, ชุดและชุดเรียง ที่กล่าวว่าฉันลงคะแนนให้ปิดคำถามของคุณเนื่องจากไม่เหมาะกับรูปแบบของ StackOverflow
Linus Thiel

29
ฉันเห็นด้วยไม่ใช่รูปแบบ SO คุณคิดว่ามันจะเหมาะสมกว่าที่ไหน
Matt Evans

คำตอบ:


631

ไม่ Redis เป็นมากกว่าแคช

เช่นเดียวกับแคช Redis เก็บคู่ key = value แต่ต่างจากแคช Redis ให้คุณทำงานกับค่าต่างๆ มี 5 ชนิดข้อมูลใน Redis - Strings, Set, Hash, รายการและชุด Sorted ประเภทข้อมูลแต่ละประเภทมีการทำงานที่หลากหลาย

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

ช่วยบอกว่าเราต้องการสร้าง StackOverflow.com เพื่อให้ง่ายเราต้องมีคำถามคำตอบแท็กและผู้ใช้

แบบจำลองคำถามผู้ใช้และคำตอบ

แต่ละวัตถุสามารถสร้างแบบจำลองเป็นแผนที่ ตัวอย่างเช่นคำถามคือแผนที่ที่มีฟิลด์ {id, ชื่อ, date_asked, คะแนนเสียง, Ask_by, สถานะ} ในทำนองเดียวกันคำตอบคือแผนที่ที่มีฟิลด์ {id, question_id, answer_text, answer_by, โหวต, สถานะ} ในทำนองเดียวกันเราสามารถสร้างแบบจำลองวัตถุผู้ใช้

แต่ละวัตถุเหล่านี้สามารถจัดเก็บโดยตรงใน Redis เป็น Hash ในการสร้างรหัสเฉพาะคุณสามารถใช้คำสั่ง atomic increment บางสิ่งเช่นนี้ -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

การจัดการโหวต

ตอนนี้ทุกครั้งที่มีคนโหวตคำถามหรือคำตอบคุณแค่ต้องทำสิ่งนี้

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

รายการคำถามสำหรับโฮมเพจ

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

ทุกครั้งที่มีคนถามคำถามเราจะเพิ่มรหัสลงในรายการ

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

ตอนนี้เมื่อคุณต้องการแสดงหน้าแรกของคุณคุณถาม Redis สำหรับคำถาม 25 ข้อล่าสุด

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

เมื่อคุณมีรหัสแล้วให้ดึงรายการจาก Redis โดยใช้ pipelining และแสดงให้ผู้ใช้เห็น

คำถามตามแท็ก, เรียงลำดับตามโหวต

ต่อไปเราต้องการดึงคำถามสำหรับแต่ละแท็ก แต่ SO ช่วยให้คุณเห็นคำถามที่มีคะแนนสูงสุดคำถามใหม่หรือคำถามที่ยังไม่ได้ตอบภายใต้แต่ละแท็ก

ในการสร้างแบบจำลองนี้เราใช้คุณลักษณะการเรียงชุด Redis ชุดการเรียงลำดับช่วยให้คุณสามารถเชื่อมโยงคะแนนกับแต่ละองค์ประกอบ จากนั้นคุณสามารถดึงองค์ประกอบตามคะแนนของพวกเขา

ให้ไปข้างหน้าและทำสิ่งนี้กับแท็ก Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

เราทำอะไรที่นี่ เราได้เพิ่มคำถามในชุดเรียงลำดับและเชื่อมโยงคะแนน (จำนวนโหวต) กับแต่ละคำถาม ทุกครั้งที่มีการตอบคำถามเราจะเพิ่มคะแนนของคำถาม และเมื่อผู้ใช้คลิก "คำถามที่ติดแท็ก Redis เรียงตามคะแนน" เราจะทำzrevrangeและกลับไปที่คำถามยอดนิยม

คำถามเรียลไทม์โดยไม่ต้องรีเฟรชหน้า

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

Redis มีรูปแบบ pub-sub คุณสามารถสร้างช่องได้เช่น "channel_questions_tagged_redis" จากนั้นคุณsubscribeผู้ใช้ไปยังช่องทางเฉพาะ เมื่อมีการเพิ่มคำถามใหม่คุณจะpublishส่งข้อความไปที่ช่อง ผู้ใช้ทั้งหมดจะได้รับข้อความ คุณจะต้องใช้เทคโนโลยีเว็บเช่นซ็อกเก็ตเว็บหรือดาวหางเพื่อส่งข้อความไปยังเบราว์เซอร์ แต่ Redis ช่วยให้คุณใช้งานระบบประปาทั้งหมดที่ฝั่งเซิร์ฟเวอร์

ความคงทนความน่าเชื่อถือเป็นต้น

Redis จะเก็บข้อมูลไว้ในฮาร์ดดิสก์ซึ่งแตกต่างจาก Cache คุณสามารถตั้งค่า master-slave เพื่อให้ความน่าเชื่อถือที่ดีขึ้น หากต้องการเรียนรู้เพิ่มเติมไปที่หัวข้อการคงอยู่และการจำลองแบบที่นี่ - http://redis.io/documentation


15
นอกจากนี้ยังเป็นบัสบริการที่ง่ายมากโดยใช้คำสั่งที่เกี่ยวข้องกับ PUB / SUB
Jim Dennis

3
ฉันจะดึงคำถามจากผู้ใช้ได้อย่างไร? ฉันควรสร้างรายการสำหรับผู้ใช้แต่ละคนด้วยคำถามของคุณเช่นคำถาม: ผู้ใช้: 1 หรือฉันควรใช้แท็ก?
Diogo Alves

2
คำอธิบายที่มีประโยชน์และมีรายละเอียดมากที่ฉันเห็นใน SO
Trong Vu

5

ไม่ใช่แค่แคช

  • ในการจัดเก็บคีย์ - ค่าหน่วยความจำ
  • รองรับหลายประเภทข้อมูล (สตริง, แฮช, รายการ, ชุด, ชุดที่เรียง, บิตแมปและไฮเปอร์บล็อก)
  • มันมีความสามารถในการจัดเก็บข้อมูลแคชลงในที่จัดเก็บข้อมูลจริง (ถ้าจำเป็น)
  • รองรับรุ่น pub-sub
  • แคช Redis ให้การจำลองแบบสำหรับความพร้อมใช้งานสูง (master / slave)

4

Redis มีความสามารถพิเศษเช่นสคริปต์ lua รวดเร็ว เวลาดำเนินการเท่ากับเวลาดำเนินการคำสั่ง C สิ่งนี้ยังนำมาซึ่งอะตอมมิกสำหรับการจัดการข้อมูล Redis ที่ซับซ้อนซึ่งจำเป็นสำหรับการทำงานวัตถุขั้นสูงมากมายเช่นล็อคและเซมาฟอเรส

มี Redis อยู่ในตารางข้อมูลหน่วยความจำที่เรียกว่าRedissonซึ่งจะช่วยให้สามารถสร้างแอปพลิเคกระจายใน Java ขอขอบคุณที่กระจายLock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapวัตถุและอื่น ๆ อีกมากมาย

ที่ดีที่สุดที่ทำงานในระบบคลาวด์และสนับสนุนAWS ElastiCache , AWS ElastiCache คลัสเตอร์และAzure Redis แคชสนับสนุน


1

ที่จริงแล้วไม่มีการพึ่งพาระหว่างการแสดงข้อมูลแบบสัมพัทธ์ (หรือการแสดงข้อมูลชนิดใด ๆ ) และบทบาทของฐานข้อมูล (แคชการคงอยู่ถาวรเป็นต้น)

Redis นั้นดีสำหรับแคช แต่จริง ๆ แล้วมันก็มากเกินกว่าจะเป็นเพียงแคช มันเป็นฐานข้อมูลในหน่วยความจำความเร็วสูงอย่างเต็มที่ มันคงอยู่ข้อมูลบนดิสก์ มันไม่ได้เป็นเชิงสัมพันธ์เป็นแหล่งเก็บข้อมูลคีย์ - ค่า

เราใช้มันในการผลิต Redis ช่วยให้เราสร้างซอฟต์แวร์ที่จัดการคำขอนับพันต่อวินาทีและเก็บข้อมูลธุรกิจของลูกค้าตลอดวงจรชีวิตตามธรรมชาติ


0

Redis เป็นแคชที่เหมาะที่สุดสำหรับสภาพแวดล้อมแบบกระจาย / สถาปัตยกรรม Microservice

มันรวดเร็วเชื่อถือได้ให้อะตอมมิกและความสอดคล้องและมีช่วงของประเภทข้อมูลเช่นชุดแฮชรายการ ฯลฯ

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


0

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

ในทางกลับกันเซิร์ฟเวอร์โครงสร้างข้อมูลไม่จำเป็นต้องอยู่ในรูปแบบของแคช มีโครงการที่เข้ากันได้กับ Redis แต่มีเอ็นจินการเก็บข้อมูลถาวร


0

Redis รองรับโครงสร้างข้อมูลเช่นสตริง, แฮช, รายการ, ชุด, ชุดที่เรียงลำดับด้วยการสืบค้นแบบช่วง, บิตแมป, ไฮเปอร์บล็อกล็อก, ดัชนีเชิงพื้นที่ด้วยแบบสอบถามรัศมีและลำธาร Redis มีการจำลองแบบในตัว, การเขียนสคริปต์ Lua, การขับไล่ LRU, การทำธุรกรรมและการคงอยู่บนดิสก์ในระดับต่างๆและให้ความพร้อมใช้งานสูงผ่าน Redis Sentinel และการแบ่งพาร์ติชันอัตโนมัติด้วย Redis Cluster

implementaion ด้วย python

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.