| 993 | |
| 994 | |
| 995 | class RedisListStorage(OrderedStorage, RedisStorage): |
| 996 | def __init__(self, config, name=None): |
| 997 | RedisStorage.__init__(self, config, name=name) |
| 998 | |
| 999 | def keys(self): |
| 1000 | return self._redis.hkeys(self._name) |
| 1001 | |
| 1002 | def redis_keys(self): |
| 1003 | return self._redis.hvals(self._name) |
| 1004 | |
| 1005 | def status(self): |
| 1006 | status = self._parse_config(self.config['redis']) |
| 1007 | status.update(Storage.status(self)) |
| 1008 | return status |
| 1009 | |
| 1010 | def get(self, key): |
| 1011 | return self._get_items(self._redis, self.redis_key(key)) |
| 1012 | |
| 1013 | def getmany(self, *keys): |
| 1014 | pipe = self._redis.pipeline() |
| 1015 | pipe.multi() |
| 1016 | for key in keys: |
| 1017 | self._get_items(pipe, self.redis_key(key)) |
| 1018 | return pipe.execute() |
| 1019 | |
| 1020 | @staticmethod |
| 1021 | def _get_items(r, k): |
| 1022 | return r.lrange(k, 0, -1) |
| 1023 | |
| 1024 | def remove(self, *keys): |
| 1025 | self._redis.hdel(self._name, *keys) |
| 1026 | self._redis.delete(*[self.redis_key(key) for key in keys]) |
| 1027 | |
| 1028 | def remove_val(self, key, val): |
| 1029 | redis_key = self.redis_key(key) |
| 1030 | self._redis.lrem(redis_key, val) |
| 1031 | if not self._redis.exists(redis_key): |
| 1032 | self._redis.hdel(self._name, redis_key) |
| 1033 | |
| 1034 | def insert(self, key, *vals, **kwargs): |
| 1035 | # Using buffer=True outside of an `insertion_session` |
| 1036 | # could lead to inconsistencies, because those |
| 1037 | # insertion will not be processed until the |
| 1038 | # buffer is cleared |
| 1039 | buffer = kwargs.pop('buffer', False) |
| 1040 | if buffer: |
| 1041 | self._insert(self._buffer, key, *vals) |
| 1042 | else: |
| 1043 | self._insert(self._redis, key, *vals) |
| 1044 | |
| 1045 | def _insert(self, r, key, *values): |
| 1046 | redis_key = self.redis_key(key) |
| 1047 | r.hset(self._name, key, redis_key) |
| 1048 | r.rpush(redis_key, *values) |
| 1049 | |
| 1050 | def size(self): |
| 1051 | return self._redis.hlen(self._name) |
| 1052 | |