`
willko
  • 浏览: 387078 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Tokyo Tyrant 在 php 上不能自动反序列化解决方法

    博客分类:
  • php
阅读更多
Tokyo Tyrant使用memcached协议连接,但是用php的memcached客户端读取时并没有自动反序列化(unserialize)和解压(gzuncompress)。

一、重写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
3
0
分享到:
评论
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。哈哈。等待各位牛人来做吧。
3 楼 willko 2009-02-15  
我明白你意思了,你是说Cabinet只作为存储,是Tyrant提供接口,所以责任不在Tokyo这边,而客户端也只是利用好协议而已,也没责任,说得也对。

不过,我觉得问题始终要解决的,不然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客户端来说,标量不序列化也许是为了便于和其他语言交互吧。

相关推荐

    C#版Tokyo Tyrant客户端

    6. 序列化和反序列化:由于Tokyo Tyrant存储的数据是原始字节,C#客户端可能需要实现数据的序列化和反序列化,以便于C#对象与Tokyo Tyrant之间的数据交换。 7. 错误处理和异常:当服务器响应错误或网络问题发生时,...

    tokyo tyrant文档

    Tokyo Tyrant支持故障转移,能够在服务器出现故障时自动切换到备用服务器,保证服务的连续性。 #### 日志文件体积小 由于Tokyo Tyrant的高效存储机制,其产生的日志文件体积相对较小,这有助于减少磁盘空间的占用...

    tokyo cabinet tyrant研究资料

    2. 数据持久化:即使在程序崩溃或系统故障后,Tokyo Cabinet也能保证数据的完整性,因为它是事务安全的。 3. 小巧轻便:Tokyo Cabinet的库文件小,无需额外依赖,易于集成到项目中。 4. 支持多种数据类型:键和值都...

    memcached,mongdb,redis,Tokyo Tyrant的安装和使用

    标题中的“memcached, mongdb, redis, Tokyo Tyrant”都是知名的NoSQL数据库系统,它们在现代互联网应用中被广泛使用。这篇博文很可能是关于如何在操作系统环境下安装和使用这四种数据库的教程。 1. **Memcached**...

    基于Tokyo Tyrant的智能电网数据处理与应用研究.pdf

    Tokyo Tyrant是一款高速缓存数据库,它通过在内存中对数据进行高速读写操作,大幅度减少了磁盘IO的等待时间,提高了系统的整体性能。Tokyo Tyrant适用于大规模数据的读写需求场景,能够快速处理上百万条数据记录的...

    tokyotytrant

    3. **持久化机制**:尽管Tokyo Tyrant主要运行在内存中,但它提供了数据持久化策略,通过定期将内存中的数据写入磁盘,确保在系统重启后能够恢复数据。 4. **多种数据类型**:Tokyo Tyrant支持多种数据类型,包括...

    Tokyo Cabinet Key:Value数据库及其扩展应用

    总结来说,Tokyo Cabinet和Tokyo Tyrant是针对高并发和大数据量需求的Key-Value数据库解决方案,通过调整参数如MMAP内存大小和bucket数组数量,可以在保持高效性能的同时,适应不断增长的数据规模。对于寻求优化...

    TTserver1.1.4

    8. **分布式扩展**:虽然Tokyo Tyrant本身不直接支持分布式,但可以通过诸如Riak这样的分布式数据库系统,利用Tokyo Tyrant作为底层存储实现扩展。 9. **应用场景**:Tokyo Tyrant常用于缓存系统、日志分析、搜索...

    tokyoCabint及tokyoTyrant简介

    总的来说,Tokyo Cabinet和Tokyo Tyrant是两个强大而高效的数据库解决方案,尤其适用于对性能有高要求但不需要复杂的ACID特性的应用。它们的轻量级设计、简单的API和丰富的功能使其成为许多开发者的选择。

    memadmin.zip

    MemAdmin是一款可视化的Memcached管理与监控工具,使用PHP开发,体积... 数组、JSON等序列化字符反序列显示 兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外) 支持服务器连接池,多服务器管理切换方便简洁

    miyazakiresistance:MiyazakiResistance是ActiveRecord之类的库,可以使用Tokyo Tyrant

    宫崎电阻描述: MiyazakiResistance是一个类似于ActiveRecord的库,可以使用Tokyo Tyrant。 宫崎县抵抗支持师傅/奴隶。 如果从服务器关闭,它将自动分离。 宫崎骏电阻支持双主控(主动/待机)。 如果活动服务器关闭...

    MemAdmin v1.0.5

    MemAdmin是一款可视化的Memcached管理与监控工具,基于PHP5 & JQuery...数组、JSON等序列化字符反序列显示 兼容memcache协议的其他服务,如Tokyo Tyrant (遍历功能除外) 支持服务器连接池,多服务器管理切换方便简洁

    ttserver

    Tokyo Cabinet 是一个非常著名的键值存储系统,提供了高效、轻量级的数据持久化解决方案。它支持BDB(Berkeley DB)和HDB(Hash DB)两种数据库类型,广泛应用于日志记录、配置管理、缓存服务等多个领域。 Tokyo ...

    no关系型数据库,nosql

    Tokyo Cabinet具有高性能和多种存储引擎选择,Tokyo Tyrant则通过热备份、update log和异步复制提高可用性,并允许通过Lua脚本进行原子性操作。 3. MongoDB:MongoDB是一个面向文档的数据库,支持无固定规格的JSON...

    人人网使用的开源软件列表.pdf

    Memcached以字节块操作缓存对象,需要频繁的序列化和反序列化,而ICE的缓存服务允许按字段级别操作对象,提供更细粒度的控制。 Nginx作为高效的Web服务器,被用作跨IDC请求代理,同时也与Resin(Java Web容器)结合...

    nosql研发之路

    面对Tokyo Tyrant的稳定性风险和功能限制,开发团队决定自主研发NoSQL存储解决方案——INetDB。INetDB不仅兼容Memcached协议,支持主从复制和ttserver复制协议,还具备更高的性能和可靠性,在大数据量下表现尤为出色...

    tokyocabinet-1.4.47.tar.gz

    Tokyo Cabinet在内存管理和I/O操作上做了大量优化,如缓冲机制、预读取策略等,确保在磁盘操作上也能保持高效。此外,Tokyo Cabinet支持多线程并发访问,可以应对高并发场景。 6. API接口: Tokyo Cabinet提供了...

    NoSQL技术交流.pptxNoSQL技术交流.pptx

    1. **高并发读写**:在高流量的Web应用中,NoSQL的键值对数据库(如TC/TT中的Tokyo Cabinet和Tokyo Tyrant)能够提供快速的读写性能,适合对数据库进行频繁的读取和更新操作。 2. **海量数据存储和访问**:文档型...

    Redis操作基础文档

    3. **序列化与反序列化**:在使用Java对象存储到Redis时,需要先将对象转换为二进制流(序列化),从Redis取出后还需要将其转换回原对象(反序列化)。常用的序列化工具包括Java自带的序列化机制、JSON、Protobuf等。 #...

Global site tag (gtag.js) - Google Analytics