PHP 和 Python 基于 UDP 协议操作 memcached

栏目: Python · 发布时间: 5年前

内容简介:在写完首先 memcached 支持 TCP 和 UDP 协议,至于两者的差别不是本文的重点,本文主要讲解如何在 PHP 和 Python 中以 UDP 协议的方式操作 memcached。由于出现过 memcached UDP 反射攻击,所以很多 linux 发行版默认启动的是关闭 UDP 端口的,如果你想开启,可以执行下列命令:

在写完 《使用 Memcached 实现抽奖活动》 这篇文章后,我重新燃起了对 memcached 的兴趣,在新浪博客的时候,我们很早就使用了 memcached,但由于大部分服务使用了 squid 缓存,所以 memcached 没有大规模使用,十年过去了,我对 memcached 的认知也越来越肤浅了,乘着这次机会,我重新看了一遍 memcached 官方 wiki,打算写几篇文章回顾下,今天聊第一个话题,那就是如何基于 UDP 协议操作 memcached。

首先 memcached 支持 TCP 和 UDP 协议,至于两者的差别不是本文的重点,本文主要讲解如何在 PHPPython 中以 UDP 协议的方式操作 memcached。

memcached 服务如何开启 UDP

由于出现过 memcached UDP 反射攻击,所以很多 linux 发行版默认启动的是关闭 UDP 端口的,如果你想开启,可以执行下列命令:

$ memcached -m 64 -p 11212 -U 11211 -u memcache -l 127.0.0.1

-U 参数表示指定 UDP 端口,如果 -U 参数的值为0 表示关闭 UDP 端口。

一旦执行上列命令,表示 memcached 服务器端同时监听 11211 的 UDP 和 TCP 端口,通过下列命令可看出:

$ netstat -an | grep 11211
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN     
udp 0 0 127.0.0.1:11211 0.0.0.0:*

命令行 UDP 连接 memcached

在 Linux 中,telnet 只能运行于 TCP 模式,所以为了演示,只能采用 nc 命令行。UDP 操作 memcached,在操作数据的时候必须增加一个 frame 头,后续的数据格式和 TCP 操作 memcached 一样,查看官方手册:

The frame header is 8 bytes long, as follows (all values are 16-bit integers in network byte order, high byte first):
0-1 Request ID. 2-3 Sequence number. 4-5 Total number of datagrams in this message. 6-7 Reserved for future use; must be 0.

为了说的简单点,可以执行下列命令,以 UDP 协议操作 memcached:

$ printf '\x00\x00\x00\x00\x00\x01\x00\x00stats\r\n' | nc -u 127.0.0.1 11211 
$ printf '\x00\x00\x00\x00\x00\x01\x00\x00set v 0 0 1\r\nx\r\n' | nc -u 127.0.0.1 11211 
$ printf '\x00\x00\x00\x00\x00\x01\x00\x00get v\r\n' | nc -u 127.0.0.1 11211

PHP 以 UDP 协议操作 memcached

php-memcached 扩展也支持 UDP 协议操作 memcached,但并不鼓励,所以官方文档介绍 UDP 操作非常少,我也是查了官方的 Issues 才明白的。另外即使支持,UDP 操作也有限制,比如 set 命令支持 UDP 协议,但 get 命令就不支持,至于原因,大家可以思考下,后续我会简单说一说。

先看代码:

$m_udp = new Memcached();
# 使用 UDP 协议模式
$m_udp->setOption(Memcached::OPT_USE_UDP, true);
# 注意,支持文本模式的协议,而非二进制协议
$m_udp->setOption(Memcached::OPT_BINARY_PROTOCOL, false);

$m_udp->addServer('127.0.0.1', 11211, 1);

echo $m_udp->get('y');
var_dump($m_udp->getResultMessage());

输出 string(20) “ACTION NOT SUPPORTED”,可以看出 php-memcached 扩展做了限制,不允许 UDP 协议操作 get 命令。

$m_udp->set('y',"ok");
var_dump($m_udp->getResultMessage());
$m_tcp =new Memcached();
# 切换为默认的 TCP 连接方式
$m_tcp->addServer('127.0.0.1', 11211, 1);
echo $m_tcp->get("y");

执行完毕,成功输出 ok。

Python 以 UDP 协议操作 memcached

Python 有专门的包基于 UDP 协议操作 memcached,这就是 python-memcached-udp 包,安装后,演示一个例子:

client = memcached_udp.Client([('localhost', 11211)])
client.set('key1', 'value1')
r = client.get('key1')
print (r)

大家可以看看这个包的源代码,非常有意思,可以学到很多 memcached 命令知识。

我的书《深入浅出HTTPS:从原理到实战》代码示例已经放到 github 上,地址是 https://github.com/ywdblog/httpsbook,大家可以一起讨论。

PHP 和 Python 基于 UDP 协议操作 memcached


以上所述就是小编给大家介绍的《PHP 和 Python 基于 UDP 协议操作 memcached》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

一胜九败

一胜九败

柳井正 / 徐静波 / 中信出版社 / 2011-1-19 / 28.00元

优衣库成长的过程,就是一个历经了无数次失败的过程。他们经历过无法从银行融资的焦灼,经历过“衣服因低价热销,但人们买回去之后立即把商标剪掉”的难堪,经历过为上市冲刺而拼命扩张店铺的疯狂,也经历过被消费者冷落、疏离的苦痛……但正是从这些失败中学到的经验与教训,让柳井正走向了成功。 《一胜九败:优衣库风靡全球的秘密》就像是柳井正的错误集,在这里,他毫不隐晦地将公司业绩低迷的原因、进军海外失败的因素......一起来看看 《一胜九败》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具