一、从单机到分布式
走向分布式第一步就是解决:多台机器共享登录信息的问题。
•例如:现在有三台机器组成了一个Web的应用集群,其中一台机器用户登录,然后其他另外两台机器共享登录状态?
•解决1:AspNet 进程外的Session。
•解决2:用数据库存储当前登录状态。
•解决3:Memcache (性能最好,类似的:Redis,NoSql)
二、为什么要使用Memcached?
•高并发访问数据库的痛楚:死锁!
•磁盘IO之痛:
•多客户端共享缓存
•Net + Memory >> IO
•读写性能完美 1s:读取可以1w次。 写:10w
•超简单集群搭建 Cluster
•开源 Open Source
•没有提供主从赋值功能,也没提供容灾等功能,单纯解决性能问题。(Redis有容灾功能,将内存数据备份到磁盘上)
•学习成本非常低,入门非常容易
•丰富的成功的案例
三、Memcached基础原理:
•位置:放在服务器端,通过Socket方式进行通信。
•数据:键值对存储
•内存处理的算法:
•本质就是一个大的哈希表。key最大长度是255个字符。
•内存模型:Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk)大小1MB,但同一个分区里:块的长度(bytes)是固定的。
•插入数据:查找适合自己长度的块,然后插入,会有内存浪费。
•插入数据规则:闲置 > 过期 > 最少访问
•惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃。
•集群搭建原理:Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程序实现了集群配置。
•客户端实现集群的原理:首先客户端配置多台集群机器的ip和端口的列表。然后客户端驱动程序在写入之前,首先对key做哈希处理得到哈希值后对总的机器的个数进行取余然后就选择余数对应的机器。
•数据:键值对存储
•内存处理的算法:
•本质就是一个大的哈希表。key最大长度是255个字符。
•内存模型:Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk)大小1MB,但同一个分区里:块的长度(bytes)是固定的。
•插入数据:查找适合自己长度的块,然后插入,会有内存浪费。
•插入数据规则:闲置 > 过期 > 最少访问
•惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃。
•集群搭建原理:Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程序实现了集群配置。
•客户端实现集群的原理:首先客户端配置多台集群机器的ip和端口的列表。然后客户端驱动程序在写入之前,首先对key做哈希处理得到哈希值后对总的机器的个数进行取余然后就选择余数对应的机器。
其他说明:
key最大255个字符,item内存块最大1MB,当然key/item最好都别太大,最长过期时间是30天 Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk),但同一个分区里:块的长度(bytes)是固定的。 将记录从Memcache删除后,已经分配的内存(即Chunk),也不会被释放,而是会重复利用,这样就彻底解决了内存碎片的问题 Memcache采用“惰性”方式来应对记录的超期问题 一致性哈希处理: http://www.cnblogs.com/lanceyan/archive/2013/05/13/3075044.html 解决多线程问题: 3. CAS的基本原理 Memcached于1.2.4版本新增CAS协议,类同于Java并发包中CAS(Compare and Set)原子操作,用来处理同一item被多个线程更改过程的并发问题. 基本原理非常简单,简而言之就是”版本号”.每个存储的数据对象都有一个版本号.在Memcached中,每个key关联有一个64bit长度的long型唯一数值,表示该key对应value的版本号. 这个数值由Memcached产生,从1开始,且同一Memcached不会重复,在两种情况下这个版本数值会加,即新增与更新,而删除item版本值不会减小. 我们可以从下面的例子来理解: 如果不采用CAS,则有如下的情景: 第一步,A取出数据对象X; 第二步,B取出数据对象X; 第三步,B修改数据对象X,并将其放入缓存; 第四步,A修改数据对象X,并将其放入缓存。 我们可以发现,第四步中会产生数据写入冲突。 如果采用CAS协议,则是如下的情景。 第一步,A取出数据对象X,并获取到CAS-ID1; 第二步,B取出数据对象X,并获取到CAS-ID2; 第三步,B修改数据对象X,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“一致”,就将修改后的带有CAS-ID2的X写入到缓存。 第四步,A修改数据对象Y,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“不一致”,则拒绝写入,返回存储失败。