python - Django 缓存导致数据库中出现重复键错误?

标签 python database django postgresql caching

<分区>

Possible Duplicate:
Django cache.set() causing duplicate key error

我在使用 django 核心的数据库缓存时遇到了这个问题:

ERROR:  duplicate key value violates unique constraint "cache_pkey"
STATEMENT:  INSERT INTO "cache" (cache_key, value, expires) VALUES (E':1:cms-menu_nodes_en-us_1', E'gAJdcQEoY21lbnVzLmJhc2UKTmF2aW
LOG:  server process (PID 8453) was terminated by signal 9: Killed
LOG:  terminating any other active server processes
LOG:  all server processes terminated; reinitializing
FATAL:  could not create shared memory segment: Cannot allocate memory
DETAIL:  Failed system call was shmget(key=5432001, size=29278208, 03600).

我查看了表格,果然,有一个键 ':1:cms-menu_nodes_en-us_1' 的条目。我发现了一个类似的问题 here ,但无法准确理解问题所在。

有人有什么想法或建议吗?听起来像是 django 核心中的错误,因为如果存在键,它应该更新记录。

编辑:我应该澄清一下数据库是 PostgreSQL 8.4.7。感谢 lazerscience。

编辑@Jack M:我无法重现此错误,但相信代码在django.core.cache.backends 中。 db.DatabaseCache 在调用 _base_set() 的名为 set() 的方法中。

最佳答案

Sounds like a bug in django core, since if a key exist, it should update the record.

的确如此,但我建议该错误与并发问题有关,在这种情况下,它可以在应用程序级别修复。就像在对同一 Assets /页面/任何运行 exist() 语句的两个相邻调用中一样,没有找到任何行,并因此继续插入——没有发出任何类型的锁,也没有将事物包装在事务中丢弃有问题的调用并(因为它只是一个缓存)继续。

这也引出了一个问题:你确定你应该首先在你的数据库中缓存吗?数据库通常是 Web 应用程序中的瓶颈(尤其是在使用 ORM 时),而缓存的全部意义在于避免该瓶颈。您不应该改用内存缓存吗?

关于python - Django 缓存导致数据库中出现重复键错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6666728/

相关文章:

python - 用值填充张量中的特定索引

python - 设置 Python 的 collections.defaultdict 的默认字符串值

C# SQL查询异常

mysql - 我应该如何在 MySQL 中组织电影的歌曲下载链接?

python - Django Rest 框架业务逻辑

python - 使用nginx和gunicorn来服务django

python - 本地使用 dask : to Client() or not to Client()?

python - 将包含 bytearray 的字符串转换为 uint16

php - PDO rowCount() 支持的数据库

django - Django-Celery进度栏