在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
对于非经常更新的服务器数据,若每次都从硬盘读取一次,会浪费服务器资源、拖慢响应速度,而且数据更新频率较高,服务器负担比较大。若保存到数据库,还需要额外建立一张对应的表存储数据。一个更好的方法是在Django中使用Redis进行缓存,下面通过本文给大家介绍Django使用redis配置缓存的方法。 前言 动态网站的基本权衡是,它们是动态的。每次用户请求页面时,Web服务器都会进行各种计算 - 从数据库查询到模板呈现再到业务逻辑 - 以创建站点访问者看到的页面。从处理开销的角度来看,这比标准的文件读取文件系统服务器要耗时多了。对于大多数Web应用程序来说,这种开销并不是什么大问题。因为大多数Web应用程序只是 django应用redis缓存django中安装第三方库,使用如下命令 pip3 install django-redis 1.settings配置首先,我们在 CACHES = { # default 是缓存名,可以配置多个缓存 "default": { # 应用 django-redis 库的 RedisCache 缓存类 "BACKEND": "django_redis.cache.RedisCache", # 配置正确的 ip和port "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { # redis客户端类 "CLIENT_CLASS": "django_redis.client.DefaultClient", # redis连接池的关键字参数 "CONNECTION_POOL_KWARGS": { "max_connections": 100 } # 如果 redis 设置了密码,那么这里需要设置对应的密码,如果redis没有设置密码,那么这里也不设置 # "PASSWORD": "123456", } } } 2.全站缓存2.1 全站缓存的2个中间件
缓存状态为200的 对具有不同查询参数的相同 该中间件会使用与对应的
该中间件会自动在每个响应中设置几个 设置 设置响应的
在 MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 其他中间件... 'django.middleware.cache.FetchFromCacheMiddleware', ] 注意: 2.2 全站缓存的必填设置 将以下必须设置添加到 CACHE_MIDDLEWARE_ALIAS = 'default' CACHE_MIDDLEWARE_SECONDS = 60*60 CACHE_MIDDLEWARE_KEY_PREFIX = "cache_redis_demo_first" 配置解释如下:
2.3 全站缓存示例 接着我们在视图中写入如下函数: def index(request): # 通过设置时间戳,进行多次访问,可以看到时间戳的变化,就可以得知是否是缓存页面了 return HttpResponse('当前时间戳:' + str(time.time())) 我们打开浏览器访问 我们会发现响应头中已经有了缓存的时间,说明我们缓存配置成功了 3.视图函数缓存一般情况下,我们不会使用全局缓存,因为全局缓存,只要服务器返回状态码是200,他都会将其缓存下来,这样会影响性能,所以我们一般都会使用视图缓存,针对某个视图,需要进行缓存,则使用缓存。 3.1通过装饰器
from django.views.decorators.cache import never_cache, cache_page @cache_page(20) def view_cache(request, num): return HttpResponse(f"num:{num},时间戳:{time.time()}") cache_page除了默认的 cache,示例代码: key_prefix:缓存 如果多个 urlpatterns = [ path('view_cache/<int:num>/', views.view_cache, name="view_cache") ]
3.2通过urls中配置cache_page 在 from django.views.decorators.cache import cache_page urlpatterns = [ path('view_cache/<int:num>/', cache_page(20)(views.view_cache), name="view_cache") ] 以上2种方式作用是一样的,这里我们更加推荐3.2这种写法 4.低级缓存 有时我们不想缓存整个页面数据,而只是想缓存某些 django.core.cache.caches from django.core.cache import caches cache1 = caches['myalias'] cache2 = caches['myalias'] # 判断为True if cache1 is cache2: ... 说明:
# 使用 default 缓存 from django.core.cache import cache # 上面的cache等同于下面的写法 from django.core.cache import caches cache = caches['default'] django.core.cache.cache from django.core.cache import cache # 使用 redis 的一般用法 cache.set('manul_set', 'ok') manul_set = cache.get('manul_set') # 可以手动设置 timeout,如果不指定timeout,默认是 300秒,如果指定为None,则代表没有过期时间 cache.set("key", "value", timeout=None) # 可以获取key的超时设置(ttl:time to live) # 返回值的3种情况: # 0: key 不存在 (或已过期) # None: key 存在但没有设置过期 # ttl: 任何有超时设置的 key 的超时值 cache.set("foo", "value", timeout=25) cache.ttl("foo") # 得到 25 cache.ttl("not-existent") # 得到 0 # 让一个值永久存在 cache.persist("foo") cache.ttl("foo") # 得到 None # 指定一个新的过期时间 cache.set("foo", "bar", timeout=22) cache.ttl("foo") # 得到 22 cache.expire("foo", timeout=5) cache.ttl("foo") # 得到 5 # 支持 redis 分布式锁, 使用 上下文管理器 分配锁 with cache.lock("somekey"): do_some_thing() # 使用全局通配符的方式来检索或者删除键 cache.keys("foo_*") # 返回所有匹配的值, 如 ["foo_1", "foo_2"] # 删除 键 cache.delete_pattern("foo_*") # 支持通配符 实战案例 首先创建个 from django.core.cache import cache def get_cache_or_exc_func(key, func, *args, **kwargs): """ 根据传入的key和func,先获取缓存内容,没有则使用func计算并保存结果 :param key: 缓存的key :param func: 计算函数 :param args: 可变参数 :param kwargs: 可变字典 :return: 缓存的n内容或func计算的结果 """ # 加上cache锁 with cache.lock(key+'lock'): # 获取缓存中的变量 result = cache.get(key) if result: # 存在,则直接返回缓存结果 return result else: # 不存在,则计算数据,得到结果 result = func(*args, **kwargs) # 将结果保存到缓存中 cache.set(key, result) # 返回结果 return result 然后配置 urlpatterns = [ path('lower_level_cache/', views.lower_level_cache, name="lower_level_cache"), ] 最后在视图中,写入2个函数 def get_result(): """做一些费时但不经常变更的操作,这里模拟等待3秒""" time.sleep(3) return 'ok' def lower_level_cache(request): result = get_cache_or_exc_func('test_key', get_result) return JsonResponse({"result": result}) 现在我们打开浏览器,访问 5.session缓存在 # 配置session的引擎为cache SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 此处别名依赖缓存的设置 SESSION_CACHE_ALIAS = 'default' 以上就是Django使用redis配置缓存的详细内容,更多关于redis配置缓存的资料请关注极客世界其它相关文章! |
请发表评论