Django笔记:Memcached缓存系统
Memcached
是一个高性能的分布式的内存对象缓存系统,通过在内存中维护一个统一的巨大的hash
表,Memcached
能存储多种数据,通常情况下,Memcached
被用来存储图形验证码、短信验证码、登录session等不是至关重要的数据,因为一旦遇到断电等意外,内存中的数据将会丢失,所以不能存储特别重要的数据。
优点:之所以使用Memcached
系统,是因为它能提高服务的访问速度,缓解数据库的压力,其实就是因为Memcached
是在内存中存取数据,所以速度上会非常快。
注:Memcached
中的数据是以键值对的方式来存储的。
一、安装和启动
Memcached
需要先在机器上安装后才能使用。
Windows系统
- 安装:
memcached.exe -d install
(注意不是双击安装,而是在命令窗口以执行命令的方式安装)。 - 启动:
memcached.exe -d start
。
Linux系统
- 安装:
sudo apt install memcached
。 - 启动:
/usr/bin/memcached [-u memcache] -d start
。
在Windows中使用Memcached
的注意事项:
- 如果提示没有权限,则使用管理员什么打开cmd。
- 提示缺少
pthreadGC2.dll
时,下载此文件并拷贝到windows/System32
下即可。 -
memcached.exe
文件不要放在含有中文的路径下。
Linux中启动时的常用参数:
-
-d
:后台运行Memcached
,如/usr/bin/memcached [-u memcache] -d start
。 -
-m
:指定运行Memcached
可以占用的内存,单位为M
,默认为64M
,如/usr/bin/memcached [-u memcache] -m 1024 -d start
。 -
-p
:指定占用端口,默认端口为11211
。 -
-l
:指定别的机器通过哪个ip地址连接到此服务,如果想要别的机器也能访问到此服务,就需要设置为-l 0.0.0.0
。
二、telnet操作Memcached
如果想在命令窗口操作Memcached
,可以使用telnet
命令。执行telnet 服务ip地址 端口号
连接到Memcached
服务,连接上之后就可以操作Memcached
了。
常用命令有:
set
如果已存在相同的key
,则会覆盖原有的value
,否则新建一个key-value
键值对。语法为:
set key flas(是否压缩) timeout value_length
value
示例=====================
> set name 0[0表示不压缩] 60[过期时间60秒] 5[字符长度为5个字符]
> hello
> STORED[表示存储成功]
get
根据key
从Memcached
中获取对应的value
。
> get name
add
语法同set
命令,如果已存在相同的key
则会失败,提示NOT_STORED
。
delete
根据key
从Memcached
中删除一个键值对。
flush_all
删除Memcached
中所有键值对(谨慎使用)。
incr/decr
给指定key
的value
加上(减去)指定数字,语法为incr key num
,注意此命令只能操作数字类型的value
。
> set age 0 120 2
> 18
> STORED
> incr age 2
> 20
> get age
> VALUE age 0 2
> 20
> END
stats
查看当前Memcached
的状态信息。常用的信息项有:
-
get_hits
:get
命令命中了多少次。 -
get_misses
:get
命令空了多少次。 -
curr_items
:当前Memcached
中的键值对数。 -
total_connections
:Memcached
开启到现在的总连接数。默认最大的连接数为1024。
查看当前Memcached
中所有的key
:
> stats items
> stats cachedump [items_id] 0
三、Python操作Memcached
插件安装:pip install python-memcached
。
建立连接并使用:
import memcache
# 连接之前确保Memcached已经启动,可以连接多台机器上的Memcached服务,
# 连接多台机器时,存储数据时会将数据存储到其中一台中,达到分布式的效果。
# debug参数设置为True表示会将错误信息打印到控制台
mc = memcache.Client(["127.0.0.1:11211"], debug=True)
# 相当于set命令,Python中不用指定字符长度
mc.set("name", "hello", 60)
# 可以一次设置多个值
mc.set_multi({"username": "zhangsan", "age": "30", "weight": "120"}, 60)
# 相当于get命令
name = mc.get("name")
print(name)
# 相当于delete命令
mc.delete("name")
# 可以一次删除多个值
mc.delete_multi(["username", "age"])
# 自增长,默认自增长1
mc.incr("weight", 10)
# 自减少,默认自减少1
mc.decr("weight", 10)
四、Django中使用Memcached
想要在Django中使用Memcached
,既可以使用纯Python的方式来操作,也可以将Memcached
配置为默认的缓存系统,在settings.py
中按如下示例配置CACHES
:
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.memcached.MemcachedCache",
"LOCATION": "127.0.0.1:11211" # 如果是连接多台机器,那这里可以配置为一个列表
}
}
配置好后,使用from django.core.cache import cache
导入即可,这个cache
对象可以直接使用,不需要我们去手动连接。
from django.core.cache import cache
cache.set("name", "zhangsan", 60)
# 需要注意的是Django中会对存入的key使用特定的规则进行重命名,但在获取时仍然需要使用原来的key
# 对于此处的代码,真正存储的key并不是“name”,但获取时仍然需要使用“name”
print(cache.get("name"))
五、Memcached安全
因为只需要ip和端口号就可以连接到Memcached
,所以使用Memcached
需要注意下安全防护,通常有两种方式来解决这个问题,一种是使用-l
参数指定只有本机才能连接,另一种是在防火墙中关闭该服务开启的端口访问,一般禁止掉默认的11211
端口即可。