用 Redis 存储 ID 连续的数据
Jun 07, 2016 pm 04:38 PM之前在设计「Doodle 2」和开发「知乎日报」时,我面对最多的数据类型就是带 ID 的数据了。 在使用关系型数据库时,自增的主键可以满足这个需求,而在 Redis 中就稍微麻烦些了。 一直以来我都额外使用了一个计数器来存储 ID,例如(省略了很多代码,不影响阅
之前在设计「Doodle 2」和开发「知乎日报」时,我面对最多的数据类型就是带 ID 的数据了。在使用关系型数据库时,自增的主键可以满足这个需求,而在 Redis 中就稍微麻烦些了。
一直以来我都额外使用了一个计数器来存储 ID,例如(省略了很多代码,不影响阅读):
class IDModel(JSONModel): id = IntegerProperty() @classmethod def get_by_id(cls, entity_id): json_content = cls.redis_client.hget(cls._KEY, entity_id) if json_content: return cls.from_json(json_content) @classmethod def get_by_ids(cls, ids): if not ids: return [] results = cls.redis_client.hmget(cls._KEY, ids) return [cls.from_json(json_content) for json_content in results] @classmethod def get_next_id(cls): return MAX_ID.get_next_id(cls._KEY) def save(self): self._populate_default_attributes() self._save_self() def _populate_default_attributes(self): if self.id is None: self.id = self.get_next_id() def _save_self(self): self.redis_client.hset(self._KEY, self.id, self.to_json()) class MAX_ID(SimpleModel): @classmethod def get_next_id(cls, for_type, increment=1): return cls.redis_client.hincrby(cls._KEY, for_type, increment) @classmethod def get_max_id(cls, for_type): return int(cls.redis_client.hget(cls._KEY, for_type) or 0)
刚才又想到一种方法,直接把数据存到 list 里,然后依靠其长度来定 ID,例如:
class IDModel(JSONModel): id = IntegerProperty() @classmethod def get_by_id(cls, entity_id): json_content = cls.redis_client.lindex(cls._KEY, entity_id) if json_content: return cls.from_json(json_content) @classmethod def get_by_ids(cls, ids): if not ids: return [] key = cls._KEY pipe = cls.redis_client.pipeline(transaction=False) for entity_id in ids: pipe.lindex(key, entity_id) results = pipe.execute() return [cls.from_json(json_content) for json_content in results] def save(self): key = self._KEY if self.id is None: with self.redis_client.pipeline() as pipe: try: pipe.watch(key) self.id = pipe.llen(key) + 1 pipe.multi() pipe.rpush(key, self.to_json()) pipe.execute() except Exception: self.id = None raise else: self.redis_client.lset(key, self.id, self.to_json())
- ID 必须连续
- 依赖事务,导致 _populate_default_attributes() 的逻辑不好分离
- 获取多个 ID 对应的实体需要执行多条语句
原文地址:用 Redis 存储 ID 连续的数据, 感谢原作者分享。

Heißer Artikel

Hot-Tools-Tags

Heißer Artikel

Heiße Artikel -Tags

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Lösung für den Fehler 0x80242008 bei der Installation von Windows 11 10.0.22000.100

Langsame Internetgeschwindigkeiten für Mobilfunkdaten auf dem iPhone: Korrekturen

Die U.S. Air Force präsentiert ihren ersten KI-Kampfjet mit großem Aufsehen! Der Minister führte die Testfahrt persönlich durch, ohne in den gesamten Prozess einzugreifen, und 100.000 Codezeilen wurden 21 Mal getestet.

Honor Magic V3 stellt erstmals die KI-Defokussierungs-Augenschutztechnologie vor: Lindert effektiv die Entwicklung von Kurzsichtigkeit

Tesla-Roboter arbeiten in Fabriken, Musk: Der Freiheitsgrad der Hände wird dieses Jahr 22 erreichen!

Golang API-Caching-Strategie und -Optimierung

Das 70B-Modell generiert 1.000 Token in Sekunden, das Umschreiben des Codes übertrifft GPT-4o, vom Cursor-Team, einem von OpenAI investierten Code-Artefakt

KI-Startups wechselten gemeinsam ihre Jobs zu OpenAI, und das Sicherheitsteam formierte sich neu, nachdem Ilya gegangen war!
