سؤال

في الآونة الأخيرة ، أتعلم redis وبصراحة معجبة للغاية وأموت لاستخدامها. أحد الأشياء التي تستمر في إزعاجي هي "كيف يمكنني الاستعلام عن redis". لكي أكون محددًا أحاول حل المتابعة

قل أن لدي ملايين من التجزئة المخزنة على النحو التالي

usage:1 = {created: 20100521, quantity:9, resource:1033, user:1842, ...}
usage:2 = {created: 20100812, quantity:3, resource:7233, user:1842, ...}
usage:3 = {created: 20100927, quantity:4, resource:1031, user:76, ...}

يرجى ملاحظة أن هناك العديد من المفاتيح في التجزئة التي أظهرتها فقط 4. الآن بعد أن أرغب في العثور على سجلات في نطاق تاريخ محدد ، حسب المستخدم ، حسب المورد أو للمستخدم في فترة معينة.

أظن أن هناك أنماط محددة Redis لاسترداد هذه البيانات. أنا مبرمج بيثون. لقد نظرت إلى Redisco (منفذ OHM) الذي يدعم بعض الإمساك ، لكنني لست متأكدًا مما إذا كان يحصل على جميع البيانات ثم المرشحات في Python.

هل كانت مفيدة؟

المحلول

بالنسبة إلى Redis ، من الأفضل أن تفهم نوعًا من أنماط الاستعلام التي تريدها على بياناتك قبل أن تقرر كيفية تخزينها.

على سبيل المثال ، إذا كنت ترغب في إجراء استعلام عن نطاق تاريخ عبر مجموعة من البيانات ، فيمكنك تخزين هذه البيانات كمجموعة مصنفة حيث تكون المفاتيح هي عناصر البيانات التي تريد الاستعلام عنها ، والنتيجة هي طابع زمني UNIX.

في مثالك أعلاه ، قد أقوم بتخزين مثالك على أنه:

 user_to_resource:i = user:j                   # key -> value forward map
 resources => (resource:i, created_timestamp)  # sorted set
 count_resource:i = quantity                   # key -> value quantity map

أي أن لدي العديد من الخرائط إلى الأمام والعكس اعتمادًا على أنماط الاستعلام التي أرغب في دعمها.

نصائح أخرى

الاستعلامات التي ذكرتها تعتمد بشكل كبير على الوقت. في هذه الحالة ، سيكون من الحكمة استخدام مجموعة مرتبة. يمكنك استخدام ختم DateTime كنتيجة لكل إدخال.

على سبيل المثال ، يمكنك القيام بما يلي:

hmset usage:1 created 20100521 quantity 9 resource 1033 user 1842
hmset usage:2 created 20100812 quantity 3 resource 7233 user 1842
hmset usage:3 created 20100927 quantity 4 resource 1031 user 76

zadd usage 20200521 1
zadd usage 20100812 2
zadd usage 20100927 3

لاسترداد كل شيء:

sort usage get 
# get usage:*->created get usage:*->quantity get usage:*->resource get usage:*->user

أو

lrange usage 0 -1

للحصول على فهارس النطاق:

zrangebyscore usage 20100800 20100900

بالنسبة للاستعلامات بناءً على قيمة مفتاح التجزئة ، هناك إضافة مفيدة لـ Redis والتي تسمح باستخدام البرامج النصية المكتوبة في LUA. يمكنك بسهولة كتابة نص LUA بسيط داخل python heredoc واستخدام طريقة redis.eval لتمرير البرنامج النصي إلى redis. يمكن أن يكون البرنامج النصي حلقة تصفية بناءً على القيمة التي تبحث عنها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top