简介
memcached是一个高性能的内存缓存管理系统,利用k-v结构的hashmap缓存从数据库中查询的结果,当再次查询的时候,就可以不经过数据库,直接从缓存中找到结果,大大提高查询效率,提高动态web应用的响应速度。
内存模型
https://www.cnblogs.com/moyangvip/p/5259700.html
memcached中包含三个概念,slab,chunk,item。一个slab中包含多个chunk,一个chunk中包含多个item。item是实际存储k-v数据的结构。当某一个slab中的内存满了之后,memcached会利用LRU机制,将这个slab中的数据进行替换。LRU机制的实现基于双向链表。
分布式实现
memecached相互之间不能通信,需要借助客户端实现分布式。利用32位循环冗余校验(CRC-32)计算键值后,将资料分配到不同的机器上。memcached在chunk上基于hashmap存储数据。其守护进程由C语言编写,但是客户端可以由任何语言编写,并通过memcached协议与守护进程通信。
余数哈希
所谓余数哈希,就是将数据对服务器台数取余数,算出来是几,就将该结果存储在哪台服务器中。但是一旦集群机器数量发生变化,比如增加节点,或者某台节点宕机了,哈希值发生了变化,就不能再命中缓存,缓存失效就只能查询数据库,这样会数据库的压力变得非常大。这时就需要对所有的数据重新计算哈希值。
一致性哈希
而一致性哈希可以解决这个问题,将服务器的ip对 232 取模,将ip映射到0 ~ 232 - 1的环形区域上。当有数据进来时,同样对该数据用 232 取模,计算出来的结果,在该圆上顺时针旋转,碰到哪台服务器,就属于哪台服务器。
Memcached数据清理
Memcached首先采用惰性删除的方法,就是给数据维护一个时间戳,当该数据失效后并不主动删除,而是发起get请求之后,才删除过期数据。而当所有数据都没有过期,且内存已满的时候,采用LRU(最近最少使用)算法删除内存。
每个slab维护一个队列,最新插入的数据和被重新get的数据都会被移动到队列头部,这样队尾的数据就是比较老的和使用次数比较少的数据。当需要删除数据的时候,从队尾开始,首先检查该数据是否过期,如果过期了,就直接覆盖,如果没有过期数据,就将该节点删除,插入新的数据。这个队列用双向链表实现。
memcached工作流程
首先检查客户端请求数据是否在memcached里,如果存在,直接返回,不对数据库进行任何操作。如果不存在,查询数据库,返回结果,并缓存一份在memcached里。更新数据库的时候,同时更新memcached,保证数据一致性。如果内存满了,就使用到期失效策略和LRU算法,先将失效的数据替换掉,如果没有失效的数据,就利用LRU算法替换掉最近最少使用的数据。
memcached和redis的区别
- redis支持数据的持久化,有一部分数据可以存储在硬盘中,重启的时候可以再次加载使用。memcached是纯内存存储,重启会丢失所有的数据,不支持灾难恢复。
- redis支持master-slave的主从数据备份。
- redis支持多种数据存储格式,包括string、list、set、zset、hash等,memecached仅支持string。
- memcached可以存储图片和视频。
- redis最大内存可达到1G,memcached最大支持1M。
- memcached是多线程、非阻塞IO复用模型,redis是单线程的IO复用模型。
- redis被memcached快很多。
如果涉及到很复杂的数据结构、存储或者排序等的需求,肯定用redis。如果只是存储简单的k-v结构,用memcached,它也足够可靠。
5万+

被折叠的 条评论
为什么被折叠?



