Memcached

Memcached 是一个高性能的分布式内存对象缓存系统,全世界有不少公司采用这个缓存系统来构建大负载的网站,以分担数据库的压力。Memcached 是通过在内存里维护一张统一的、巨大的 Hash 表来存储各种各样的数据,包括图像、视频、文件以及数据库检索的结果等。简单地说,就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。因为 Memcached 是把数据存储到内存中,并且不具有自动同步数据的功能,所以不建议存储一些非常重要的数据,以免因为机器故障导致数据丢失。Memcached 的存储方式是以键-值对的方式存储。

安装Memcached

Memcached 官方只提供了 Linux 系统的安装包,作为练习,我们可以使用社区版提供的 Windows 版本。这里以 Windows 系统和 Ubuntu 系统为例讲解 Memcached 的安装和基本使用。

Windows系统

因为 Memcached 官方没有提供 Windows 版本,所以只能用社区版,读者可以到 https://www.runoob.com/Memcached/window-install-memcached.html 下载 Windows 版的 Memcached,下载完成后解压可以得到以下文件,如图 8-1 所示。

image 2025 01 21 17 49 40 506
Figure 1. 图8-1 Memcached解压后的文件

在 cmd 命令行终端输入以下命令完成安装和启动。

  • 安装:memcached.exe -d install。

  • 启动:memcached.exe -d start。

Linux系统(Ubuntu)

因为 Memcached 官方是支持 Linux 系统的,所以在 Ubuntu 系统中可以直接使用 apt 命令完成安装。在 Ubuntu 系统中安装和启动的命令如下。

  • 安装:sudo apt install memcached。

  • 启动:/usr/bin/memcached -d start。

在启动 Memcached 时,还可以传递以下参数配置 Memcached 的运行方式。

  • -d:让 Memcached 在后台运行。

  • -m:指定占用多少内存,以 MB 为单位,默认是 64MB。

  • -p:指定运行监听的端口号,默认的端口号是 11211。

  • -l:如设置 -l0.0.0.0,表示允许其他机器通过本机 IP 地址连接到本机的 Memcached,默认只能本机连接。

telnet操作Memcached

Linux 和 Windows 系统都有 telnet 命令,以下命令都是在 Linux 的终端和 Windows 的 cmd 终端中完成的。在 Memcached 启动的前提下,在终端或者 cmd 中,输入 telnet 127.0.0.1 11211,即可进入 Memcached 命令界面。如果要连接其他机器的 Memcached,则把 127.0.0.1 改成目标机器的 IP 地址即可,并且目标机器在运行时,需要通过 -l 参数设置允许其他机器连接的状态。下面对在 Memcached 中使用的命令进行讲解。

set命令

使用 set 命令可以将数据添加到 Memcached 中,如果数据的键在 Memcached 中已存在,则会进行替换,语法如下。

set key zip timeout value_length

参数的说明如下。

  • key:此数据的键。

  • zip:是否压缩数据。

  • timeout:过期时间,单位为 s。

  • value_length:值的长度。

示例命令如下。

$ set username 0 60 7
$ zhiliao

以上命令,我们设置了键为 username 的数据,过期时间为 60s 后,值的总长度为 7。

add命令

add 命令也是用于添加数据,如果数据的键在 Memcached 中已存在,则会添加失败,语法如下。

add key zip timeout value_length

示例命令如下。

$ add username 0 60 7
$ zhiliao

get命令

get 命令用于从 Memcached 中获取数据,如果数据过期,则会获取失败,语法如下。

get key

示例命令如下。

get username

delete命令

delete 命令用于从 Memcached 中删除指定键-值对的数据,语法如下。

delete key

示例命令如下。

$ delete username

flush_all命令

flush_all 命令用于删除 Memcached 中的所有数据。注意:这条命令要谨慎使用,语法如下。

flush_all

stats命令

如果要查看当前 Memcached 的运行状态,如总共存储了多少条数据、总共有多少个连接,则可以通过 stats 命令查看,语法如下,命令执行结果如图8-2 所示。

stats
image 2025 01 21 17 57 38 058
Figure 2. 图8-2 命令执行结果

Python操作Memcached

使用 Python 操作 Memcached 需要先安装 python-memcached,安装命令如下。

pip install python-memcached

安装完 python-memcached 包以后,就可以使用它来连接 Memcached 服务并操作 Memcached 了。下面介绍一下相关操作。

建立连接

建立连接,示例代码如下。

import memcache
mc = memcache.Client(['127.0.0.1:11211'],debug=True)

上述代码中,首先导入了 memcache 模块,然后使用 memcache.Client 类创建了一个对象,并设置了连接到哪个 Memcached 服务器,而且为了更好地看到调试 Memcached 操作代码,设置 debug=True。后续对 Memcached 执行的操作,都是通过 memcache.Client 对象 mc 来实现的。

设置数据

通过 mc.set 可以设置一条数据,通过 mc.set_multi 可以一次性设置多条数据,并且通过 time 参数可以设置过期时间,示例代码如下。

mc.set('username','hello world',time=60*5)
mc.set_multi({'email':'xxx@qq.com','telphone':'111111'},time=60*5)

获取数据

通过 mc.get 方法可以获取指定键的值,示例代码如下。

mc.get("usename")

删除数据

通过 mc.delete 方法可以删除指定键的数据,示例代码如下。

mc.delete("usename")

自增长

通过 mc.incr 可以对整型类型的值进行自增长,每执行一次会把值加 1。如设置在线人数,示例代码如下。

mc.decr("online_count")

Memcached的安全性

Memcached 的操作不需要任何用户名和密码,只需要知道 Memcached 服务器的 IP 地址和端口号即可。因此使用 Memcached 时尤其要注意安全性。这里提供了以下两种安全的解决方案。

  • 使用 -l 参数设置只有本地可以连接:这种方式就只能通过本机连接,其他机器都不能访问,可以达到最好的安全性。

  • 使用防火墙关闭对外的 11211 端口:外网无法访问到本机的 11211 端口,也就无法访问到 Memcached 服务。这里以 Ubuntu 系统为例,设置防火墙相关的命令如下。

    ufw enable        # 开启防火墙
    ufw disable       # 关闭防火墙
    ufw default deny  # 防火墙以禁止的方式打开,默认是关闭那些没有开启的端口
    ufw deny 端口号   # 关闭某个端口
    ufw allow 端口号  # 开启某个端口