Django 标准缓存cache 模块API

一、Django缓存系统概述

Django提供了一个统一的缓存API,支持多种缓存后端(内存、数据库、文件、Redis等)。你可以在不改动代码的情况下,通过配置切换不同的缓存后端。

# 支持的缓存后端CACHES={'default':{'BACKEND':'django.core.cache.backends.locmem.LocMemCache',# 内存缓存# 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 数据库缓存# 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 文件缓存# 'BACKEND': 'django_redis.cache.RedisCache', # Redis缓存}}

二、缓存API基础

1. 导入缓存对象

# 方式1:导入默认缓存(最常用)fromdjango.core.cacheimportcache# 方式2:导入特定缓存fromdjango.core.cacheimportcaches cache_alias=caches['default']# 或 caches['session'] 等

2. 基本操作方法

defbasic_cache_operations():"""基本缓存操作"""# 1. set() - 设置缓存# 语法:cache.set(key, value, timeout=None, version=None)cache.set('username','张三')# 使用默认超时时间cache.set('user_age',25,timeout=300)# 5分钟后过期cache.set('permanent_data','重要数据',timeout=None)# 永不过期# 2. get() - 获取缓存# 语法:cache.get(key, default=None, version=None)username=cache.get('username')username=cache.get('username','默认值')# 获取不到时返回默认值not_found=cache.get('non_existent_key')# 返回 None# 3. add() - 仅当键不存在时设置# 语法:cache.add(key, value, timeout=None, version=None)added=cache.add('counter',1)# 第一次设置成功,返回Trueadded_again=cache.add('counter',2)# 已存在,不修改,返回False# 4. get_or_set() - 获取或设置# 语法:cache.get_or_set(key, default, timeout=None, version=None)value=cache.get_or_set('my_key','default_value',timeout=60)# 等价于:# value = cache.get('my_key')# if value is None:# value = 'default_value'# cache.set('my_key', value, timeout=60)# 5. delete() - 删除缓存# 语法:cache.delete(key, version=None)cache.delete('username')deleted=cache.delete('non_existent_key')# 返回False# 6. clear() - 清空所有缓存# 语法:cache.clear()# cache.clear() # 谨慎使用!return{'username':username,'counter':cache.get('counter'),'added_first':added,'added_again':added_again,}

3. 批量操作方法

defbatch_operations():"""批量缓存操作"""# 1. set_many() - 设置多个缓存# 语法:cache.set_many(dict, timeout=None, version=None)data={'user:1:name':'张三','user:1:age':25,'user:1:email':'zhangsan@example.com','user:2:name':'李四',}cache.set_many(data,timeout=300)# 2. get_many() - 获取多个缓存# 语法:cache.get_many(keys, version=None)keys=['user:1:name','user:1:age','user:1:email','user:2:name']values=cache.get_many(keys)# 返回字典# 3. delete_many() - 删除多个缓存# 语法:cache.delete_many(keys, version=None)cache.delete_many(['user:1:age','user:1:email'])returnvalues

4. 原子操作方法

defatomic_operations():"""原子操作(需要缓存后端支持)"""# 1. incr() - 递增# 语法:cache.incr(key, delta=1, version=None)cache.set('counter',1)cache.incr('counter')# 2cache.incr('counter',10)# 12# 2. decr() - 递减# 语法:cache.decr(key, delta=1, version=None)cache.decr('counter')# 11cache.decr('counter',5)# 6# 3. touch() - 更新过期时间# 语法:cache.touch(key, timeout=None, version=None)cache.touch('counter',timeout=600)# 重置为10分钟后过期return{'counter':cache.get('counter')}

三、缓存版本控制

defcache_versioning():"""缓存版本控制"""# 设置版本cache.set('config','v1_config',version=1)cache.set('config','v2_config',version=2)# 获取特定版本v1_config=cache.get('config',version=1)# 'v1_config'v2_config=cache.get('config',version=2)# 'v2_config'# 递增版本(旧版本自动失效)cache.incr_version('config')# version从2变为3v3_config=cache.get('config')# None(默认使用最新版本)# 删除特定版本cache.delete('config',version=1)return{'v1':v1_config,'v2':v2_config,'v3':v3_config}

四、缓存键的生成

defcache_key_generation():"""缓存键的生成"""# Django会自动处理键的生成# 最终的键 = 前缀:版本:原始键# 自定义键生成函数defmake_cache_key(model_name,object_id,action='detail'):"""生成结构化缓存键"""returnf'{model_name}:{object_id}:{action}'# 使用示例user_key=make_cache_key('user',123,'profile')cache.set(user_key,{'name':'张三','age':25})# 复杂的键complex_key=f'search:{hashlib.md5("python tutorial".encode()).hexdigest()}:page:1'cache.set(complex_key,['result1','result2'])return{'user_key':user_key,'user_data':cache.get(user_key),'complex_key':complex_key}

五、实战:缓存数据库查询

fromdjango.dbimportmodelsfromdjango.core.cacheimportcacheimporttimeclassProduct(models.Model):"""产品模型"""name=models.CharField(max_length=100)price=models.DecimalField(max_digits=10,decimal_places=2)stock=models.IntegerField(default=0)category=models.CharField(max_length=50)created_at=models.DateTimeField(auto_now_add=True)def__str__(self):returnself.nameclassProductCacheService:"""产品缓存服务"""@staticmethoddefget_product(product_id):"""获取单个产品(带缓存)"""cache_key=f'product:{product_id}'# 尝试从缓存获取product=cache.get(cache_key)ifproductisNone:print(f"缓存未命中,从数据库查询产品{product_id}")# 模拟数据库查询time.sleep(1)# 假设查询耗时1秒try:product_obj=Product.objects.get(id=product_id)product={'id':product_obj.id,'name':product_obj.name,'price':float(product_obj.price),'stock':product_obj.stock,'category':product_obj.category,}# 存入缓存,有效期1小时cache.set(cache_key,product,timeout=3600)exceptProduct.DoesNotExist:# 缓存空结果,防止缓存穿透cache.set(cache_key,None,timeout=60)product=Noneelse:print(f"缓存命中,从缓存获取产品{product_id}")returnproduct@staticmethoddefget_products_by_category(category,page=1,per_page=20):"""按分类获取产品列表(带缓存)"""cache_key=f'products:category:{category}:page:{page}:per_page:{per_page}'products=cache.get(cache_key)ifproductsisNone:print(f"缓存未命中,查询分类{category}的产品")# 模拟数据库查询time.sleep(2)# 假设查询耗时2秒queryset=Product.objects.filter(category=category,stock__gt=0).order_by('-created_at')# 分页start=(page-1)*per_page end=start+per_page products=list(queryset.values('id','name','price','stock')[start:end])# 存入缓存,有效期5分钟cache.set(cache_key,products,timeout=300)returnproducts@staticmethoddefinvalidate_product_cache(product_id=None):"""使产品缓存失效"""ifproduct_id:# 删除单个产品缓存cache.delete(f'product:{product_id}')# 删除所有产品列表缓存# 注意:实际项目中可能需要更精细的控制# 这里简单删除所有包含'products:'的键# 实际可以使用更复杂的方法,如缓存标签# 示例:删除特定模式的键# 注意:keys() 命令在生产环境慎用# 更好的方案是使用缓存版本或单独管理缓存键@staticmethoddefget_or_set_product_stats():"""获取或设置产品统计信息"""cache_key='product_stats'stats=cache.get_or_set(cache_key,lambda:ProductCacheService._calculate_product_stats(),timeout=600# 10分钟)returnstats@staticmethoddef_calculate_product_stats():"""计算产品统计信息(耗时操作)"""print("计算产品统计信息...")time.sleep(3)# 模拟耗时计算return{'total_products':Product.objects.count(),'total_stock':Product.objects.aggregate(models.Sum('stock'))['stock__sum'],'average_price':Product.objects.aggregate(models.Avg('price'))['price__avg'],}

六、视图缓存

fromdjango.views.decorators.cacheimportcache_page,never_cachefromdjango.utils.decoratorsimportmethod_decoratorfromdjango.viewsimportViewfromdjango.httpimportJsonResponseimporttime# 1. 函数视图缓存@cache_page(60*5)# 缓存5分钟defexpensive_view(request):"""缓存整个视图响应"""time.sleep(2)# 模拟耗时操作returnJsonResponse({'data':'这是缓存的结果','timestamp':time.time(),'message':'这个视图被缓存了5分钟'})@cache_page(60*15)# 缓存15分钟defproduct_list_view(request,category):"""带参数的视图缓存"""# 注意:不同参数会生成不同的缓存products=ProductCacheService.get_products_by_category(category)returnJsonResponse({'products':products})# 2. 类视图缓存classCachedView(View):"""缓存的类视图"""@method_decorator(cache_page(60*10))defdispatch(self,*args,**kwargs):returnsuper().dispatch(*args,**kwargs)defget(self,request):time.sleep(1)returnJsonResponse({'message':'类视图缓存示例'})# 3. 条件缓存defconditional_cached_view(request):"""根据条件决定是否缓存"""ifrequest.user.is_staff:# 管理员不缓存returnexpensive_operation(request)# 普通用户缓存returncache_page(60*5)(expensive_operation)(request)# 4. 不缓存装饰器@never_cachedefsensitive_data_view(request):"""敏感数据,不缓存"""returnJsonResponse({'token':'sensitive_token_123456','timestamp':time.time()})

七、模板缓存

<!--在Django模板中使用缓存-->{%load cache%}<!DOCTYPE html><html><head><title>产品详情</title></head><body><h1>{{product.name}}</h1><!--1.基本模板缓存-->{%cache300product_sidebar%}<divclass="sidebar"><h3>相关产品</h3><ul>{%forrelatedinrelated_products%}<li>{{related.name}}</li>{%endfor%}</ul></div>{%endcache%}<!--2.带变量的缓存-->{%cache300product_detail product.idproduct.updated_at%}<divclass="content"><p>价格:¥{{product.price}}</p><p>库存:{{product.stock}}</p><p>描述:{{product.description}}</p></div>{%endcache%}<!--3.根据用户缓存-->{%cache300user_recommendations request.user.id%}<divclass="recommendations"><h3>为您推荐</h3>{%foriteminuser_recommendations%}<p>{{item}}</p>{%endfor%}</div>{%endcache%}<!--4.多变量组合-->{%withcache_key="product_"|add:product.id|add:"_"|add:category%}{%cache300cache_key%}<divclass="category-info">分类:{{category}}</div>{%endcache%}{%endwith%}</body></html>

八、缓存中间件

# settings.pyMIDDLEWARE=['django.middleware.cache.UpdateCacheMiddleware',# 必须第一个# ... 其他中间件 ...'django.middleware.cache.FetchFromCacheMiddleware',# 必须最后一个]# 全站缓存配置CACHE_MIDDLEWARE_ALIAS='default'CACHE_MIDDLEWARE_SECONDS=60*15# 15分钟CACHE_MIDDLEWARE_KEY_PREFIX='mysite'# views.pyfromdjango.views.decorators.cacheimportcache_controlfromdjango.views.decorators.varyimportvary_on_cookie,vary_on_headers# 控制HTTP缓存头@cache_control(public=True,max_age=300,# 客户端缓存5分钟s_maxage=600,# 代理服务器缓存10分钟must_revalidate=True)defapi_view_with_cache_control(request):"""控制HTTP缓存的视图"""returnJsonResponse({'data':'可缓存的数据'})# 根据Cookie变化缓存@vary_on_cookie@cache_page(300)defuser_specific_view(request):"""不同用户看到不同的缓存内容"""returnJsonResponse({'user':request.user.username,'data':'用户特定数据'})# 根据请求头变化缓存@vary_on_headers('User-Agent','Accept-Language')@cache_page(300)defvary_by_header_view(request):"""根据请求头变化缓存"""returnJsonResponse({'user_agent':request.META.get('HTTP_USER_AGENT'),'accept_language':request.META.get('HTTP_ACCEPT_LANGUAGE')})

九、多缓存配置

# settings.pyCACHES={'default':{'BACKEND':'django.core.cache.backends.locmem.LocMemCache','LOCATION':'unique-snowflake','TIMEOUT':300,},'user_sessions':{'BACKEND':'django_redis.cache.RedisCache','LOCATION':'redis://127.0.0.1:6379/1','OPTIONS':{'CLIENT_CLASS':'django_redis.client.DefaultClient',},'TIMEOUT':60*60*24,# 24小时},'fast_cache':{'BACKEND':'django.core.cache.backends.memcached.MemcachedCache','LOCATION':'127.0.0.1:11211','TIMEOUT':60,}}# 使用不同的缓存后端fromdjango.core.cacheimportcachesdefuse_multiple_caches():"""使用多个缓存后端"""# 获取不同的缓存default_cache=caches['default']session_cache=caches['user_sessions']fast_cache=caches['fast_cache']# 存储到不同的缓存default_cache.set('site_config',{'theme':'dark'},timeout=3600)session_cache.set(f'session:{user_id}',session_data,timeout=86400)fast_cache.set('hot_data',hot_data,timeout=60)# 从不同的缓存获取config=default_cache.get('site_config')session=session_cache.get(f'session:{user_id}')hot=fast_cache.get('hot_data')return{'config':config,'session':session,'hot':hot}

十、缓存模式和最佳实践

1. 缓存穿透防护

defget_product_safe(product_id):""" 防止缓存穿透 缓存空值避免大量请求直接打到数据库 """cache_key=f'product:{product_id}'# 尝试获取缓存product=cache.get(cache_key)ifproductisNone:# 查询数据库try:product=Product.objects.get(id=product_id)# 缓存1小时cache.set(cache_key,product,timeout=3600)exceptProduct.DoesNotExist:# 缓存空值,短时间(如1分钟)cache.set(cache_key,'NULL',timeout=60)product=Noneelifproduct=='NULL':# 空值标记product=Nonereturnproduct

2. 缓存雪崩防护

importrandomdefset_with_random_ttl(key,value,base_ttl=3600,jitter=300):""" 防止缓存雪崩 设置随机过期时间,避免大量缓存同时过期 """# 添加随机抖动ttl=base_ttl+random.randint(-jitter,jitter)cache.set(key,value,timeout=ttl)returnttl

3. 缓存预热

defwarmup_cache():"""缓存预热"""print("开始缓存预热...")# 预热热门数据hot_products=Product.objects.filter(stock__gt=0).order_by('-sales')[:100]forproductinhot_products:cache_key=f'product:{product.id}'product_data={'id':product.id,'name':product.name,'price':float(product.price),}cache.set(cache_key,product_data,timeout=3600)# 预热分类数据categories=Product.objects.values_list('category',flat=True).distinct()forcategoryincategories:cache_key=f'products:category:{category}'products=list(Product.objects.filter(category=category,stock__gt=0).values('id','name')[:20])cache.set(cache_key,products,timeout=1800)print("缓存预热完成")

4. 缓存统计

classCacheStats:"""缓存统计"""def__init__(self):self.hits=0self.misses=0defget_with_stats(self,key,default=None):"""带统计的获取"""value=cache.get(key)ifvalueisnotNone:self.hits+=1else:self.misses+=1value=defaultreturnvaluedefget_hit_rate(self):"""获取命中率"""total=self.hits+self.missesiftotal==0:return0return(self.hits/total)*100defget_stats(self):"""获取统计信息"""return{'hits':self.hits,'misses':self.misses,'total':self.hits+self.misses,'hit_rate':f"{self.get_hit_rate():.2f}%"}

十一、常见问题

1. 缓存键太长

# 解决方法:对长键进行哈希importhashlibdefget_hashed_key(key):"""对长键进行哈希"""iflen(key)>200:returnhashlib.md5(key.encode()).hexdigest()returnkey

2. 缓存不一致

# 解决方法:及时清理缓存defupdate_product_and_clear_cache(product_id,data):"""更新产品并清理相关缓存"""# 1. 更新数据库Product.objects.filter(id=product_id).update(**data)# 2. 清理相关缓存cache.delete(f'product:{product_id}')cache.delete('product_list')# 列表缓存cache.delete_pattern('products:category:*')# 如果有相关分类缓存# 3. 可选:重新设置缓存new_product=Product.objects.get(id=product_id)cache.set(f'product:{product_id}',new_product,timeout=3600)

3. 缓存序列化问题

# Django模型对象需要序列化才能缓存fromdjango.coreimportserializersdefcache_model_object(model_obj):"""缓存模型对象"""# 方法1:转换为字典data={'id':model_obj.id,'name':model_obj.name,# ... 其他字段}cache.set(f'model:{model_obj.id}',data)# 方法2:使用Django序列化serialized=serializers.serialize('json',[model_obj])cache.set(f'model_serialized:{model_obj.id}',serialized)# 方法3:使用values()查询data=Model.objects.filter(id=model_obj.id).values().first()cache.set(f'model_values:{model_obj.id}',data)

总结

Django的标准缓存API提供了:

  1. 统一的接口:相同API操作不同后端
  2. 丰富的功能:基本CRUD、批量操作、原子操作
  3. 灵活的配置:支持多种缓存策略
  4. 集成良好:与视图、模板无缝集成

最佳实践:

  • 选择合适的缓存粒度
  • 设置合理的过期时间
  • 及时清理无效缓存
  • 监控缓存命中率
  • 处理缓存异常情况

掌握这些API,你就能在Django项目中高效地使用缓存来提升应用性能了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1013292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenFeign 声明式客户端的动态代理与 LoadBalancer 负载均衡策略

在分布式微服务架构中&#xff0c;服务间的高效、可靠远程调用是系统稳定运行的关键。Spring Cloud OpenFeign 以其声明式、简洁的风格&#xff0c;极大简化了 HTTP 客户端的开发&#xff0c;同时深度集成客户端负载均衡机制。本文将从原理到实战&#xff0c;深入剖析 OpenFeig…

Tiled地图渲染引擎深度解析:从架构设计到性能优化的完整指南

Tiled地图渲染引擎深度解析&#xff1a;从架构设计到性能优化的完整指南 【免费下载链接】tiled 项目地址: https://gitcode.com/gh_mirrors/til/tiled Tiled地图编辑器作为业界领先的2D地图制作工具&#xff0c;其核心渲染引擎采用了高度模块化的设计理念&#xff0c;…

BERT模型训练全流程解析:从数据加载到模型保存

本文将详细解析一个完整的中文BERT情感分类模型训练流程&#xff0c;涵盖数据预处理、模型配置、训练循环等关键环节。 先上代码&#xff1a; # 模型训练 train.py import torch from MyData import MyDataset # 自定义数据集类 from torch.utils.data import DataLoader # 数…

《零基础学 PHP:从入门到实战》·PHP编程精进之路:掌握高级特性与实战技巧-1

第1章:面向对象编程进阶 章节介绍 学习目标: 深入掌握PHP面向对象编程(OOP)的核心与高级机制.你将不再满足于创建简单的类,而是学会运用静态成员、继承、多态、抽象与接口来设计松耦合、高复用的架构.本章将解锁"魔术方法"的奥秘,让你能够优雅地处理对象生命周期与动…

OpenCode正则搜索:让代码大海捞针变得轻而易举

OpenCode正则搜索&#xff1a;让代码大海捞针变得轻而易举 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手&#xff0c;模型灵活可选&#xff0c;可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 在当今快速迭代的软件开发环境…

如何甄别靠谱的市场认证机构?2025年年终最新服务商核心能力横评与5家专业机构推荐! - 十大品牌推荐

在品牌竞争日益依赖于可信背书的当下,一份权威的市场地位认证报告已成为企业应对监管、赢得消费者信任的关键资产。然而,面对市场上众多宣称能提供认证服务的机构,决策者常常陷入困惑:哪些机构真正具备严谨的方法论…

最新计算机专业开题报告案例110:基于微信小程序的智慧社区系统的设计与实现

计算机毕业设计100套 微信小程序项目实战 java项目实战 若要获取全文以及其他需求&#xff0c;请扫一扫下方的名片进行获取与咨询。 撰写不易&#xff0c;感谢支持&#xff01; 目录 一、研究目的和意义 1.1 研究目的 1.2 研究意义 二、研究思路、研究方法以及手段 2…

超越静态图表:Bokeh可视化API的实时数据流与交互式应用开发深度解析

超越静态图表&#xff1a;Bokeh可视化API的实时数据流与交互式应用开发深度解析 引言&#xff1a;可视化开发的范式转变 在数据科学和Web应用开发领域&#xff0c;数据可视化已从简单的静态图表演变为复杂的交互式应用程序。虽然Matplotlib和Seaborn等库在静态可视化领域表现出…

打卡信奥刷题(2535)用C++实现信奥 P2041 分裂游戏

P2041 分裂游戏 题目描述 有一个无限大的棋盘&#xff0c;棋盘左下角有一个大小为 nnn 的阶梯形区域&#xff0c;其中最左下角的那个格子里有一枚棋子。你每次可以把一枚棋子“分裂”成两枚棋子&#xff0c;分别放在原位置的上边一格和右边一格。&#xff08;但如果目标位置已有…

canvas基础与乾坤

canvas基础ctx cvs.getcontext(2d)cvd.height cvx.width直线 ctx.beginPath()ctx.moveTo&#xff08;坐标&#xff09;ctx.lineToctx.lineToctx.lineToctx.strok 描边ctx.closePath 闭合曲线ctx.arc(100,500,6,Math.pi,true)ctx.fill 填充原始尺寸 放大尺幅 * 缩放倍率 模糊问…

2025年年终北京物流公司推荐:基于多品牌服务能力与用户口碑深度解析的5家高可靠性企业清单 - 十大品牌推荐

在物流行业深度整合与数字化转型的关键时期,企业主与供应链管理者正面临前所未有的选择压力。一方面,电商履约、制造业升级催生了对于高效、柔性物流服务的巨大需求;另一方面,市场上服务商数量庞杂,服务质量参差不…

2025年年终品牌证明公司推荐:从方法论到实效证据的全方位评估,附不同企业预算下的5款优选指南 - 十大品牌推荐

在品牌竞争日益白热化的今天,第三方市场地位证明已成为企业建立信任、支撑广告宣传与资本运作的刚性需求。然而,决策者面临的核心困境在于:市场上宣称能提供“品牌证明”的机构众多,其资质、方法论、数据严谨性及行…

基于vue的校园兼职系统_n52cd130_springboot php python nodejs

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

NPM 包发布完整实战方案

NPM 包发布完整实战方案 一、环境准备阶段 1.1 检查当前环境 # 确认当前登录用户 npm whoami # 输出&#xff1a;jiangshiguang# 检查当前 registry 配置 npm config get registry # 期望&#xff1a;https://registry.npmjs.org/1.2 验证包配置 # 检查 package.json 关键配…

Docker+vLLM内网离线部署Qwen3 流程

Docker + vLLM 内网离线部署 Qwen3-32B 完整教程 环境准备 Nvidia显卡驱动、CUDA、nvidia-container安装 参考:http: Docker环境安装 参考:http: 注意:在进行VLLM容器化部署之前,需要确保已在服务器上安装了Docker 和 Nvidia显卡驱动、CUDA、nvidia-container。 一、部…

2025年年终品牌证明公司推荐:聚焦IPO与消费行业,专家严选5家权威资质覆盖的优质服务商清单 - 十大品牌推荐

在品牌竞争日益依赖于可信数据与权威背书的当下,企业寻求第三方机构为其市场地位提供客观证明,已成为品牌建设与合规营销的关键一步。然而,面对市场上众多的咨询与研究机构,决策者常常陷入困惑:如何辨别哪些机构具…

18、使用微软Face API进行图片人脸检测

使用微软Face API进行图片人脸检测 1. 引言 在图像处理领域,人脸检测是一项非常重要的任务。微软认知服务中的Face API提供了强大的功能,可以用于检测图片中的人脸、性别、年龄、情绪等信息。本文将详细介绍如何使用Face API进行人脸检测,并提供相应的代码示例。 2. Face…

Django 中使用django-redis库与Redis交互API指南

一、理解Django缓存与原生Redis的区别Django缓存APIRedis原生数据类型用途键值对存储字符串(String)简单缓存不支持列表(List)消息队列、最新列表不支持集合(Set)去重、共同好友不支持有序集合(Sorted Set)排行榜、优先级队列不支持哈希(Hash)对象存储、多个字段二、获取原生Re…

2025年年终品牌证明公司推荐:从涉外调查到ESG审验,涵盖核心资质的5家标杆机构盘点 - 十大品牌推荐

在品牌竞争日益白热化的今天,第三方市场地位证明已成为企业建立信任、支撑广告宣传与资本运作的刚性需求。然而,面对市场上数量众多、宣称各异的咨询机构,决策者常常陷入选择困境:如何从众多服务商中筛选出真正具备…

北京物流公司哪家服务更全面可靠?2025年年终最新市场深度评测及5家实力派服务商推荐! - 十大品牌推荐

摘要 在供应链效率决定企业竞争力的今天,选择一家可靠的物流合作伙伴已成为众多企业的核心战略决策。然而,面对市场上数量众多、服务宣称各异的物流公司,决策者常常陷入困惑:如何从海量信息中甄别出真正具备全国网…