memcached大名鼎鼎,数据库有压力时都会请此君来缓解缓解。因常遇到些问题,读些文章,随笔做些记录。整理后,有此文。
memcached是什么?
web应用数据保存在RDBMS中(绝大多数是mysql).从数据库读取数据,随着访问量增大,出现数据库负担很重,反应很慢的问题。memcached就是解决此问题而生。他将数据缓存到内存中,提高读写数据的能力。
memcached有何特点?
两点:第一,分布式;第二, 缓存。
如何理解分布式
memcached是分布式内存缓存服务器,但服务器端是不互相通信的。简而言之,他的分布式取决于客户端的实现。那么,如何解决如下问题,有三台memcached服务器,如何将key=>value类型的数据存放到memcached中?
方法有两种: 余数计算法和圆点计数法(官方名称,一致性算法).
先看余数计算法.先将memcached服务器标号1,2,3.计算key的hash值。然后初以服务器数量3,得到的余数(如2),则将数据放到2上。
此法优点方法简单,易于分散数据。但问题是,如果增加了一台memcached服务器,key的hash值除以的余数就变了,势必要重组整个缓存数据,代价不小。所以,看下圆点解决之道。
圆点法是基于Consistent Hashing的思想。简单的说,先得出memcached服务器的哈希值,配置到一个0-2的32次方的圆上。然后同样计算出key的哈希值,映射到相同的圆上。从映射的位置开始顺时针查找,将数据保存到找到的第一个服务器上。这样在增加新的memcached服务器的时候,可以最大限度的减少键的重组。
php中Consistent Hashing的实现
memcache客户端的实现:
1 | 在php.ini中添加memcache.hash_strategy = consistent |
memcached客户端的实现:
1 | $mc = new Memcached(); |
2 | $mc ->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT); |
3 | $mc ->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true); |
php客户端memcached vs memcache
怎样区别,也没彻底明白。memcached是基于libmemcached库,版本比memcache要新,支持更多的memcached协议,性能应该优于memcache.
memcached的安装
1 | sudo apt-get install memcached |
2 | yum install libevent lievent-devel memcached |
自行编译也可。
memcached的启动
memcached -d -m 1024 -l localhost -p 11711
-p 使用的tcp端口
-m 最大内存使用。默认64M
-d 作为daemon在后台启动
memcached数据操作
1 | $mc = new memcached(); |
2 | $key = 'test' ; |
3 | $mc ->add( $key , 'okok' ); //增加数据 |
4 | $mc ->get( $key ); //获取数据 |
5 | $mc ->replace( $key , 'iii' ); //替换数据 |
6 | $mc -> delete ( $key ); //删除数据 |
7 | $mc ->increment( 'count' ,19); //原子操作 |
8 | ... |
memcached的删除机制LRU
内存总有用完的时候,数据也有过期过满的时候。如何删除数据呢? memcached使用LRU(Least Recently Used).即最近最少使用的记录被删除。所以,当分配的内存不足时候,memcached会将最近不被使用的记录空间分配给新的记录。-M参数可以禁掉此功能。当然,不建议使用。
新闻热点
疑难解答