I am using redis as an in-memory database backend for django cache.
In particular, I use django-redis configured as follows:
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', }, }, }
My django cache seem to work correctly.
The weird thing is that I cannot see django cache keys using the redis-cli
command line.
[edit] Please notice in the following that I tried both with
$ redis-cli
and
$ redis-cli -s /tmp/redis_6379.sock
[endedit]
with no difference.
In particular, using the KEYS *
command:
$ redis-cli redis 127.0.0.1:6379> keys * (empty list or set)
but
redis 127.0.0.1:6379> set stefano test OK redis 127.0.0.1:6379> keys * 1) "stefano"
while from django shell:
In [1]: from django.core.cache import cache In [2]: cache.keys('*') Out[2]: [u'django.contrib.sessions.cachebblhwb3chd6ev2bd85bawuz7g6pgaij8', u'django.contrib.sessions.cachewpxiheosc8qv5w4v6k3ml8cslcahiwna']
If I'm using MONITOR
on the cli:
redis 127.0.0.1:6379> monitor OK 1373372711.017761 [1 unix:/tmp/redis_6379.sock] "KEYS" "project_prefix:1:*"
I can see a request, using the django cache prefix; which should prove the redis-cli is connected to the same service. But even searching for that prefix in the redis-cli
returns an (empty list or set)
Why is that?
What is the mechanisms that compartmentalize the different caches on the same redis instance?
The first command you can use to get the total number of keys in a Redis database is the DBSIZE command. This simple command should return the total number of keys in a selected database as an integer value. The above example command shows that there are 203 keys in the database at index 10.
By clicking on a Redis key name, all its contents will open in a new editor tab. With a collection type Redis key, clicking on it will reveal the individual elements under the key name. Clicking the individual element will display its contents in a new editor tab.
A Redis server has 16 databases by default. You can check the actual number by running redis-cli config get databases. In interactive mode, the database number is displayed in the prompt within square braces. For example, 127.0. 0.1:6379[13] shows that the 13th database is in use.
The Redis KEYS command returns all the keys in the database that match a pattern (or all the keys in the key space). Similar commands for fetching all the fields stored in a hash is HGETALL and for all fetching the members of a SMEMBERS. The keys in Redis themselves are stored in a dictionary (aka a hash table).
I would say there are two possibilities:
1/ The django app may not connect to the Redis instance you think it is connected to, or the redis-cli client you launch does not connect to the same Redis instance.
Please note you do not use the same exact connection mechanism in both cases. Django uses a Unix Domain Socket, while redis-cli uses TCP loopback (by default). You may want to launch redis-cli using the same socket path, to be sure:
$ redis-cli -s /tmp/redis_6379.sock
Now since you have verified with a MONITOR command that you see the commands sent by Django, we can assume you are connected to the right instance.
2/ There is a database concept in Redis. By default, you have 16 distinct databases, and the current default database is 0. The SELECT command can be used to switch a session to another database. There is one keyspace per database.
The INFO KEYSPACE command can be used to check whether some keys are defined in several databases.
redis 127.0.0.1:6379[1]> info keyspace # Keyspace db0:keys=1,expires=0 db1:keys=1,expires=0
Here I have two databases, let's check the keys defined in the db0 database:
redis 127.0.0.1:6379> keys * 1) "foo"
and now in the db1 database:
redis 127.0.0.1:6379> select 1 OK redis 127.0.0.1:6379[1]> keys * 1) "bar"
My suggestion would be also to check whether the Django application sends any SELECT command at connection time to the Redis instance (with MONITOR).
I'm not familiar with Django, but the way you have defined the LOCATION parameter makes me think your data could be in database 1 (due to the suffix).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With