Memcached Client的释疑

1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的。与之对应的带d的memcached是建立在libmemcached的基础上,所以相对来说,memcached版本的功能更全一些,目前只有Linux版本 。
memcache:http://cn2.php.net/manual/en/book.memcache.php
memcached:http://cn2.php.net/manual/en/book.memcached.php  下载:https://github.com/php-memcached-dev/php-memcached/
2.memcache是原生实现的,支持OO和非OO两套接口并存。而memcached是使用libmemcached,只支持OO接口。
3.memcached还有个非常称赞的地方,就是flag不是在操作的时候设置了,而是有了一个统一的setOption()。Memcached实现了更多的memcached协议。
4.memcached支持Binary Protocol,而memcache不支持。这意味着memcached会有更高的性能。不过memcached目前还不支持长连接。

不过可以在window下用memcache,linux下用memcached,只要保证他们使用的接口一致就可以了:

Memcached/Memcache::add — 向一个新的key下面增加一个元素
Memcached/Memcache::addServer — 向服务器池中增加一个服务器
Memcached/Memcache::decrement — 减小数值元素的值
Memcached/Memcache::delete — 删除一个元素
Memcached/Memcache::flush — 作废缓存中的所有元素
Memcached/Memcache::get — 检索一个元素
Memcached/Memcache::getStats — 获取服务器池的统计信息
Memcached/Memcache::getVersion — 获取服务器池中所有服务器的版本信息
Memcached/Memcache::increment — 增加数值元素的值
Memcached/Memcache::replace — 替换已存在key下的元素
Memcached/Memcache::set — 存储一个元素

 

一. memcache服务器安全:

Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄 露被其他无关人员查看,重则服务器被入侵,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。 为了安全起见,做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。

现在就关于修改memcache服务器配置的问题说明如下:

1>用内网ip的方式提供web应用服务器调用,不允许直接通过外网调用,如将memcache服务器放在192.168.1.55的服务器上

2>修改端口,如改为11200

3>分配内存,如分配1024M(1G内存)

方法如下:

 

1>开始>运行:CMD(确定)

2>cd C:\memcached(回车)

3>memcached -m 1024 -p 11200 -l 192.168.1.55(回车)

注意,此时命令行不会回到C:\memcached>状态,并且实际上memcache服务器悄悄变为stop状态了。此窗口不可以关闭。新开一个cmd窗口

4>开始>运行:CMD(确定)

5>cd C:\memcached(回车)

6>memcached -d start(回车)可以关闭此cmd窗口。

此时可以使用新配置的memcache服务器了。

 

上述方法虽然解决了修改默认配置的问题,但是始终会有一个cmd窗口不可以关闭,否则就回到11211端口的默认配置。

更好的解决方案是通过修改服务的注册表配置:

1>开始>运行:regedit(回车)

2>在注册表中找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server

3>默认的ImagePath键的值是:"c:\memcached\memcached.exe" -d runservice,改为:"c:\memcached\memcached.exe" -d runservice -m 512 -p  11200 -l 192.168.1.55(确定,关闭注册表)

4>我的电脑(右键)>管理>服务 找到memcache的服务,重新启动一次即可生效。

此时,同网段内的电脑仍然可以利用这台memcache服务器,我们限定指定的web应用服务器才能够使用,通过防火墙的方式。如只允许 192.168.1.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这 个可以根据自己的需要来做。

 

二.PHP中配置 Memcachd Client端

测试代码:

1.<?php  
2.$memcache = new Memcache();  //windows  
3.$memcache->connect('127.0.0.1', 11211 ) or die ( "Could not connect Memcached server!" );    
4.$memcache->set( 'Memcache', "hello Memcache!<br/>");  
5.echo $memcache->get('Memcache');  
6.?>  

 

1.<?php  
2.$memcache = new Memcached();  //linux  
3.$memcache->addServer('127.0.0.1', 11211 ) or die ( "Could not connect Memcached server!" );    
4.$memcache->set( 'Memcached', "hello Memcached!<br/>");  
5.echo $memcache->get('Memcached');  
6.?>  

三.PHP中缓存示例

<?php
$sql = 'SELECT * FROM users';
$mc = new Memcache; 
$mc->pconnect('127.0.0.1', 11211);  
$key = md5($sql);   //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
    //   在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
    echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
    $conn = mysql_connect('localhost', 'test', 'test');
    mysql_select_db('test');
    $result = mysql_query($sql);
     while ($row = mysql_fetch_object($result))
        $datas[] = $row;
    //   将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
    $mc->add($key, $datas);
} else {
     echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);
?>

 

四.安装OCS客户端(linux)

安装MEMCACHED前需要确认是否有zlib-devel包没有需要执行
yum install zlib-devel
请先检测下是否有已安装了memcached客户端包【包含源码包】如有则不需要安装,但需要重新编译增加-enable-memcached-sasl这个扩展
 
wget http://pecl.php.net/get/memcached-2.1.0.tgz
tar zxvf memcached-2.1.0.tgz
cd memcached-2.1.0
phpize(如果系统中有两套PHP环境,需绝对路径调用该命令/usr/bin/phpize,该路径为使用OCS的PHP环境路径)
./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl --with-php-config=(这后面是php-config文件绝对路径)(注意这个参数)
make
make install
最后修改php.ini文件(locate找该文件,如果系统中有两套PHP环境,需找到使用OCS的PHP环境路径,对应修改之),增加extension=memcached.so
memcached.use_sasl = 1

五.解决OCS的密码问题(linux)

OCS使用时必须输入用户名密码的这个比较烦,小弟我又弄了一个patch,解决那个SASL配置的问题,分享给大家试试。应该能解决C++/C Python PHP 等依赖libmemcached作为客户端的Application,不保证能解决所有环境下的问题哈。 
下载在此: https://github.com/ychtiger/libmemcached-OCS  
 
配置:
ALIYUN_OCS_ENABLE 用来标识是否开启OCS功能,如果访问OCS服务,需要设置为true 
ALIYUN_OCS_NAME OCS服务用户名 
ALIYUN_OCS_PASW OCS服务密码 
注意,环境变量一定要设置在你程序启动的用户下, 建议直接在.bashrc中设置
 
主要下面的代码就可以运行了(注释了鉴权函数)
 

<?php
$memc = new Memcached();
$memc->setOption(Memcached::OPT_COMPRESSION, false);
$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memc->addServer("10.232.X.X", 11211);
//$memc->setSaslAuthData("username", "password");//鉴权函数可以取消了
while(1)
{
  $memc->set("key", "get OCS value");
  $result = $memc->get("key");
  var_dump($result);
  sleep(1);
}
?>

转载于:https://www.cnblogs.com/fuland/p/4141009.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Java memcached client的过程中,建立与memcached服务端的socket连接是必不可少的一步。下面简单介绍一下如何建立socket连接。 1. 创建Socket对象 在Java中,我们可以通过创建Socket对象来建立与memcached服务端的连接。代码如下: ```java Socket socket = new Socket("localhost", 11211); ``` 其中,`localhost`表示memcached服务端所在的主机名或IP地址,`11211`表示memcached服务端监听的端口号。 2. 获取输入输出流 连接建立之后,我们需要获取套接字的输入输出流以便进行数据的读写操作。代码如下: ```java InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); ``` 3. 发送请求 建立连接并获取输入输出流之后,我们就可以向memcached服务端发送请求了。在memcached中,请求的格式通常是一个命令字(比如`get`、`set`等)以及相应的参数。代码如下: ```java String command = "get mykey\r\n"; byte[] request = command.getBytes(); outputStream.write(request); ``` 其中,`\r\n`表示回车换行,用来告诉memcached服务端一条命令的结束。 4. 接收响应 发送请求之后,我们需要等待memcached服务端的响应。在Java中,我们可以通过输入流来读取服务端返回的数据。代码如下: ```java byte[] buffer = new byte[1024]; int len = inputStream.read(buffer); if (len > 0) { String response = new String(buffer, 0, len); System.out.println(response); } ``` 其中,`1024`表示读取数据时使用的缓冲区大小,`len`表示实际读取的数据长度,`response`表示服务端返回的字符串。 5. 关闭连接 最后,我们需要在使用完套接字之后关闭它以释放资源。代码如下: ```java socket.close(); ``` 完整示例代码如下: ```java import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class MemcachedClientDemo { public static void main(String[] args) throws Exception { Socket socket = new Socket("localhost", 11211); InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); String command = "get mykey\r\n"; byte[] request = command.getBytes(); outputStream.write(request); byte[] buffer = new byte[1024]; int len = inputStream.read(buffer); if (len > 0) { String response = new String(buffer, 0, len); System.out.println(response); } socket.close(); } } ``` 以上就是如何在Java中建立与memcached服务端的socket连接的简单介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值