〇、为什么要用分布式缓存

1.软件从单机到分布式

走向分布式第一步就是解决:多台机器共享登录信息的问题。
例如:现在有三台机器组成了一个Web的应用集群,其中一台机器用户登录,然后其他另外两台机器共享登录状态?
解决1:AspNet 进程外的Session。
解决2:用数据库存储当前登录状态。
解决3:Memcache 【性能最好,类似的:Redis,NoSql】

2.Memcache基本原理

Socket 服务器端
数据:键值对存储
内存处理的算法:
本质就是一个大的哈希表。key最大长度是255个字符。
内存模型:Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk)最大1MB,但同一个分区里:块的长度(bytes)是固定的。
插入数据:查找适合自己长度的块,然后插入,会有内存浪费。
LRU,闲置>过期 >最少访问
惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃。
集群搭建原理:
Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程序实现了集群配置。
客户端实现集群的原理:首先客户端配置多台集群机器的ip和端口的列表。然后客户端驱动程序在写入之前,首先对key做哈希处理得到哈希值后对总的机器的个数进行取余然后就选择余数对应的机器。

3.

key最大250个字符,item最大1MB,当然key/item最好都别太大,最长过期时间是30天

Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk),但同一个分区里:块的长度(bytes)是固定的。
将记录从Memcache删除后,已经分配的内存(即Chunk),也不会被释放,而是会重复利用,这样就彻底解决了内存碎片的问题
Memcache采用“惰性”方式来应对记录的超期问题

一致性哈希处理: http://www.cnblogs.com/lanceyan/archive/2013/05/13/3075044.html

解决多线程问题:
4. 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是否一致。结果是“不一致”,则拒绝写入,返回存储失败。

5.

将Memcache.exe安装为Windows服务:Memcache.exe -d install

启动Memcache服务:Memcache.exe -d start

启动Memcache服务(windows命令):net start "Memcache Server"

停止Memcache服务(windows命令):net stop "Memcache Server"

连接到Memcache控制台:telnet ServerIP 11211

打印当前Memcache服务器状态:stats

打印当前Memcache服务器Items(记录)的统计信息:stats items

打印当前Memcache服务器Slab(分区)及Chunk(块)的统计信息:stats slabs

打印指定Slab中的KEY列表(可用于遍历items,但效率较低,慎用!):stats cachedump SlabId Limit_num。显示结果:ITEM KeyName [ValueByteLength b; LastAccessTime s]。值得注意的是,经过测试确认:那个LastAccessTime并不是记录到期时间,而是最后一次的get时间,并且get之后,也不会自动延长expiry(到期时间)。

添加新记录:add KeyName 0 0 ValueByteLength [回车] ValueContent

删除记录 : delete KeyName

添加或更新记录 : set KeyName 0 0 ValueByteLength [回车] ValueContent

更新记录 : replace KeyName 0 0 ValueByteLength [回车] ValueContent

参考:http://www.cnblogs.com/lost-1987/articles/3069460.html

http://wenku.baidu.com/view/e30db586ec3a87c24028c401.html

也可以图形化监控 Memcached 的运行状态

http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/

在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server 下面找到一个 ImagePath 的字符串项,正好是服务的执行路径的字符串,双击该串,在后面加入 -l 192.168.1.135 -m 45 -p 12345 (访问ip为:192.168.1.135 使用45M内存,12345为端口),再启动服务。

6.

一、关于Memcache的介绍及Windows下的简单使用请参考文章  《分布式缓存系统Memcached简介与实践》

二、使用Memcache场景

三、主要示例代码

1.自定义的MemcachedHelper类

using Memcached.ClientLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace LearnMemcached.Helper
{
public static class MemcachedHelper
{
private static MemcachedClient mc; static MemcachedHelper()
{
// 缓存服务器IP列表
String[] serverlist = { "127.0.0.1:11211" }; // initialize the pool for memcache servers
SockIOPool pool = SockIOPool.GetInstance("test");
pool.SetServers(serverlist);
pool.Initialize();
mc = new MemcachedClient();
mc.PoolName = "test";
mc.EnableCompression = false;
} public static bool Set(string key, object value,DateTime expiry)
{
return mc.Set(key, value, expiry);
} public static object Get(string key)
{
return mc.Get(key);
} public static void Delete(string key)
{
mc.Delete(key);
}
}
}

2.BaseController基类

using LearnMemcached.Helper;
using LearnMemcached.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace LearnMemcached.Controllers
{
public class BaseController : Controller
{
public T_Users LoginUser { get; set; } /// <summary>
/// 因为项目中所有的Controller控制器类均继承自BaseController类,所以子控制器类的Action方法在
/// 执行前都会先执行OnActionExecuting方法,该方法的主要作用就是判断用户是否已经登录
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext); // 获取请求参数中的SessionId
string sessionId = Request["SessionId"];
if(string.IsNullOrEmpty(sessionId))
{
Response.Redirect("/Account/Index");
} // 从缓存服务器中根据SessionId获取用户信息
T_Users user = MemcachedHelper.Get(sessionId) as T_Users;
if(user == null)
{
Response.Redirect("/Account/Index");
}
else
{
LoginUser = user;
ViewBag.User = LoginUser;
}
}
}
}

3.AccountController类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LearnMemcached.Models;
using LearnMemcached.Helper;
using LearnMemcached.Models.ViewModel; namespace LearnMemcached.Controllers
{
public class AccountController : Controller
{
// GET: Account
public ActionResult Index()
{
return View();
} public ActionResult Login(LoginUser loginUser)
{
if(!ModelState.IsValid)
{
// 登录失败
return Content("false");
}
WebPortalEntities db = new WebPortalEntities();
T_Users user = db.T_Users.Where(u => u.LoginId.Equals(loginUser.LoginId) && u.Password.Equals(loginUser.Password)).SingleOrDefault();
if(user == null)
{
return Content("false");
}
else
{
// 自定义SessionId的规则
string sessionId = "baidu-IT-DonNet-" + Guid.NewGuid().ToString();
// 把SessionId保存到客户端浏览器中,客户端下次请求的时候会自动带上该参数
Response.Cookies["SessionId"].Value = sessionId;
// 把SessionId和user对象以key-value键值对的形式保存在缓存服务器中
MemcachedHelper.Set(sessionId, user, DateTime.Now.AddMinutes());
return Content("true");
}
} [HttpPost]
public ActionResult LogOff()
{
MemcachedHelper.Delete(Request["SessionId"]);
return RedirectToAction("Index");
}
}
}

下载示例代码

分布式缓存之Memcache的更多相关文章

  1. 分布式缓存之 memcache 实现分布式缓存

    最近想搞点分布式,但是不知道整点什么,来点简单的吧. 今天讲下memcache的分布式缓存 首先下载memcache的服务器端 百度下可以找到 然后执行安装和开启(关闭服务器)命令(还有其他的命令 可 ...

  2. 分布式缓存系统——memcache

    一.简介 memcache是一个自由开源的.高性能的.分布式内存对象缓存系统.它是一种基于内存的key-value存储,用来存储小块的任意数据(字符串.对象).这些数据可以是数据库调用.API调用等. ...

  3. MemCache分布式缓存的一个bug

    Memcached分布式缓存策略不是由服务器端至支持的,多台服务器之间并不知道彼此的存在.分布式的实现是由客户端代码(Memcached.ClientLibrary)通过缓存key-server映射来 ...

  4. 分布式缓存 memcache学习

    1.使用分布式缓存是为了解决多台机器共享信息的问题,通过访问一个ip和端口来可以访问不同的IIS服务器 2.memcache基础原理 在Socket服务器端存储数据是以键值对的形式存储 内存处理的算法 ...

  5. 分布式缓存Memcached/memcached/memcache详解及区别

    先来解释下标题中的三种写法:首字母大写的Memcached,指的是Memcached服务器,就是独立运行Memcached的后台服务器,用于存储缓存数据的“容器”.memcached和memcache ...

  6. CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试

    背景: 随着.NET Core 在 Linux 下的热动,相信动不动就要分布式或集群的应用的需求,会慢慢火起来. 所以这段时间一直在研究和思考分布式集群的问题,同时也在思考把几个框架的思维相对提升到这 ...

  7. Nginx+Memcache+一致性hash算法 实现页面分布式缓存(转)

    网站响应速度优化包括集群架构中很多方面的瓶颈因素,这里所说的将页面静态化.实现分布式高速缓存就是其中的一个很好的解决方案... 1)先来看看Nginx负载均衡 Nginx负载均衡依赖自带的 ngx_h ...

  8. memcache 分布式缓存

    转载地址:http://www.cnblogs.com/phpstudy2015-6/p/6713164.html 作者:那一叶随风 1.memcached分布式简介 memcached虽然称为“分布 ...

  9. 分布式缓存Memcache和Redis

    引言 针对于如今计算机的CPU和网络设施,相应用程序来说,运行效率的瓶颈.已经不是代码的长度(实现同一个功能)和带宽了,而是,代码訪问资源的过程.即:让我们的程序慢下来的罪魁祸首就是IO操作. 程序从 ...

随机推荐

  1. stm32之PWM学习

    下图是一个STM32普通PWM形成的图形原理说明 自动重装载寄存器(ARR)用于确定波形的频率(即周期).捕获比较寄存器(CCRx)(用于确定占空比的) PWM的工作过程如下:首先ARR寄存器里面的值 ...

  2. Linux学习-Shell的变量功能

    什么是变量? 简单的说,就是让某一个特定字串代表不固定的内容. 变量的可变性与方便性 举例来说,我们每个帐号的邮件信箱默认是以 MAIL 这个变量来进行存取的, 当 dmtsai 这个 使用者登陆时, ...

  3. Page-Object思想

    为什么要使用page-object 集中管理元素对象 集中管理一个page内的公共方法 后期维护方便 集中管理元素对象 实现方法: 调用方法: WebElement element = dri ...

  4. linux+ARM学习路线

    学习步骤如下: 1.Linux 基础 安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统 能够熟练使用Linux系 ...

  5. HDU 2460 Network 边双连通分量 缩点

    题意: 给出一个无向连通图,有\(m\)次操作,每次在\(u, v\)之间加一条边,并输出此时图中桥的个数. 分析: 先找出边双连通分量然后缩点得到一棵树,树上的每条边都输原图中的桥,因此此时桥的个数 ...

  6. [转载]ExtJs4 笔记(2) ExtJs对js基本语法扩展支持

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/) 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引 ...

  7. Leetcode1--->数组中两数之和等于给定数

    题目: 给定一个数组nums,目标数target.在数组中找到两数之和为target的数,返回两数的下标举例: Given nums = [2, 7, 11, 15], target = 9, Bec ...

  8. ora flashback详解

    使用oracle数据库时,难免会碰到一些问题. 例:1.如何回滚已经commit了的数据 2.如何查询已经被覆盖掉的数据[update],或者被delete了的数据 3.如何将数据恢复到某个时间点 我 ...

  9. custom post types 404 Page Error

    问题: 注册新的文章类型后,用新的类型写文章,打开后报 404 错误 原因: 因为虽然注册了新的帖子类型,但WordPress还不知道如何处理它 解决: 到设置 -> 固定链接,重新点击保存,再 ...

  10. 【Luogu】P2389电脑班的裁员(DP)

    题目链接 sbt交了三遍才过是我的耻辱…… 就是设f[i][j]搞个三重循环DP一下,以上. #include<cstdio> #include<cstdlib> #inclu ...