分布式缓存之Memcache
〇、为什么要用分布式缓存
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 serversSockIOPool 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);}} }
View Code
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);// 获取请求参数中的SessionIdstring 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;}}} }
View Code
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: Accountpublic 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(30));return Content("true");}}[HttpPost]public ActionResult LogOff(){MemcachedHelper.Delete(Request["SessionId"]);return RedirectToAction("Index");}} }
View Code
下载示例代码
转载于:https://www.cnblogs.com/shaomenghao/p/4177207.html
分布式缓存之Memcache相关推荐
- 【转】系统缓存全解析二:动态缓存(4)-第三方分布式缓存解决方案 Memcache(2)...
缓存系统MemCached的Java客户端优化历程(转载自http://code.google.com/p/memcache-client-forjava/.) Memcached是一种集中式Cach ...
- memcache的分布式缓存问题
memcache的分布式缓存问题 memcache是优异的缓存解决方案,很多项目都有使用. memcache服务本身并不具备分布式缓存的能力,它提供的就是对{key, value}对的访问能力,分布式 ...
- php分布式cache,thinkPHP实现MemCache分布式缓存功能
本文实例讲述了thinkPHP实现MemCache分布式缓存功能.分享给大家供大家参考,具体如下: 两天在研究MemCache分布式缓存的问题时,发现ThinkPHP其实并不支持分布式缓存功能,这可以 ...
- 分布式缓存灵魂十连,你能坚持几个?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 目录 前言 目前工作中用到的分布式缓存技术有redis和m ...
- 分布式缓存的选择及问题
现如今,缓存系统的应用非常广泛,能够用来提高并发数.数据吞吐量,提高快速响应能力.那么当数据量达到一定程度,单机环境可能就显得有些力不从心了,就需要一个分布式缓存系统.分布式缓存能够处理大量的动态数据 ...
- 大厂都拿捏的缓存方案,平台级分布式缓存,什么业务才合适?
所有程序猿都对那缓存并不陌生,好似那风一样的女子只为你独自而舞.只见那回眸一笑百媚生,让你甚是吝惜,惹人怜爱. 但随着项目规模不断增大变强,光是单个缓存就难以招架,优而显得力不从心. 这时伴随着多级缓 ...
- 分布式缓存系统Memcached简介与实践(.NET memcached client library)
原文:分布式缓存系统Memcached简介与实践(.NET memcached client library) 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加 ...
- 内存缓存之memcache的使用
介绍:memcache是一种缓存技术,它可以把你的数据放入内存,从而通过内存访问,因为内存读取速度很快,所以memcached技术的主要目的就是提速. 在memcached中维护了一张大的hashta ...
- 用REDIS实现分布式缓存
2019独角兽企业重金招聘Python工程师标准>>> 第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的 ...
最新文章
- matlab立方体投影,那些投影到三维的高维立方体,后来都怎么样了?(浅度好文)...
- 第十五课.马尔科夫链蒙特卡洛方法
- 中断服务子程序(ISR)
- php上传文件损坏,PHP 上传文件故障排除
- mysql 数据导出语句_MySQL 数据导出
- win10无线投屏_Win10电脑屏幕分割成四分屏投屏测试
- sql查询慢原因及优化
- java利用openoffice转换doc、docx、txt、pptx、xlxs为PDF格式文件
- mvc:annotation-driven /注解意义
- IEEE Access投稿(Latex模板)——参考文献的生成
- php 旅游网毕业论文,旅游网站毕业设计论文(优质范文6篇)
- 《C专家编程》学习笔记(对链接的思考)
- fileupload控件的属性_WebForm之FileUpload控件(文件上传)
- 中国互联网络发展状况统计报告计算机,CNNIC发布《第22次中国互联网络发展状况统计报告》...
- java 端口流量统计_java—流量统计源码 | 学步园
- DP(Nietzsche)的hu测 T2(dp)
- oracle 索引的创建和生效
- matlab中绘制三维散点图scatter3函数的使用方法(附matlab代码)
- 个人搜集的工具类使用指导
- 《操作系统》-吸烟者问题
热门文章
- 1.2 为Eclipse绑定Tomcat
- 个人博客作业week7
- 使用OpenCV-Python的函数minMaxLoc()应该注意的两点
- java栈的回收_JAVA的堆栈和内存、垃圾回收解说
- 数据仓库ods层是啥意思_数据仓库和数据分层
- Unix/Linux中Cron的用法
- linux进程--自旋锁和互斥锁的区别(十四)
- DPDK使用linux drivers(二十九)
- 《php入门很简单,PHP入门速成(1)
- mysql getinstance_php设计模式之单例模式使用示例