- 浏览: 386313 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
zjx20:
...
非阻塞(nonblock)socket接口会否出现EINTR错误 -
mrfeng:
Digest 方式呢?
构建RESTful Web Service - 验证的实现和使用(HTTP 基本认证) -
lck140:
lck140 写道我照着楼主的方法试了一天了,根本就不行。是不 ...
nginx 预压缩(gzip)静态文件 -
lck140:
我照着楼主的方法试了一天了,根本就不行。是不是有哪没弄好,请高 ...
nginx 预压缩(gzip)静态文件 -
iwlk:
chrome 是支持gzip的, 只是添加了sdch~ 大家 ...
nginx 预压缩(gzip)静态文件
Tokyo Tyrant使用memcached协议连接,但是用php的memcached客户端读取时并没有自动反序列化(unserialize)和解压(gzuncompress)。
一、重写get方法,加上反序列化
缺点:性能不如修改源代码,没解决压缩问题
反序列号比较容易解决,直接对所有值都执行unserialize就可以了,如果解析失败会返回false。
但是解压就麻烦了,我发现值达到一定的长度才会压缩,但是不知道压缩后怎么判断是否压缩了,试着看源码了。看了好久,没找到。 功力有限啊,但是和mmc_request_parse_value这个函数有关。
值得注意的是,当值长度大于memcache.compress_threshold,php memcached客户端会自动压缩,默认是20k
FYI:我解决序列化问题的方法。。。使用压缩会抛出个异常。。
2009-2-16新加
压缩和序列化都解决的代码,值得注意的是,要把memcache.compress_threshold的值调高,不然php memcached客户端会帮你自动压缩。
缺点:虽然解决了问题,但是要设置memcache.compress_threshold,这将导致整个memcache客户端都不自动压缩。
解决方法:1.使用ini_set动态设置,2.Tyrant使用memcache客户端,非Tyrant服务器使用memcached客户端。请参见,http://willko.iteye.com/blog/332993
二、修改c源代码
缺点:版本升级带来困难。并且只解决反序列化的问题,压缩没解决
具体请见:http://syre.blogbus.com/logs/29771714.html
三、使用其它客户端
有个日本人用php写了个客户端,使用socket连接Tyrant,自己封装数据
代码地址:http://openpear.org/repository/Net_TokyoTyrant/trunk
作者介绍:http://blog.livedoor.jp/kistame228/archives/51433029.html
四、PHP Tyrant
这个可以说是目前比较完美的解决方案了,解决压缩、序列化以及支持tt的检索功能
http://mamasam.indefero.net/p/tyrant/
四、pecl客户端
特大好消息,pecl已经有tt的客户端了。http://www.php.net/manual/en/book.tokyo-tyrant.php
java 的好像也不能饭序列化。需要改哪个类?
抱歉,不懂Java。。
我有发邮件跟作者联系过。作者标识1、不会考虑增加那个flag字段的保存,所以不会支持php的自动反序列化和解压2、ttserver最近支持了table database的支持。不过也同样不会支持memcache client。也就是说无法用php的memcache client来保存table类型的数据到ttserver上。所以:1、不要等作者来帮解决了,自己想办法吧。2、如果能根据ttserver的c api写一个php扩展就好了,什么问题都没有了。不过我不会C。哈哈。等待各位牛人来做吧。
这个序列化还好解决,关键是压缩啊。
解决压缩的方法,把memcache.compress_threshold的值调高,不让客户端自动压缩,然后我们可以用php决定压不压缩,保存和读取统一
不过,我觉得既然作者放弃我们,那我们只能放弃作者了。
我已经转向memcachedb了。
虽然bdb的性能不如Tokyo Cabinet。。。
其实这个问题不能说是任何一方的问题。在php客户端解决也许更好一点。因为memcached接口只是Tokyo Tyrant的几个接口之一,而背后的Tokyo Cabinet只能放键值对为了一致性,忽略掉flag也是可以理解的。对php客户端来说,标量不序列化也许是为了便于和其他语言交互吧。
谢谢大哥回复。
我觉得既然Tyrant支持memcached协议,那必须要兼容支持
memcached协议的命令格式为
<command name> <key> <flags> <exptime> <bytes>\r\n
flags是任意16位无符号整形,给客户端保存自己的信息。
所以,Tyrant没支持这个是因为没兼容好memcached协议
一、重写get方法,加上反序列化
缺点:性能不如修改源代码,没解决压缩问题
反序列号比较容易解决,直接对所有值都执行unserialize就可以了,如果解析失败会返回false。
但是解压就麻烦了,我发现值达到一定的长度才会压缩,但是不知道压缩后怎么判断是否压缩了,试着看源码了。看了好久,没找到。 功力有限啊,但是和mmc_request_parse_value这个函数有关。
值得注意的是,当值长度大于memcache.compress_threshold,php memcached客户端会自动压缩,默认是20k
FYI:我解决序列化问题的方法。。。使用压缩会抛出个异常。。
// +----------------------------------------------------------------------+ // | Willko Framework | // +----------------------------------------------------------------------+ // | Copyright (c) 2008-2009 Willko Cheng | // +----------------------------------------------------------------------+ // | Authors: Willko Cheng <willko@foxmail.com> | // +----------------------------------------------------------------------+ class lib_TokyoTyrant extends Memcache { public function get($key, $flags = null) { if (isset($flags)) { throw new Exception('Sorry, Do not support compression.'); } $result = parent::get($key, $flags); if (is_array($result)) { foreach ($result as $key => $val) { $tmp = unserialize($val); $result[$key] = $tmp === false && $val != 'b:0;' ? $result[$key] : $tmp; } } else { $tmp = unserialize($result); $result = $tmp === false && $result != 'b:0;' ? $result : $tmp; } return $result; } }
2009-2-16新加
压缩和序列化都解决的代码,值得注意的是,要把memcache.compress_threshold的值调高,不然php memcached客户端会帮你自动压缩。
缺点:虽然解决了问题,但是要设置memcache.compress_threshold,这将导致整个memcache客户端都不自动压缩。
解决方法:1.使用ini_set动态设置,2.Tyrant使用memcache客户端,非Tyrant服务器使用memcached客户端。请参见,http://willko.iteye.com/blog/332993
<?php // +----------------------------------------------------------------------+ // | Willko Framework | // +----------------------------------------------------------------------+ // | Copyright (c) 2008-2009 Willko Cheng | // | Authors: Willko Cheng <willko@foxmail.com> | // +----------------------------------------------------------------------+ // | Input Date: 2009-02-14 | // | Last Modified: 2009-02-16 | // +----------------------------------------------------------------------+ // ini_set('memcache.compress_threshold', 2147483647); class lib_TokyoTyrant extends Memcache { public function add($key, $value) { return parent::add($key, gzcompress(serialize($value))); } public function replace($key, $value) { return parent::replace($key, gzcompress(serialize($value))); } public function set($key, $value) { return parent::set($key, gzcompress(serialize($value))); } public function get($key) { $result = parent::get($key); if (is_array($result)) { foreach ($result as $key => $val) { $result[$key] = $val === false ? false : unserialize(gzuncompress($val)); } } elseif ($result !== false) { $result = unserialize(gzuncompress($result)); } return $result; } }
二、修改c源代码
缺点:版本升级带来困难。并且只解决反序列化的问题,压缩没解决
具体请见:http://syre.blogbus.com/logs/29771714.html
三、使用其它客户端
有个日本人用php写了个客户端,使用socket连接Tyrant,自己封装数据
代码地址:http://openpear.org/repository/Net_TokyoTyrant/trunk
作者介绍:http://blog.livedoor.jp/kistame228/archives/51433029.html
四、PHP Tyrant
这个可以说是目前比较完美的解决方案了,解决压缩、序列化以及支持tt的检索功能
http://mamasam.indefero.net/p/tyrant/
四、pecl客户端
特大好消息,pecl已经有tt的客户端了。http://www.php.net/manual/en/book.tokyo-tyrant.php
评论
7 楼
willko
2009-02-26
chen4059 写道
java 的好像也不能饭序列化。需要改哪个类?
抱歉,不懂Java。。
6 楼
chen4059
2009-02-26
java 的好像也不能饭序列化。需要改哪个类?
5 楼
willko
2009-02-16
outrace 写道
我有发邮件跟作者联系过。作者标识1、不会考虑增加那个flag字段的保存,所以不会支持php的自动反序列化和解压2、ttserver最近支持了table database的支持。不过也同样不会支持memcache client。也就是说无法用php的memcache client来保存table类型的数据到ttserver上。所以:1、不要等作者来帮解决了,自己想办法吧。2、如果能根据ttserver的c api写一个php扩展就好了,什么问题都没有了。不过我不会C。哈哈。等待各位牛人来做吧。
这个序列化还好解决,关键是压缩啊。
解决压缩的方法,把memcache.compress_threshold的值调高,不让客户端自动压缩,然后我们可以用php决定压不压缩,保存和读取统一
不过,我觉得既然作者放弃我们,那我们只能放弃作者了。
我已经转向memcachedb了。
虽然bdb的性能不如Tokyo Cabinet。。。
4 楼
outrace
2009-02-16
我有发邮件跟作者联系过。
作者标识
1、不会考虑增加那个flag字段的保存,所以不会支持php的自动反序列化和解压
2、ttserver最近支持了table database的支持。不过也同样不会支持memcache client。也就是说无法用php的memcache client来保存table类型的数据到ttserver上。
所以:
1、不要等作者来帮解决了,自己想办法吧。
2、如果能根据ttserver的c api写一个php扩展就好了,什么问题都没有了。不过我不会C。哈哈。等待各位牛人来做吧。
作者标识
1、不会考虑增加那个flag字段的保存,所以不会支持php的自动反序列化和解压
2、ttserver最近支持了table database的支持。不过也同样不会支持memcache client。也就是说无法用php的memcache client来保存table类型的数据到ttserver上。
所以:
1、不要等作者来帮解决了,自己想办法吧。
2、如果能根据ttserver的c api写一个php扩展就好了,什么问题都没有了。不过我不会C。哈哈。等待各位牛人来做吧。
3 楼
willko
2009-02-15
我明白你意思了,你是说Cabinet只作为存储,是Tyrant提供接口,所以责任不在Tokyo这边,而客户端也只是利用好协议而已,也没责任,说得也对。
不过,我觉得问题始终要解决的,不然php不能使用Tokyo我觉得很可惜。
如果要解决压缩,只能连set、add、replace也重写,手动压缩和解压。
重组数据,用数组封装数据,内置标志位。
例如:
array('data' => 'test', 'flags' => 1);
这样就可以解决问题了,,但是这似乎不是最好的方法。
毕竟严重影响了性能。
不过,我觉得问题始终要解决的,不然php不能使用Tokyo我觉得很可惜。
如果要解决压缩,只能连set、add、replace也重写,手动压缩和解压。
重组数据,用数组封装数据,内置标志位。
例如:
array('data' => 'test', 'flags' => 1);
这样就可以解决问题了,,但是这似乎不是最好的方法。
毕竟严重影响了性能。
2 楼
willko
2009-02-15
syre 写道
其实这个问题不能说是任何一方的问题。在php客户端解决也许更好一点。因为memcached接口只是Tokyo Tyrant的几个接口之一,而背后的Tokyo Cabinet只能放键值对为了一致性,忽略掉flag也是可以理解的。对php客户端来说,标量不序列化也许是为了便于和其他语言交互吧。
谢谢大哥回复。
我觉得既然Tyrant支持memcached协议,那必须要兼容支持
memcached协议的命令格式为
<command name> <key> <flags> <exptime> <bytes>\r\n
flags是任意16位无符号整形,给客户端保存自己的信息。
所以,Tyrant没支持这个是因为没兼容好memcached协议
1 楼
syre
2009-02-15
其实这个问题不能说是任何一方的问题。
在php客户端解决也许更好一点。
因为memcached接口只是Tokyo Tyrant的几个接口之一,而背后的Tokyo Cabinet只能放键值对为了一致性,忽略掉flag也是可以理解的。
对php客户端来说,标量不序列化也许是为了便于和其他语言交互吧。
在php客户端解决也许更好一点。
因为memcached接口只是Tokyo Tyrant的几个接口之一,而背后的Tokyo Cabinet只能放键值对为了一致性,忽略掉flag也是可以理解的。
对php客户端来说,标量不序列化也许是为了便于和其他语言交互吧。
发表评论
-
仅供参考, cURL 二次封装的类库 Curl_Manager
2010-07-03 21:27 8800cURL是一个可以在命令行下发起http请求的工具,phpl有 ... -
PHP实时输出报文到浏览器
2010-06-06 15:09 8039Yahoo的前端优化实践中 ... -
PHP多Web服务器的Session问题
2010-05-11 21:30 0当Web服务器有多台的时候,会遇到一个Session共享不共享 ... -
构建RESTful Web Service - 验证的实现和使用(HTTP 基本认证)
2010-04-07 11:40 15865因为RESTful的无状态特性,导致无法知道当前的请求方是否可 ... -
也谈谈PHP是否需要模板机制?
2010-03-30 19:37 0最近有点时间,重温了一下设计模式,设计模式和OO真令人费解,博 ... -
很好的序列化方式 Igbinary
2009-11-21 19:29 0如果你使用PHP做开发,那有些时候需要序列化PHP数据,不管是 ... -
10进制和64进制相互转换 php版
2009-11-05 11:28 7044使用:表示10以及使用;表示11的原因是根据ascii的排列来 ... -
使用HTML Purifier解决XSS问题
2009-09-23 22:33 12467在php里解决XSS最简单的方法是使用htmlspecialc ... -
php里json_decode无法解析的情况,返回空(null)
2009-08-04 21:08 31503我的版本是5.2.x,php的json解析也太烂了,兼容性太差 ... -
激动人心的 APC 新特性
2009-07-27 23:22 1821来自facebook的大牛在OSCON2009上分享了APC的 ... -
php-fpm配置文件中文文档
2009-06-29 09:30 0配置文件 这个php-fpm.conf文件, 可 ... -
一次查询完成基于“父id"的无限分类
2009-06-25 18:00 3163无限分类谈得太多了,无非三种方法“路径”“左右值”“父id”, ... -
我看php 5.3 的新特性
2009-03-13 23:34 6572从php4到php5,从个人框 ... -
php 实现简单 sso 初步方案
2009-02-24 18:37 4943首先,声明一点,sso和任何语言没有关系,因为我只懂php,为 ... -
feed设计
2009-02-21 23:46 5313对于sns来说,动态就是 ... -
PHP-FPM高负载技巧 (PHP-FPM on highload tips)
2009-02-15 23:18 8488只供参考,英语不好,多多练习。。 这些技巧都比较基本的。。 ... -
FYI:初学php时写的php邮件发送类
2009-02-08 11:28 2470<?php /** * 功能: 发送邮件 ... -
PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
2009-02-08 10:39 8573// +------------------------- ... -
discuz 经典php加密解密函数 authcode 解析
2009-02-08 10:38 11532康盛的 authcode 函数可以说对中国的PHP界作出了重大 ... -
求相对路径的函数
2009-02-08 10:36 2509网上某面试题, 写一个函数,算出两个文件的相对路径 如 $a ...
相关推荐
6. 序列化和反序列化:由于Tokyo Tyrant存储的数据是原始字节,C#客户端可能需要实现数据的序列化和反序列化,以便于C#对象与Tokyo Tyrant之间的数据交换。 7. 错误处理和异常:当服务器响应错误或网络问题发生时,...
2. 数据持久化:即使在程序崩溃或系统故障后,Tokyo Cabinet也能保证数据的完整性,因为它是事务安全的。 3. 小巧轻便:Tokyo Cabinet的库文件小,无需额外依赖,易于集成到项目中。 4. 支持多种数据类型:键和值都...
标题中的“memcached, mongdb, redis, Tokyo Tyrant”都是知名的NoSQL数据库系统,它们在现代互联网应用中被广泛使用。这篇博文很可能是关于如何在操作系统环境下安装和使用这四种数据库的教程。 1. **Memcached**...
Tokyo Tyrant是一款高速缓存数据库,它通过在内存中对数据进行高速读写操作,大幅度减少了磁盘IO的等待时间,提高了系统的整体性能。Tokyo Tyrant适用于大规模数据的读写需求场景,能够快速处理上百万条数据记录的...
3. **持久化机制**:尽管Tokyo Tyrant主要运行在内存中,但它提供了数据持久化策略,通过定期将内存中的数据写入磁盘,确保在系统重启后能够恢复数据。 4. **多种数据类型**:Tokyo Tyrant支持多种数据类型,包括...
总结来说,Tokyo Cabinet和Tokyo Tyrant是针对高并发和大数据量需求的Key-Value数据库解决方案,通过调整参数如MMAP内存大小和bucket数组数量,可以在保持高效性能的同时,适应不断增长的数据规模。对于寻求优化...
8. **分布式扩展**:虽然Tokyo Tyrant本身不直接支持分布式,但可以通过诸如Riak这样的分布式数据库系统,利用Tokyo Tyrant作为底层存储实现扩展。 9. **应用场景**:Tokyo Tyrant常用于缓存系统、日志分析、搜索...
总的来说,Tokyo Cabinet和Tokyo Tyrant是两个强大而高效的数据库解决方案,尤其适用于对性能有高要求但不需要复杂的ACID特性的应用。它们的轻量级设计、简单的API和丰富的功能使其成为许多开发者的选择。
MemAdmin是一款可视化的Memcached管理与监控工具,使用PHP开发,体积... 数组、JSON等序列化字符反序列显示 兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外) 支持服务器连接池,多服务器管理切换方便简洁
宫崎电阻描述: MiyazakiResistance是一个类似于ActiveRecord的库,可以使用Tokyo Tyrant。 宫崎县抵抗支持师傅/奴隶。 如果从服务器关闭,它将自动分离。 宫崎骏电阻支持双主控(主动/待机)。 如果活动服务器关闭...
MemAdmin是一款可视化的Memcached管理与监控工具,基于PHP5 & JQuery...数组、JSON等序列化字符反序列显示 兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外) 支持服务器连接池,多服务器管理切换方便简洁
Tokyo Cabinet 是一个非常著名的键值存储系统,提供了高效、轻量级的数据持久化解决方案。它支持BDB(Berkeley DB)和HDB(Hash DB)两种数据库类型,广泛应用于日志记录、配置管理、缓存服务等多个领域。 Tokyo ...
Tokyo Cabinet具有高性能和多种存储引擎选择,Tokyo Tyrant则通过热备份、update log和异步复制提高可用性,并允许通过Lua脚本进行原子性操作。 3. MongoDB:MongoDB是一个面向文档的数据库,支持无固定规格的JSON...
Memcached以字节块操作缓存对象,需要频繁的序列化和反序列化,而ICE的缓存服务允许按字段级别操作对象,提供更细粒度的控制。 Nginx作为高效的Web服务器,被用作跨IDC请求代理,同时也与Resin(Java Web容器)结合...
面对Tokyo Tyrant的稳定性风险和功能限制,开发团队决定自主研发NoSQL存储解决方案——INetDB。INetDB不仅兼容Memcached协议,支持主从复制和ttserver复制协议,还具备更高的性能和可靠性,在大数据量下表现尤为出色...
Tokyo Cabinet在内存管理和I/O操作上做了大量优化,如缓冲机制、预读取策略等,确保在磁盘操作上也能保持高效。此外,Tokyo Cabinet支持多线程并发访问,可以应对高并发场景。 6. API接口: Tokyo Cabinet提供了...
1. **高并发读写**:在高流量的Web应用中,NoSQL的键值对数据库(如TC/TT中的Tokyo Cabinet和Tokyo Tyrant)能够提供快速的读写性能,适合对数据库进行频繁的读取和更新操作。 2. **海量数据存储和访问**:文档型...
3. **序列化与反序列化**:在使用Java对象存储到Redis时,需要先将对象转换为二进制流(序列化),从Redis取出后还需要将其转换回原对象(反序列化)。常用的序列化工具包括Java自带的序列化机制、JSON、Protobuf等。 #...