缓存
1、在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面
⑴当一个网站的用户访问量很大的时候,每一次的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力
2、缓存是一类可以更快的读取数据的介质统称,也指其它可以加快数据读取的存储方式
3、目的:使用缓存可以大大提高程序的响应速度,增强用户体验
注:
1、缓存一般用来存储临时数据
比如验证码(图形验证码、短信验证码)、登录session等所有不是至关重要且临时的数据
为什么要使用缓存Cache
在Django中,当用户请求到达视图后,视图会先从数据库提取数据放到模板中进行动态渲染,渲染后的结果就是用户看到的网页。如果用户每次请求都从数据库提取数据并渲染,将极大降低性能,不仅服务器压力大,而且客户端也无法即时获得响应。如果能将渲染后的结果放到速度更快的缓存中,每次有请求过来,先检查缓存中是否有对应的资源,如果有,直接从缓存中取出来返回响应,节省取数据和渲染的时间,不仅能大大提高系统性能,还能提高用户体验。
Django中的缓存方式
1、开发调试缓存
2、内存缓存
3、文件缓存
4、数据库缓存
5、Memcache缓存(使用python-memcached模块)
6、Memcache缓存(使用pylibmc模块)
注:
1、经常使用的有文件缓存和Mencache缓存
2、Mencache是一个高性能的分布式的内存对象缓存系统
3、Mencache是通过在内存里维护一个统一的巨大的hash表,Mencache能存储各种各样的数据,包括图像、视屏、文件,以及数据库检索的结果等
4、将一些常用的数据保存在内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户
⑴简单的来说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度
5、memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失
6、内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
实现原理
将执行过的操作数据 存储下来,在一定时间内,再次获取数据的时候,直接从缓存中获取。比较理想的方案,缓存使用内存级缓存
1、客户端通过url访问服务端
2、服务端通过url来查找处理逻辑的视图函数
3、视图函数去缓存中查找数据
4、如果视图函数在缓存中查找到了数据,进行渲染,返回一个响应体给客户端
5、如果试图函数没有在缓存中查找到数据,则会通过models访问数据库,在数据库中查找数据
6、服务端将查找到的数据在缓存中存一份,同时进行渲染给客户端返回响应体
Mencached
Mencached安装与启动
这里介绍windows下安装Mencache
⑴下载
下载的话,我是在网上找了一个网盘下载的:http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/
⑵安装
1、将下载后的压缩包解压到任意目录:解压后会有个exe文件,这个不是双击来安装的,而是需要命令行来安装
⑴ pthreadGC2.dll:可能在windows下安装会报错,如果报错了可以把这个文件复制到C:\Windows\System32下
2、然后CMD进入到该目录,执行命令:memcached.exe -d install
3、安装完成后,直接使用命令行来启动:memcached.exe -d start
3、查看服务是否安装成功
4、查看是否启动成功
5、本地连接到memcached
使用命令:telnet 127.0.0.1 11211
注:其他常用命令
-p 指定启动占用的端口,默认是11211
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
telnet操作memcached
使用CMD命令行工具来操作memcached
登录
1、命令:telnet 127.0.0.1 11211
2、输入命令后,按回车键进入memcached服务(前提是服务器正常运行)
⑴进入memcached后:如果是在win系统下,记得按下回车键,就能愉快的使用telnet来操作memcached了
例1:
set
语法:set [key] [是否压缩] [存活时长] [字符长度]
作用:set命令用于向memcache存储一对键值对数据
⑴如果这个key已经存在了,那么就会替换,否则就新增
⑵如果输入的数据符合要求,就会出现STORED字样,说明该数据存储成功
⑶注:感觉在使用telnet操作memcache时一定不要使用键盘的[退格键],不然回车时会报错
get
语法:get key
作用:获取key对应的value值,如果key不存在,则会提示END
例2:
add
语法:add key
作用:与set作用相似,也是添加数据,与set不同的是,如果key之前已经存在,再执行add key操作,之前的值不会更新并提示NOT_STORED
例3:
delete
语法:delete key
作用:删除key
例4:
flush_all
语法:flush_all
作用:删除memcached中所有的key及value
incr
语法:incr score number[增加值的步长]
作用:对key存在的value进行相加操作
注:相加、减的值都必须为整数,不能为小数或其它非数字的字符,否则会报错
例5:
decr
语法:decr key number[相减值的步长]
作用:对key存在的值进行相减操作
注:相加、减的值都必须为整数,不能为小数或其它非数字的字符,否则会报错
例6:
stats
语法:stats
作用:返回memcached统计信息(比如set、get总数,连接数等....)
例7:
注:下面,针对上图一些重要参数进行解释
1、cmd_get:执行get请求次数
2、cmd_set:执行set请求次数
3、get_misses:get指令未命中次数
4、get_hits:get指令命中次数
5、curr_connections:当前连接数(memcached默认最大的连接数是1024)
Python操作memcached
1、前面例子中我们使用的是在CMD命令行中通过telnet来操作memcached。在实际中肯定是不会通过命令行来操作缓存数据的,而是使用代码(这里指Python)
⑴上面介绍的使用命令行来操作memcached了解下就好了,几乎不会用到
2、使用Python来操作memcached需要安装第三方库:pip install python-memcached
连接到memcached
1、方法:Client(servers, debug=True)
2、常用参数:
⑴servers:表示连接到的memcached服务IP(传入一个列表,列表中可以存在多个memcached服务地址)
⑵debug:开发调试模式(只用于开发阶段)
3、因为后面主要是在Django中用到memcached,所以这里直接就在Django视图中进行操作了,在进行缓存数据的增删改查时需要访问对应的页面才会操作成功
例8:
set()
1、作用:设置一个键值对,如果key不存在,则创建,如果key存在,则修改;
2、语法:set(self, key, val, time=0, min_compress_len=0, noreply=False)
3、参数:
⑴key:数据的键名,必选参数
⑵val:数据的值,必选参数
⑶time:数据的保存时间,单位秒,默认为0
例9:
set_multi()
1、作用:与set()方法类似,只是说set()方法一次只能保存一个键值对数据,而set_multi()可以以字典的形式一次保存多个数据
⑴设置多个键值对,如果key不存在,则创建,如果key存在,则修改
2、语法:set_multi(self, mapping, time=0, key_prefix='', min_compress_len=0,noreply=False)
3、参数:
⑴mapping:待保存的数据,以字典的形式传入
例10:
get()
1、作用:获取一个键值对
⑴根据传入的键名来获取对应的值。传入的键不存在时返回None
2、语法:get(self, key)
3、参数:
⑴key:待获取的值的键名
例11:
get_multi()
1、作用:获取多个键值对。返回值为数据键值对组成的字典
⑴与get()作用类似。只是说get()方法一次只能获取一个键值对数据,而get_multi()可以一次性获取多个
2、语法:get_multi(self, keys, key_prefix='')
3、参数:
⑴keys:待获取的值的键名,以列表的形式传入
例12:
delete()
1、在Memcached中删除指定的一个键值对
2、语法:delete(self, key, time=None, noreply=False)
3、参数:
⑴keys:待删除的数据的键名
例13:
delete_multi()
1、作用:在Memcached中删除指定的多个键值对
2、语法:get_multi(self, keys, key_prefix='')
3、参数:
⑴keys:待删除的数据的键名,以字典的形式传入
例14:
incr()
1、作用:对key存在的value进行相加操作
2、语法:incr(self, key, delta=1, noreply=False)
3、参数:
⑴key:待增加值的键名
⑵delta:增加的数,默认值为1
4、相反的是decr()方法: 对key存在的value进行相减操作
例15:
其他方法
方法名 | 说明 |
add() | 与set作用相似,也是添加数据(参考telnet中的使用) |
replace() | 修改某个key的值,如果key不存在,则异常 |
append() | 修改指定key的值,在该值后面追加内容 |
prepend() | 修改指定key的值,在该值前面插入内容 |
stats() | 查看历史操作 |
注:
1、set方法和add方法的区别:set = add + replace
2、有些方法在telnet和Python中介绍的方法时互通的
python操作memcache集群
1、前面介绍的都是只连接了一台memcache服务。在实际中可能会用到多台memcache服务,所以在使用Pthon连接memcache时需要传入多个服务IP和端口号
2、在实际中,一般是有多台机器来存储memcache接收到的数据的(集群)
⑴memcache接收到的数据后,按一定规则将数据存入到不同的存储服务器中
例16:memcache集群示意图
例17:
注:
可以看到不管memcache服务后面有多少台用来存储数据的服务器都与我们是的视图函数没啥关系。我们只需要保证memcache服务对应的IP是全部连上了