<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[在Linux的终端下用telnet 查看及设置清空某值，或者某个值的memcache的变量]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 07 Jan 2010 02:33:32 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	memcached的服务器客户端通信并不使用复杂的XML等格式，而使用简单的基于文本行的协议。因此，通过telnet 也能在memcached上保存数据、取得数据。下面是例子。<br/><br/>$ telnet localhost 11211<br/>Trying 127.0.0.1...<br/>Connected to localhost.localdomain (127.0.0.1).<br/>Escape character is &#039;^]&#039;.<br/>set foo 0 0 3&nbsp;&nbsp;&nbsp;&nbsp; （保存命令）<br/>bar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （数据）<br/>STORED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（结果）<br/>get foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （取得命令）<br/>VALUE foo 0 3&nbsp;&nbsp;&nbsp;&nbsp; （数据）<br/>bar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （数据）<br/><br/>delete foo<br/><br/>DELETED<br/><br/><br/><div class="code"><br/>Tencent:~ # telnet 172.24.18.5* 11211&nbsp;&nbsp; <br/>Trying 172.24.18.56...<br/>Connected to 172.24.18.56.<br/>Escape character is &#039;^&#93;&#039;.<br/>set foo 0 0 3<br/>bar<br/>STORED<br/>get foo <br/>VALUE foo 0 3<br/>bar<br/>END<br/>delete foo<br/>DELETED</div><br/><br/>清空全部Memcached的变量，shell下的Telnet操作如下：<br/>[/usr/local/apache2/*/vhost.d]# telnet 172.25.*.70 12000<br/>Trying 172.25.38.70...<br/>Connected to 172.25.38.70.<br/>Escape character is &#039;^]&#039;.<br/>flush_all<br/>OK<br/><br/><br/>另辟蹊径-检查memcached中指定的key是否存在：<br/>们都知道，memcached的协议中是没有任何一个协议提供给我们检查某个key是否存在的。但是我们可能会有这样的需求。<br/>&nbsp;&nbsp;&nbsp;&nbsp;一些开源的客户端提供了KeyExists（）这样的方法，但是其实现原理是调用了memcached的get协议，以此来达到判断某个key是否存在的目的：能取到表示这个key存在，取不到则不存在。这样的效率是比较低的，特别是当数据包比较大的情况下。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在不读取memcached的数据的情况下，如何高效的判断某个key是否存在呢？<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;大家都知道memcached的cas（check and set）协议吧，该协议在写memcached时先判断是否有人在你之前更新过数据，如果有更新过，则此次写memcached失败。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;那我们来看一下cas的语法：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;cas key flag exptime bytes version&#92;r&#92;n<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;其中的version是memcached内部维护的一个版本号，是个uint64_t的值，这个值是调用memcached的gets协议获得的，version从1开始，memcached刚启动的时候，节点数为0，从存储第一个节点开始，version不断累加。因此，version是不可能出现0这个情况，这点很重要，是达到我们的目的的一个关键点。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;好了，我们已经知道了cas的用法，根据它的特性可以实现我们检查一个key是否存在的目的，聪明的读者可能已经知道该怎么做了吧。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;比如要检查foo这个key是否存在，可以构造这样的命令<br/><br/>&nbsp;&nbsp; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;cas foo 0 0 1 0&#92;r&#92;n<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这里构造一个字节的数据包，将version字段设置成0，尝试写memcached。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;如果foo已经存在，因为它的version不可能等于0，所以memcached提示EXISTS<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;如果foo不存在，memcached提示NOT_FOUND<br/><br/>------------------------------------------<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;set foo 0 0 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 先写入<br/>&nbsp;&nbsp;&nbsp;&nbsp;bar<br/>&nbsp;&nbsp;&nbsp;&nbsp;STORED<br/>&nbsp;&nbsp;&nbsp;&nbsp;cas foo 0 0 1 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 判断foo是否存在，系统提示EXISTS<br/>&nbsp;&nbsp;&nbsp;&nbsp;a<br/>&nbsp;&nbsp;&nbsp;&nbsp;EXISTS<br/>&nbsp;&nbsp;&nbsp;&nbsp;delete foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 将foo删除<br/>&nbsp;&nbsp;&nbsp;&nbsp;DELETED<br/>&nbsp;&nbsp;&nbsp;&nbsp;cas foo 0 0 1 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 判断foo是否存在，系统提示NOT_FOUND<br/>&nbsp;&nbsp;&nbsp;&nbsp;a<br/>&nbsp;&nbsp;&nbsp;&nbsp;NOT_FOUND<br/><br/>------------------------------------------<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这样，我们就知道foo这个key是否存在了。<br/><br/><br/>----------------------------------------------引用-------------------------------------------------<br/><br/>memcached的基本设置：<br/><br/>-p 监听的端口<br/>-l 连接的IP地址, 默认是本机<br/>-d start 启动memcached服务<br/>-d restart 重起memcached服务<br/>-d stop&#124;shutdown 关闭正在运行的memcached服务<br/>-d install 安装memcached服务<br/>-d uninstall 卸载memcached服务<br/>-u 以的身份运行 (仅在以root运行的时候有效)<br/>-m 最大内存使用，单位MB。默认64MB<br/>-M 内存耗尽时返回错误，而不是删除项<br/>-c 最大同时连接数，默认是1024<br/>-f 块大小增长因子，默认是1.25<br/>-n 最小分配空间，key+value+flags默认是48<br/>-h 显示帮助<br/><br/>mixi的设置,单台:<br/><br/>每台memcached服务器仅启动一个memcached进程。分配给memcached的内存为3GB，启动参数如下：<br/><br/>/usr/bin/memcached -p 11211 -u nobody -m 3000 -c 30720<br/>由于使用了x86_64的操作系统，因此能分配2GB以上的内存。32位操作系统中，每个进程最多只能使用2GB内存。也曾经考虑过启动多个分配2GB以下内存的进程，但这样一台服务器上的TCP连接数就会成倍增加，管理上也变得复杂，所以mixi就统一使用了64位操作系统。<br/><br/>另外，虽然服务器的内存为4GB，却仅分配了3GB，是因为内存分配量超过这个值，就有可能导致内存交换(swap)。连载的第2次中前坂讲解过了memcached的内存存储“slab allocator”，当时说过，memcached启动时指定的内存分配量是memcached用于保存数据的量，没有包括“slab allocator”本身占用的内存、以及为了保存数据而设置的管理空间。因此，memcached进程的实际内存分配量要比指定的容量要大，这一点应当注意。<br/><br/>mixi保存在memcached中的数据大部分都比较小。这样，进程的大小要比指定的容量大很多。因此，我们反复改变内存分配量进行验证，确认了3GB的大小不会引发swap，这就是现在应用的数值。<br/><br/><br/>
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 在Linux的终端下用telnet 查看及设置清空某值，或者某个值的memcache的变量]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>