utils.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import json
  2. import redis
  3. class RedisDict:
  4. def __init__(self, name, redis_url):
  5. self.name = name
  6. self.redis = redis.Redis.from_url(redis_url, decode_responses=True)
  7. def __setitem__(self, key, value):
  8. serialized_value = json.dumps(value)
  9. self.redis.hset(self.name, key, serialized_value)
  10. def __getitem__(self, key):
  11. value = self.redis.hget(self.name, key)
  12. if value is None:
  13. raise KeyError(key)
  14. return json.loads(value)
  15. def __delitem__(self, key):
  16. result = self.redis.hdel(self.name, key)
  17. if result == 0:
  18. raise KeyError(key)
  19. def __contains__(self, key):
  20. return self.redis.hexists(self.name, key)
  21. def __len__(self):
  22. return self.redis.hlen(self.name)
  23. def keys(self):
  24. return self.redis.hkeys(self.name)
  25. def values(self):
  26. return [json.loads(v) for v in self.redis.hvals(self.name)]
  27. def items(self):
  28. return [(k, json.loads(v)) for k, v in self.redis.hgetall(self.name).items()]
  29. def get(self, key, default=None):
  30. try:
  31. return self[key]
  32. except KeyError:
  33. return default
  34. def clear(self):
  35. self.redis.delete(self.name)
  36. def update(self, other=None, **kwargs):
  37. if other is not None:
  38. for k, v in other.items() if hasattr(other, "items") else other:
  39. self[k] = v
  40. for k, v in kwargs.items():
  41. self[k] = v
  42. def setdefault(self, key, default=None):
  43. if key not in self:
  44. self[key] = default
  45. return self[key]