本质就是一个大的哈希表。key最大长度是255个字符。
内存模型:Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk)最大1MB,但同一个分区里:块的长度(bytes)是固定的。插入数据时通过一致性哈希算法查找适合自己长度的块,然后插入,会有内存浪费。
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used[最近最少使用算法])算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
3)惰性删除:
它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃。
4)集群搭建原理:
Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程序实现了集群配置。
客户端实现集群的原理:首先客户端配置多台集群机器的ip和端口的列表。然后客户端驱动程序在写入之前,首先对key做哈希处理得到哈希值后对总的机器的个数进行取余然后就选择余数对应的机器。
5)基于客户端的分布式
6) 基于libevent的事件处理(这就是Memcached为什么这么吊的原因)
libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris 等操作系统的的事件处理。Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。
还记得上面提到的问题吗?如何把用户的状态信息保存起来,共享给这三台服务器?下面通过代码,给大家介绍ASP.Net MVC 4中如何使用Memcached,开始吧!
项目结构:
项目中需要引用Memcached的dll,如下:
1、首先准备好工具类:
MemcacheHelper:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using Memcached.ClientLibrary; WebDemo.Models 8 { MemcacheHelper 10 { MemcachedClient mc; MemcacheHelper() 14 { String[] serverlist = { }; SockIOPool pool = SockIOPool.GetInstance(); pool.SetServers(serverlist); pool.SetWeights(new int[] { 1 }); 24 pool.Initialize(); mc = new MemcachedClient(); ; mc.EnableCompression = false; 30 31 } 插入值 Set(string key, object value,DateTime expiry){ 40 return mc.Set(key, value, expiry); 41 } 获取值 Get(string key) 48 { 49 return mc.Get(key); 50 } 51 } 52 }
View CodeBaseController:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using WebDemo.Models; namespace WebDemo.Controllers { public class BaseController : Controller { UserInfo LoginUser { get; set; } OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); sessionId = Request[]; (string.IsNullOrEmpty(sessionId)) { //return RedirectToAction("Login", "Logon"); Response.Redirect(); } object obj = MemcacheHelper.Get(sessionId); UserInfo user = obj as UserInfo; if (user == null) { Response.Redirect(); } LoginUser = user; //实现session的滑动机制 MemcacheHelper.Set(sessionId, user, DateTime.Now.AddMinutes(20)); } } }
View Code