Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。Django提供了对Memcached的内置支持,可以轻松地将其集成到项目中。
首先需要安装Python的Memcached客户端和Django的缓存后端:
pip install python-memcached
# 或者使用更现代的客户端
pip install pylibmc
在Django的settings.py文件中配置缓存后端:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211', # Memcached服务器地址和端口
'OPTIONS': {
'server_max_value_length': 1024 * 1024 * 2, # 支持更大的值(2MB)
}
}
}
对于多台Memcached服务器:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11211',
],
'OPTIONS': {
'server_max_value_length': 1024 * 1024 * 2,
}
}
}
Django提供了几种级别的缓存方式:
from django.core.cache import cache
# 设置缓存
cache.set('my_key', 'hello, world!', 30) # 30秒后过期
# 获取缓存
value = cache.get('my_key')
# 如果键不存在,则设置默认值
value = cache.get('my_key', 'default_value')
# 添加缓存(仅当键不存在时)
cache.add('add_key', 'new value')
# 获取或设置
value = cache.get_or_set('my_key', 'default_value', 30)
# 批量操作
cache.set_many({'a': 1, 'b': 2, 'c': 3})
values = cache.get_many(['a', 'b', 'c'])
# 删除缓存
cache.delete('my_key')
cache.delete_many(['a', 'b', 'c'])
# 清空所有缓存
cache.clear()
# 自增/自减
cache.set('num', 1)
cache.incr('num') # 2
cache.decr('num') # 1
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 缓存15分钟
def my_view(request):
# 视图逻辑
pass
或者在urls.py中:
from django.views.decorators.cache import cache_page
urlpatterns = [
path('foo/<int:code>/', cache_page(60 * 15)(my_view)),
]
在模板中使用:
{% load cache %}
{% cache 500 sidebar %}
.. sidebar ..
{% endcache %}
带变量的缓存:
{% cache 500 sidebar request.user.username %}
.. sidebar for user ..
{% endcache %}
在settings.py中添加中间件:
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware',
]
# 缓存超时时间(秒)
CACHE_MIDDLEWARE_SECONDS = 60 * 15 # 15分钟
# 缓存键前缀
CACHE_MIDDLEWARE_ALIAS = 'default'
# 缓存键额外参数
CACHE_MIDDLEWARE_KEY_PREFIX = ''
原因:
解决方案:
systemctl status memcached
原因:
解决方案:
原因:
解决方案:
通过合理使用Django的Memcached缓存API,可以显著提高Web应用的性能和可扩展性。
没有搜到相关的文章