在很多时候,一台memcached server中的数据,需要被不同语言的客户端访问。
在理想的情况下,一种语言写,其他语言读可能不会造成一些兼容的问题。
日前遇到了java和php共享数据的问题,php写入的时候,java可以读取;java写入的,php读取时候数据解析有误。
分析memcached中的数据:
telnet memcache-srv1 11211
get key[enter]
发现php写入,和java写入的数据存在一点差异。
php:VALUE key 1 250
java:VALUE key 0 250
大家发现了吧,就是一个状态位不一致导致。在java中,这个状态为用于压缩等其他标识,而在php中,用于作为判断php的对象(比如:array等)。
检查php代码,发现它是直接把array对象,传给php memcached 函数,由其进行序列化,以及加入标识,在读取的时候,其直接反馈相应的php对象。
Java代码
set:
$out = array();
$out['field1'] = "me";
$mc->set($key, $out, NULL, 12 * 3600);
get:
$out=$mc->get($key);
echo $out['field1'];
set:
$out = array();
$out['field1'] = "me";
$mc->set($key, $out, NULL, 12 * 3600);
get:
$out=$mc->get($key);
echo $out['field1'];
解决方案:
使用传给php memcached客户端的时候,先序列化好。取的时候,在反序列化一次。
Java代码
set:
$out = array();
$out['field1'] = "me";
$mc->set($key, serilized($out), NULL, 12 * 3600);
get:
$out=$mc->get($key);
echo unserilized($out)['field1'];
set:
$out = array();
$out['field1'] = "me";
$mc->set($key, serilized($out), NULL, 12 * 3600);
get:
$out=$mc->get($key);
echo unserilized($out)['field1'];
或者,修改java的memcacheClient源代码,不建议。
分享到:
相关推荐
**基于内存的K-V数据平台——Memcached** Memcached是一款高性能、分布式内存对象缓存系统,主要用于加速动态Web应用,通过将数据存储在内存中,减少数据库的访问次数,从而提高应用性能。它是一个轻量级的服务,...
4. **客户端库**:选择合适的编程语言(如PHP、Python、Java等)的客户端库,连接到Memcached服务器。 5. **测试和优化**:通过测试确保缓存工作正常,监控内存使用情况,根据需要调整配置。 总的来说,Memcached ...
- 许多编程语言(如PHP、Python、Java、Ruby等)都有客户端库支持Memcached,方便进行数据存取操作。 - 可以通过负载均衡器与其他Memcached实例结合,构建更强大的缓存集群。 总的来说,"memcached-win32-1.4.4-...
2. **分布式**:Memcached支持多台服务器之间的数据共享,可以构建分布式缓存系统,解决单一服务器内存限制问题。 3. **键值对存储**:数据以键值对的形式存储,键是唯一的标识符,值是存储的数据。 4. **短暂性**...
3. **多主机支持**:Memcached支持多主机之间的数据共享,允许多个用户同时访问同一个缓存系统,从而解决了共享内存仅限于单机的问题。 4. **LRU算法**:Memcached使用LRU(Least Recently Used)算法来管理缓存中的...
它采用简单的文本协议,支持多种编程语言,如PHP、Python、Ruby、Java等。通过在内存中缓存常用数据,Memcached显著减少了数据库的读取次数,提高了响应速度。 2. **Memcached的工作原理** - **分布式缓存**:...
3. **简单易用**:Memcached具有简单的API,可轻松集成到各种编程语言中,如PHP、Python、Java等。 4. **内存管理**:使用 slab allocation 算法进行内存管理,避免了内存碎片问题。 5. **数据持久化**:虽然默认不...
- 许多编程语言如PHP、Python、Java、Ruby等都有官方或第三方的客户端库,方便与Memcached交互。 - 开发者可以利用源码学习如何实现一个简单的分布式缓存系统,也可以在此基础上开发更复杂的缓存解决方案。 6. **...
Memcached,作为一个广泛使用的开源、高性能、分布式的内存对象缓存系统,其设计目的是为了提高动态Web应用的响应速度,通过将数据存储在内存中,减少对数据库的频繁访问,从而降低了系统的延迟和数据库的负载。...
- Memcached 通过在网络中的多台服务器之间分布数据,解决了这个问题,提供了更为广泛和高效的缓存解决方案。 #### 六、安装与配置 1. **安装 libevent:** - Memcached 使用 libevent 来处理事件和异步操作。 ...
Memcached是一种高性能、分布式内存对象缓存系统,用于在分布式环境中快速存储和检索数据,以减轻数据库的负载。客户端包`memcached-1.4.12.tar.gz`是为开发者提供的工具,允许他们与memcached服务器进行交互,实现...
标题提到的"memcached server"指的是这个服务端程序,用于在多台服务器之间共享数据,通过缓存常用数据来提升整体性能。版本1.2.6是其历史的一个稳定版本,尽管现在已经有了更新的版本,但这个版本依然具有一定的...
1. **客户端库**:memcached支持多种编程语言的客户端库,如Python的`pylibmc`,PHP的`memcache`或`memcached`扩展,Java的`spymemcached`等。 2. **缓存操作**:通过简单的命令(如`set`、`get`、`delete`)进行...
- **memcached不互相通信的分布式**:每个memcached实例都是独立的,它们之间不共享数据,也不互相通信。这使得系统具有良好的扩展性和容错能力。 **1.3 安装memcached** - **memcached的安装**:通常通过包管理器...
在Java环境下,可以通过多种客户端库与之交互,如java_memcached-release和alisoft-xplatform-asf-cache,结合Spring AOP可以轻松实现数据缓存,提高应用的响应速度和性能。然而,正确评估应用场景并理解其适用性和...
- **Session共享**:在分布式环境中,可以使用Memcached共享用户session,避免session数据在服务器之间同步的问题。 **6. 与其他缓存系统的对比** Memcached专注于简单、高速的键值存储,而Redis则提供了更丰富的...
1. **客户端库**:许多编程语言如Python、PHP、Java等都有官方或第三方提供的客户端库,方便与Memcached进行交互。 2. **操作命令**:基本的操作包括 `set`(设置键值对)、`get`(获取键值对)、`delete`(删除键值...
此外,由于 Memcached 是无状态的,所以它不负责数据的同步,如果多个服务器共享数据,需要在应用层面处理一致性问题。 总结一下,Memcached 是一个轻量级、高性能的分布式缓存系统,适用于高并发的 Web 应用场景。...
分布式缓存是现代Web服务中常见的一种技术,用于在多台服务器之间共享数据,减少对后端数据库的直接访问,提高响应速度和系统吞吐量。Memcached以其简单的设计、快速的性能和广泛的语言支持而备受青睐。 **...