it-swarm.asia

كيفية إظهار جميع المفاتيح من خلال redis-cli؟

أنا أستخدم redis كخلفية قاعدة بيانات في الذاكرة لذاكرة التخزين المؤقت Django.

على وجه الخصوص ، أنا استخدم Django-redis تكوين على النحو التالي:

CACHES = {
    'default': {
        'BACKEND': 'redis_cache.cache.RedisCache',
        'KEY_PREFIX':   DOMAIN_NAME,
        'LOCATION': 'unix:/tmp/redis_6379.sock:1',
        'OPTIONS': {
            'PICKLE_VERSION': -1,   # default
            'PARSER_CLASS': 'redis.connection.HiredisParser',
            'CLIENT_CLASS': 'redis_cache.client.DefaultClient',
        },
    },
}

يبدو أن ذاكرة التخزين المؤقت Django تعمل بشكل صحيح.

الشيء الغريب هو أنني لا أستطيع رؤية مفاتيح ذاكرة التخزين المؤقت Django باستخدام سطر الأوامر redis-cli.

[عدل] يرجى ملاحظة في ما يلي أنني حاولت كليهما مع

$ redis-cli

و

$ redis-cli -s /tmp/redis_6379.sock

[النهاية]

مع عدم وجود فرق.

على وجه الخصوص ، باستخدام الأمر KEYS *:

$ redis-cli
redis 127.0.0.1:6379> keys *
(empty list or set)

لكن

redis 127.0.0.1:6379> set stefano test
OK
redis 127.0.0.1:6379> keys *
1) "stefano"

بينما من جانغو شل:

In [1]: from Django.core.cache import cache

In [2]: cache.keys('*')
Out[2]:
[u'Django.contrib.sessions.cachebblhwb3chd6ev2bd85bawuz7g6pgaij8',
 u'Django.contrib.sessions.cachewpxiheosc8qv5w4v6k3ml8cslcahiwna']

إذا كنت تستخدم MONITOR في CLI:

redis 127.0.0.1:6379> monitor
OK
1373372711.017761 [1 unix:/tmp/redis_6379.sock] "KEYS" "project_prefix:1:*"

أستطيع أن أرى طلبًا ، باستخدام بادئة ذاكرة التخزين المؤقت Django ؛ والتي يجب أن تثبت redis-cli متصل بنفس الخدمة. ولكن حتى البحث عن تلك البادئة في redis-cli يُرجع (empty list or set)

لماذا هذا؟

ما هي الآليات التي تقسم ذاكرة التخزين المؤقت المختلفة في نفس المثيل redis؟

51
Stefano

أود أن أقول أن هناك احتمالين:

1/قد لا يتصل تطبيق Django بمثيل Redis الذي تعتقد أنه متصل به ، أو أن عميل redis-cli الذي تقوم بتشغيله لا يتصل بنفس مثيل Redis.

يرجى ملاحظة أنك لا تستخدم نفس آلية الاتصال الدقيقة في كلتا الحالتين. يستخدم Django Unix Domain Socket ، بينما يستخدم redis-cli TCP استرجاع (افتراضيًا). قد ترغب في تشغيل redis-cli باستخدام نفس مسار المقبس ، للتأكد من:

$ redis-cli -s /tmp/redis_6379.sock

الآن بما أنك قد تحققت من خلال أمر MONITOR الذي ترى فيه الأوامر التي أرسلها Django ، فيمكننا افتراض أنك متصل بالمثيل الصحيح.

2/هناك مفهوم قاعدة البيانات في Redis. بشكل افتراضي ، لديك 16 قاعدة بيانات مميزة ، وقاعدة البيانات الافتراضية الحالية هي 0. يمكن استخدام الأمر SELECT لتبديل الجلسة إلى قاعدة بيانات أخرى. هناك keyspace واحد لكل قاعدة بيانات.

يمكن استخدام الأمر INFO KEYSPACE للتحقق مما إذا كانت بعض المفاتيح محددة في عدة قواعد بيانات.

redis 127.0.0.1:6379[1]> info keyspace
# Keyspace
db0:keys=1,expires=0
db1:keys=1,expires=0

لدي هنا قاعدتي بيانات ، دعنا نتحقق من المفاتيح المحددة في قاعدة بيانات db0:

redis 127.0.0.1:6379> keys *
1) "foo"

والآن في قاعدة بيانات db1:

redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> keys *
1) "bar"

سيكون اقتراحي أيضًا التحقق مما إذا كان تطبيق Django يرسل أي أمر SELECT في وقت الاتصال إلى المثيل Redis (مع MONITOR).

لست معتادًا على Django ، لكن الطريقة التي حددت بها المعلمة LOCATION تجعلني أعتقد أن بياناتك يمكن أن تكون في قاعدة البيانات 1 (بسبب اللاحقة).

69
Didier Spezia

redis-cli -h KEYS "trendingKey *"

الناتج 1) "trendingKey: 2: 1" 2) "trendingKey: trending102: 1" 3) "trendingKey: trending101: 1"

2
Victor