Open
Description
Problem Statement
Use django-redis
with redis clustering.
An error occurs when interacting with the cache.
The error points to a pickle operation on an instance of the ConnectionPool
class where one of it's attributes, a thread lock, cannot be serialized and results in the following error:
TypeError: cannot pickle '_thread.lock' object
To Reproduce
Steps to reproduce the behavior:
- Run a redis cluster that
REDIS_URL
points to. - Setup
CACHES
in Django settings file.CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": REDIS_URL, "OPTIONS": { "REDIS_CLIENT_CLASS": "redis.cluster.RedisCluster", "REDIS_CLIENT_KWARGS": { "url": REDIS_URL, }, } } }
- Run the Django console and try to interact with the cache e.g.
cache.get("somekey")
Expected behavior
The value of the key from the Redis cluster.
Stack trace
Traceback (most recent call last):
File "python3.9/site-packages/redis/cluster.py", line 1454, in initialize
copy_kwargs = copy.deepcopy(kwargs)
File "python3.9/copy.py", line 146, in deepcopy
y = copier(x, memo)
File "python3.9/copy.py", line 230, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "python3.9/copy.py", line 172, in deepcopy
y = _reconstruct(x, memo, *rv)
File "python3.9/copy.py", line 270, in _reconstruct
state = deepcopy(state, memo)
File "python3.9/copy.py", line 146, in deepcopy
y = copier(x, memo)
File "python3.9/copy.py", line 230, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "python3.9/copy.py", line 161, in deepcopy
rv = reductor(4)
TypeError: cannot pickle '_thread.lock' object
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "python3.9/site-packages/IPython/core/interactiveshell.py", line 3552, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-6-48456cec0da8>", line 1, in <cell line: 1>
from django.core.cache import cache; cache.get("bingo")
File "python3.9/site-packages/django_redis/cache.py", line 91, in get
value = self._get(key, default, version, client)
File "python3.9/site-packages/django_redis/cache.py", line 31, in _decorator
return method(self, *args, **kwargs)
File "python3.9/site-packages/django_redis/cache.py", line 98, in _get
return self.client.get(key, default=default, version=version, client=client)
File "python3.9/site-packages/django_redis/client/default.py", line 253, in get
client = self.get_client(write=False)
File "python3.9/site-packages/django_redis/client/default.py", line 105, in get_client
self._clients[index] = self.connect(index)
File "python3.9/site-packages/django_redis/client/default.py", line 118, in connect
return self.connection_factory.connect(self._server[index])
File "python3.9/site-packages/django_redis/pool.py", line 72, in connect
connection = self.get_connection(params)
File "python3.9/site-packages/django_redis/pool.py", line 92, in get_connection
return self.redis_client_cls(
File "python3.9/site-packages/redis/cluster.py", line 592, in __init__
self.nodes_manager = NodesManager(
File "python3.9/site-packages/redis/cluster.py", line 1286, in __init__
self.initialize()
File "python3.9/site-packages/redis/cluster.py", line 1490, in initialize
raise RedisClusterException(
redis.exceptions.RedisClusterException: ERROR sending "cluster slots" command to redis server 127.0.0.1:7000. error: cannot pickle '_thread.lock' object
Environment:
- Python version: 3.9
- Django Redis Version: 5.2.0
- Django Version: 3.2.13
- Redis Version: 7.0.0
- redis-py Version: 4.3.1
Additional Context 🚨
This is my first time using this library and therefore not unlikely that my configurations are wrong.