PHP内核学习:PHP中的HashTable(一)

本文只讲了哈希表的基础概念等,尚未涉及PHP中哈希表的实现。
不想看,请略过

0x01 前言

HashTable(哈希表)对于PHP来说是一种非常重要的数据结构,PHP的变量、数组、类的属性和方法等都是通过哈希表来实现的。众所周知,PHP7的性能优化也是花了大力气来优化哈希表的实现方式。

相关内容参考鸟哥的PPT

本篇文章开始将陆续的分享关于哈希表和PHP中具体的应用实现。

0x02 关于HashTable(哈希表)

什么是哈希表?哈希表是一种通过哈希函数,将特定的键映射到特定值的一种数据结构,它维护键和值之间一一对应关系。

在数据结构相关书籍中大家可能见过一个词“散列表”,这里所说的散列表就是哈希表。哈希表是将键名Key用哈希函数计算后映射到表中的一个位置,实现直接定位到数据位置,提高访问速度。

理想情况下,哈希表的时间复杂度是O(1),数据项可以在哈希表长度无关的情况下,通过哈希函数hash(key)出一个值,然后在固定时间内定位到一个槽(bucket,表示哈希表中一个位置),时间主要消耗在哈希函数的计算和槽的定位上。

阅读全文 >>


php-memcache扩展分析(四) 验证缓存节点分布情况&总结

php-memcache配置环境

memcache support => enabled
Version => 3.0.8
Revision => $Revision: 329835 $
Directive => Local Value => Master Value
memcache.allow_failover => 1 => 1
memcache.chunk_size => 32768 => 32768
memcache.compress_threshold => 20000 => 20000
memcache.default_port => 11211 => 11211
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => consistent => consistent
memcache.lock_timeout => 15 => 15
memcache.max_failover_attempts => 20 => 20
memcache.protocol => ascii => ascii
memcache.redundancy => 1 => 1
memcache.session_redundancy => 2 => 2

php-memcache扩展版本:基于3.0.8 beta的修改版本: 链接

阅读全文 >>


php-memcache扩展分析(三)一致性哈希分布实现

搬运自之前留在oschina上的文章

首先明确:

Memcache::addServer()增加一个服务器到连接池中。通过Memcache::addServer()
打开的连接将会在脚本执行结束后自动关闭,也可以使用Memcache::close()进行手动关闭。
您也可以使用memcache_add_server()来添加服务器。
当使用这个方法的时候(与Memcache::connect()和Memcache::pconnect()相反)
网络连接并不会立刻建立,而是直到真正使用的时候才建立。 因此在加入大量服务器到连接池中时也是没有开销的,因为它们可能并不会被使用。

所以在看到服务器节点在圆环上的分布情况,需要先add一个缓存。

阅读全文 >>


php-memcache扩展分析(二) 一致性哈希初阶

搬运自之前留在oschina上的文章

memcached不能算是分布式缓存系统,因为每个缓存节点之间是相互不可感知的,要实现分布式缓存需要借助客户端实现,而实现分布式缓存的关键在于katama算法。

###一致性哈希
一致性哈希,即katama算法。其中几个关键点是:

  1. 虚节点
  2. 0 ~ 2^32-1 的圆环
  3. 顺时针查找服务器
  4. hash(key)超过2^32-1 则缓存在第一台服务器

阅读全文 >>


php-memcache扩展分析(一)

把之前在oschina上的博客搬运过来

version 0.1 发布
version 0.2 更新了关于二进制的描述,测试了下二进制支持,貌似扩展有bug,待验证。

什么是memcached

通常来说,我所指的是memcached服务端程序
memcached是一套缓存系统,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用。这是一套开放源代码软件,以BSD license授权协议发布。

注意:memcached不能算是分布式缓存系统,因为每个缓存节点之间是相互不可感知的,要实现分布式缓存需要借助客户端实现,而实现分布式缓存的关键在于katama算法。

memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。

目前暂时略过memcached服务端的问题,主要来谈下php关于memcached服务器的扩展相关问题(即客户端)。

阅读全文 >>