django memcache 缓存总是未命中
django memcache cache miss always
我 运行 在我的 windows 系统上使用 memcached 服务,并且我已经将我的开发设置配置为具有以下缓存设置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'TIMEOUT': 3600,
'OPTIONS': {
'MAX_ENTRIES': 100
}
}
}
我正在使用以下代码设置和获取内容 in/from 缓存:
from django.core.cache import cache
def get_element(fsid):
element = cache.get(str(fsid)) # get element from memcache if present
if element is None:
info("cache miss for fsid-"+str(fsid))
fs = FlowStatusModel.objects.get(pk=fsid)
pickle_path = fs.pickle
gcs_pickle_path = fs.gcs_pickle
try:
info("reading from local disk")
with open(pickle_path, 'rb') as handle:
element = pickle.load(handle)
except:
info("local disk failed. copying file from cloud storage bucket to local disk")
create_and_copy(gcs_pickle_path, pickle_path)
with open(gcs_pickle_path, 'rb') as handle:
element = pickle.load(handle)
info("adding fsid-"+str(fsid) + " to cache with 1hour timeout")
cache.set(str(fsid), element, 3600)
return element
我在日志中看到总是存在缓存未命中。我不知道 django 是否能够在缓存中设置元素。如果我尝试从 python manage.py shell
开始使用简单的 set
和 get
,我就能取回数据。我尝试从命令提示符 运行 命令 memcached.exe -vv
来查看它是否收到请求,但在这两种情况下(来自 dev server/manage.py shell)我都看到任何集合或获取打印在控制台上的信息。感谢您帮助解决问题。
可能是因为这个:
'OPTIONS': {
'MAX_ENTRIES': 100
}
这是一个非常小的数字。您可能正在经历大量的颠簸。每次向缓存中添加内容时,很可能会替换其他内容。这可能就是您的 fsid
密钥发生的情况。
也有可能您 运行 违反了 memcached 的最大项目大小。通过更改 memcached 配置文件 (memcached.conf) 并添加以下内容来修复此问题
MAXITEMSIZE=12m
不过需要注意的是,如果您要存储如此大的对象,memcached 可能不适合您。
我 运行 在我的 windows 系统上使用 memcached 服务,并且我已经将我的开发设置配置为具有以下缓存设置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'TIMEOUT': 3600,
'OPTIONS': {
'MAX_ENTRIES': 100
}
}
}
我正在使用以下代码设置和获取内容 in/from 缓存:
from django.core.cache import cache
def get_element(fsid):
element = cache.get(str(fsid)) # get element from memcache if present
if element is None:
info("cache miss for fsid-"+str(fsid))
fs = FlowStatusModel.objects.get(pk=fsid)
pickle_path = fs.pickle
gcs_pickle_path = fs.gcs_pickle
try:
info("reading from local disk")
with open(pickle_path, 'rb') as handle:
element = pickle.load(handle)
except:
info("local disk failed. copying file from cloud storage bucket to local disk")
create_and_copy(gcs_pickle_path, pickle_path)
with open(gcs_pickle_path, 'rb') as handle:
element = pickle.load(handle)
info("adding fsid-"+str(fsid) + " to cache with 1hour timeout")
cache.set(str(fsid), element, 3600)
return element
我在日志中看到总是存在缓存未命中。我不知道 django 是否能够在缓存中设置元素。如果我尝试从 python manage.py shell
开始使用简单的 set
和 get
,我就能取回数据。我尝试从命令提示符 运行 命令 memcached.exe -vv
来查看它是否收到请求,但在这两种情况下(来自 dev server/manage.py shell)我都看到任何集合或获取打印在控制台上的信息。感谢您帮助解决问题。
可能是因为这个:
'OPTIONS': {
'MAX_ENTRIES': 100
}
这是一个非常小的数字。您可能正在经历大量的颠簸。每次向缓存中添加内容时,很可能会替换其他内容。这可能就是您的 fsid
密钥发生的情况。
也有可能您 运行 违反了 memcached 的最大项目大小。通过更改 memcached 配置文件 (memcached.conf) 并添加以下内容来修复此问题
MAXITEMSIZE=12m
不过需要注意的是,如果您要存储如此大的对象,memcached 可能不适合您。