`
windytwang
  • 浏览: 50933 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Django下统一的cache接口

阅读更多

 

需求:

用Django做一款网页游戏的后端,用memcached减少数据库的压力

1,  尽量保持统一的使用cache的接口

2,  在没有Cache的情况下也能正常工作

3,  尽量增加cache的命中率

 

Cache的工作原理:

1,对于指定不重复key,且只会返回唯一结果的查询:

         Cache.set( key, value ),可以通过切面编程,对所有的savedelete操作加上post hook.自动的在savedelete后,执行相应的set操作

         Cache.get( key ) 提供统一的接口 getFromCache( ModelName, id )

         其中key由查询条件拼出

         比如对于league_id=3, item_number=0这样的查询生成key

item_number_0_league_id_3.

 

2,对于返回的不是唯一结果

         两种办法:

1,  查询得到id,然后通过idcache找到没有在cache中的东西,然后找出没有在cache中的东西,最后拼出整个事物。(需要测试看提升的性能为多少)(在一般的数据库上测试下来结果是用了这种方法,反而比没用 cache要慢上10倍,应该是频繁的使用memcached降低了性能)

2,  通过查询条件拼出key,然后查询是否有无在Cache中,如果没有在cache中,则查询,放到cache. 这里比较麻烦的是,如何对于key不只是id的如何将cache置为无效。比如查询items = Item.objects.filter( league_id=3, item_number = 0 ).在什么时侯将itemscache设为无效呢?

设想的是这样来做:

1)  在定义Model时,会定义好一些查询条件,像上面的情况,就会定义league_id_item_number.初始化时,会有一个cacheManager记录下,每个Model对应的查询条件。

2)  save,delete后,加入post hook,会自动调用一个updateCache方法,该方法会通过cacheManagerModel下所有定义查询条件的key进行更新

3)  进行条件查询的方法都有所记录,可以以此为根据来定义Model里的查询条件。

举上面的列子

1)       定义Item类,定义好一个查询条件为(league_id,item_number)。cacheManager[Item] = [ [item_number,league_id] ](查询条件会进行排列,增加cache命中率)

2)       第一次访问Item.objects.filter( league_id=2,item_number=3)会在keyitem_filter下找有无Item_item_number_2_league_id_3,没找到,取出数据,更新key,value.并将item_filter下加入当前key.

3)       第二次访问item.objects.filter( league_id=2,item_number=3),item_filter下找到数据,并直接访问key= Item_item_number_2_league_id_3,返回结果

4)       更新item表项,item_filter表项置为空

 

需要注意的是cache机制可能会引致多线程的问题。

上面很多地方用到了AOP(切面编程),减少了一些重复代码。有兴趣的话,可以去找一找AOP的文章来看。

4
2
分享到:
评论
2 楼 jianpx 2010-08-17  
可以 用 python 的decorator, too~
1 楼 snowolf 2010-07-28  
用切面 这个想法很不错!!!

相关推荐

    django-redis组件

    `django-redis` 实现了 Django 缓存框架的接口,使得开发者可以方便地将 Redis 作为缓存存储,存储视图、模板片段、查询结果等,有效减少数据库的负载。 其次,`django-redis` 还提供了会话后端的支持。在 Django ...

    详解一种用django_cache实现分布式锁的方式

    `django_cache` 是 Django 中用于操作缓存的接口,它允许开发者方便地存取和管理缓存数据,同时也为实现分布式锁提供了一个基础。 **使用 Django Cache 实现分布式锁** 在 Django 中,我们通常使用 `django.core....

    python3 中django项目访问apollo

    当环境设置为local,默认取本地配置,配置文件默认在~/data/apollo/cache/ django_apollo-1.0.0-py3-none-any.whl 解密即修改该文件的KEY Apollo加密方法 KEY="xxx" def encrypt(str): str_encoded = cryptocode....

    Django使用指南

    Django's cache framework章节讲解了如何使用Django的缓存框架来提高应用性能。 Conditional View Processing章节讨论了根据不同的条件来执行视图逻辑。 Cryptographic signing章节介绍了如何使用Django的加密签名...

    django-redis-chs-readthedocs-io-zh_CN-latest.zip

    - **全功能支持**:`django-redis`完全兼容Django的缓存和session框架,提供与内置缓存后端相同的接口。 - **序列化**:支持多种序列化策略,如JSON、pickle等,用于将Python对象转化为可存储在Redis中的格式。 - **...

    Django 自动生成api接口文档教程

    在本文档中,我们将探讨如何使用Django框架和djangorestframework插件来自动化地生成API接口文档。Django是一个强大的Python Web框架,而djangorestframework则为Django提供了构建RESTful API的支持,包括自动化的...

    PyPI 官网下载 | django-models-redis-cache-1.3.8.tar.gz

    标题中的“PyPI 官网下载 | django-models-redis-cache-1.3.8.tar.gz”表明我们讨论的是一个Python包,它可以从Python的官方软件仓库PyPI(Python Package Index)获取。这个包名为“django-models-redis-cache”,...

    django配置swagger

    标题 "django配置swagger" 涉及到的是在Django Web框架中集成Swagger,以便为API接口提供自动化文档。Swagger是一种流行的开源工具,用于设计、构建、文档化和使用RESTful API。它允许开发者通过一个用户友好的界面...

    26.4 Django 视图层

    Django提供了许多内置的装饰器,如`login_required`用于限制只有已登录用户才能访问视图,`@cache_page`用于缓存响应等。 8. **类视图的优势** 类视图允许继承和混合,使得代码更易于组织和复用。比如,`View`基类...

    PyPI 官网下载 | django-pymemcache-0.2.0.tar.gz

    `django-pymemcache`利用了`pymemcache`库的强大功能,为Django提供了与Memcached通信的接口。 **特性** 1. **高性能** - `django-pymemcache`使用`pymemcache`库,该库以其高效的性能和低延迟而著称,能够处理...

    python3开发django项目安装和使用redis教程

    'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } } ``` ##### 4.2 配置 Redis 作为会话存储...

    django-实现登录短信验证.docx

    from django.core.cache import cache def test_redis(request): cache.set("name", "tom", 20) # 存储数据,有效期20秒 if cache.has_key("name"): value = cache.get("name") print(value) # 输出:tom ...

    tracker:基于django的bug追踪和任务管理平台

    一个基于Django的bug追踪和任务管理平台 ... 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient',

    api.rar_Token 使用redis_django_exclaimedthp_redis_roselgr

    3. **接口保护**:为了确保只有持有有效Token的用户才能访问某些接口,我们需要在Django Rest Framework的视图或视图集上应用`@api_view`装饰器和`permissions.IsAuthenticated`: ```python from rest_framework...

    django-watchman:django-watchman为您的后备服务(例如数据库,缓存等)公开状态端点

    总之,django-watchman是Django项目中不可或缺的一部分,它通过提供简单的API接口,让开发者能够轻松地对后端服务进行健康检查,确保应用的稳定运行。如果你的项目依赖于多个服务,那么使用django-watchman将大大...

    项目完成 - 基于Django3.x版本 - 开发部署小结.doc

    Django提供了内置的`cache_page`装饰器用于缓存视图响应,但对类视图的支持稍显复杂。而第三方库`rest_framework_extensions`提供了更便捷的RESTful API缓存配置,它可以无缝集成到Django Rest Framework中。作者...

    浅谈django三种缓存模式的使用及注意点

    默认情况下,Django使用的是'django.middleware.cache.CacheMiddleware'。 2. 使用@cache_page装饰器: 当我们想要缓存整个视图的响应时,可以在视图函数上使用@cache_page装饰器。它允许我们为视图指定一个缓存...

    详解Django-restframework 之频率源码分析

    而频率控制(Throttling),则是一种用来限制客户端对API接口访问频率的方法,以防止恶意攻击或资源滥用。 #### 一、频率控制的重要性 频率控制对于API的安全性和稳定性至关重要。一方面,它可以防止用户或自动化...

    解读Django框架中的低层次缓存API

    Django 的缓存模块 `django.core.cache` 包含了一个根据 `CACHE_BACKEND` 设置自动创建的缓存对象。开发者可以通过以下方式导入并使用该缓存对象: ```python from django.core.cache import cache ``` ##### 3. ...

    Django REST Framework之频率限制的使用

    在本文中,我们将深入探讨如何在Django REST Framework中实现频率限制,以保护API接口免受恶意或过于频繁的调用。频率限制是确保服务稳定性和资源管理的关键策略,特别是对于提供开放API的平台。 首先,Django REST...

Global site tag (gtag.js) - Google Analytics