Django缓存导致数据库中的重复键错误?

时间:2011-07-12 15:25:49

标签: python database django postgresql caching

  

可能重复:
  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。谢谢lazerscience。

编辑@ Jack M :我无法复制此错误,但相信代码位于django.core.cache.backends.db.DatabaseCache的{​​{1}}方法中1}}调用set()

1 个答案:

答案 0 :(得分:1)

  

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

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

这也引出了一个问题:你确定首先应该在数据库中缓存吗?数据库通常是Web应用程序的瓶颈(特别是在使用ORM时),缓存的全部要点是避免这个瓶颈。你不应该使用memcache吗?