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的注意事项:

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
根据keyMemcached获取对应的value

> get name

add
语法同set命令,如果已存在相同的key则会失败,提示NOT_STORED
delete
根据keyMemcached删除一个键值对。
flush_all
删除Memcached中所有键值对(谨慎使用)。
incr/decr
给指定keyvalue加上(减去)指定数字,语法为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_hitsget命令命中了多少次。
  • get_missesget命令空了多少次。
  • curr_items:当前Memcached中的键值对数。
  • total_connectionsMemcached开启到现在的总连接数。认最大的连接数为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端口即可。

相关文章

1. General Supported Versions 2. Settings STATIC_URL MED...
问题01:Django枚举类型扩展方法(Model.get_FOO_display()) ...
verbose_name 可以作为第一个参数传入,使书写更加工整和有序...
# use_2to3 is invalid
# Django枚举类型扩展方法&a...
一、层次结构 GenericViewSet(ViewSetMixin, generics.Gener...