【问题标题】:Django cache causes duplicate key error in database? [duplicate]Django缓存导致数据库中的重复键错误? [复制]
【发布时间】:2011-10-03 17:58:41
【问题描述】:

可能重复:
Django cache.set() causing duplicate key error

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

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。感谢激光科学。

edit @ Jack M:我无法复制此错误,但相信代码在 django.core.cache.backends.db.DatabaseCache 中的一个名为 set() 的方法中致电_base_set()

【问题讨论】:

  • 你用什么数据库后端试过?也可以和其他人一起尝试...
  • 将此条目添加到缓存中的代码是什么?

标签: python database django postgresql caching


【解决方案1】:

听起来像是 django 核心中的一个错误,因为如果存在密钥,它应该更新记录。

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

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

【讨论】:

  • 我的问题是我的内存受限,所以添加 memcache 不是一个选项。该网页进行了大量的 sql 调用,因此不是在代码中进行优化,而是单个数据库调用显着加快了速度。这是假设缓存有效....
猜你喜欢
  • 2010-11-14
  • 2016-04-08
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2011-08-17
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多