需求:
用Django做一款网页游戏的后端,用memcached减少数据库的压力
1, 尽量保持统一的使用cache的接口
2, 在没有Cache的情况下也能正常工作
3, 尽量增加cache的命中率
Cache的工作原理:
1,对于指定不重复key,且只会返回唯一结果的查询:
Cache.set(
key, value ),可以通过切面编程,对所有的save及delete操作加上post hook.自动的在save或delete后,执行相应的set操作
Cache.get(
key ) 提供统一的接口 getFromCache( ModelName, id )
其中key由查询条件拼出
比如对于league_id=3,
item_number=0这样的查询生成key为
item_number_0_league_id_3.
2,对于返回的不是唯一结果
两种办法:
1, 查询得到id,然后通过id及cache找到没有在cache中的东西,然后找出没有在cache中的东西,最后拼出整个事物。(需要测试看提升的性能为多少)(在一般的数据库上测试下来结果是用了这种方法,反而比没用 cache要慢上10倍,应该是频繁的使用memcached降低了性能)
2, 通过查询条件拼出key,然后查询是否有无在Cache中,如果没有在cache中,则查询,放到cache.
这里比较麻烦的是,如何对于key不只是id的如何将cache置为无效。比如查询items =
Item.objects.filter( league_id=3, item_number = 0 ).在什么时侯将items的cache设为无效呢?
设想的是这样来做:
1) 在定义Model时,会定义好一些查询条件,像上面的情况,就会定义league_id_item_number.初始化时,会有一个cacheManager记录下,每个Model对应的查询条件。
2) 在save,delete后,加入post
hook,会自动调用一个updateCache方法,该方法会通过cacheManager将Model下所有定义查询条件的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)会在key为item_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的文章来看。
分享到:
相关推荐
lock拓展,基于django的内置cache,django-cache-lock-master.zip
django常用命令,django 搭建流程 django整合mysql实现对外提供接口,
django-redis-cache, 面向 Django的Redis缓存后端 Django 缓存后端 面向 Django的Redis缓存后端可以在 http://django-redis-cache.readthedocs.org/en/latest/ 找到文档。变更日志 1.7.1确认
python库。 资源全名:django-cache-lock-0.2.5.tar.gz
主要介绍了Django调用百度AI接口实现人脸注册登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
基于django的微信接口模块
django编写api接口
django_接口自框架,简单开发,自己摸索成才django_接口自框架django_接口自框架
Django快速实现登录接口,用于配合vue的学习
基于Django实现的微信小程序登录以及资源上传的API接口.zip
django-cache-manager django模型的简单缓存管理器,用于缓存模型的查询集。 缓存管理器将缓存已针对模型看到的所有查询。 对于模型的任何更新/删除,都会驱逐模型缓存。 对于不经常更改的模型,此管理器很有用。 ...
通过Django程序实现对WeChat接口的请求,可以和微信联系人实现收发消息
django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django...
主要介绍了Django中的CACHE_BACKEND参数和站点级Cache设置,Python是最具人气的Python web框架,需要的朋友可以参考下
Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django...
Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统源码 Django客户管理系统...
使用Django编写api接口文档
1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业...接口自动化测试平台源码+项目说明(后端采用Django REST framework编写接口,前端页面采用比较容易上手的vue+elementUI).zip
今天我们就来看看缓存Cache应用场景及工作原理吧,并详细介绍如何在Django中设置Cache并使用它们。 什么是缓存Cache 缓存是一类可以更快的读取数据的介质统称,也指其它可以加快数据读取的存储方式。一般用来存储...
基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django的个人网盘源码 基于Django...