refac
This commit is contained in:
@@ -82,13 +82,22 @@ class RedisDict:
|
|||||||
return [(k, json.loads(v)) for k, v in self.redis.hgetall(self.name).items()]
|
return [(k, json.loads(v)) for k, v in self.redis.hgetall(self.name).items()]
|
||||||
|
|
||||||
def set(self, mapping: dict):
|
def set(self, mapping: dict):
|
||||||
pipe = self.redis.pipeline()
|
if not mapping:
|
||||||
|
self.redis.delete(self.name)
|
||||||
|
return
|
||||||
|
|
||||||
pipe.delete(self.name)
|
# Fetch existing keys before writing so we know which ones to remove.
|
||||||
if mapping:
|
# HKEYS is cheap — it transfers only short key strings, not large JSON values.
|
||||||
pipe.hset(self.name, mapping={k: json.dumps(v) for k, v in mapping.items()})
|
existing_keys = set(self.redis.hkeys(self.name))
|
||||||
|
new_keys = set(mapping.keys())
|
||||||
|
keys_to_remove = existing_keys - new_keys
|
||||||
|
|
||||||
pipe.execute()
|
# HSET first (add/update all new values), then HDEL (remove stale keys).
|
||||||
|
# We never DELETE the whole hash — this eliminates the race window
|
||||||
|
# where concurrent readers would see an empty models dict.
|
||||||
|
self.redis.hset(self.name, mapping={k: json.dumps(v) for k, v in mapping.items()})
|
||||||
|
if keys_to_remove:
|
||||||
|
self.redis.hdel(self.name, *keys_to_remove)
|
||||||
|
|
||||||
def get(self, key, default=None):
|
def get(self, key, default=None):
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user