Memcached

简介

  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的区别
  1. redis支持数据的持久化,有一部分数据可以存储在硬盘中,重启的时候可以再次加载使用。memcached是纯内存存储,重启会丢失所有的数据,不支持灾难恢复。
  2. redis支持master-slave的主从数据备份。
  3. redis支持多种数据存储格式,包括string、list、set、zset、hash等,memecached仅支持string。
  4. memcached可以存储图片和视频。
  5. redis最大内存可达到1G,memcached最大支持1M。
  6. memcached是多线程、非阻塞IO复用模型,redis是单线程的IO复用模型。
  7. redis被memcached快很多。

  如果涉及到很复杂的数据结构、存储或者排序等的需求,肯定用redis。如果只是存储简单的k-v结构,用memcached,它也足够可靠。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值