分布式缓存Memcached---开篇的话
大数据、高并发这是最近一段时间内被IT行业提的最为火热的概念,看过《大数据时代》的同学应该不会陌生大数据的概念,尤其是对于互联网行业来说,大数据是每天都要接触的问题,简单通俗地说,每天得大数据,就给系统的性能带来了新的要求---高并发,有了这样一个技术应用的实际背景,对技术人员就提出了要求,随着java环境下的Hadoop,PHP的Memcached,包括Redis的产生和技术的扩散,我们就开始接触这些应用与大数据高并发领域的架构理念,Memcached基于C语言编写,天生的跨平台,让这个技术很容易产生了Windows平台的版本,.NET环境对Memcached玩转就显得让人兴奋不已了。
我的环境:
Thinkpad T430 I5/2.8GHZ 8G/DDR3
Windows 8 Enterprise X64
首先,下载Memecached服务端安装包,据我所知官方不提供windows版本的安装包,需要自己编译,不过在github上有MSI安装包可以下载。
服务端:http://code.jellycan.com/memcached/
客户端:http://sourceforge.net/projects/memcacheddotnet/
当然还存在一些其它较好的客户端,这里我实现一个分布式缓存实现单点登录的功能,就使用了这个客户端。下载完成后,含exe安装包文件夹解压copy到自定义目录。我的环境中,我把它放到了E盘根目录。命令行安装
完成安装后,使用start命令来启动memcached,这样memcached就会作为一个windows服务进程在运行
服务端运行完成后,可以基本了解一下这个版本的Memcahced在windows平台下的一些基本特性:
Memcached默认使用端口是11211
默认最大连接数是1024个
默认最大使用内存是64M
默认每个键值对,值存储空间为1M
服务端准备工作完成后,我们需要支持进行memcached编程的客户端,对于net技术来说,就是需要支持的DLL,当然,如果对Memcached特别有研究的同学,可以自己写Dll,Memecahed服务端会暴露相应的API供客户端调用,使用Sockt连接来进行数据交互。我使用的是Memcacheddotnetclient_1.1.5的客户端 。
所有的准备工作完成之后,就要进入我们的代码阶段了。打开visual studio新建一个项目(控制台、web、win都可以),然后项目引入客户端DLL就可以进行编程了。为了方便单点登录的Session数据共享的功能,我新建的是Web MVC程序。
程序目录结构:
实现单点登录毫无疑问,首先使用MVC框架建立Login页面
View Login前端
一个密码输入框,一个用户名输入框,简单模拟登录。当用户输入用户名密码之后,进行校验,校验通过将生成SessionID,通过Respons写入客户端,并将用户登录信息存入Memecached,在下次用户直接请求Index页面的时候,首先通过Cookie存入的SessionId查找Memecached,如果查找到并且验证合格则直接跳转到Index,否则继续进入Login要求用户信息验证。
HomeControll代码如下:
[HttpPost]
public ActionResult LoginAction(FormCollection values)
{
string name = values["txtName"];
string password = values["txtPass"]; if (name == myname && password == mypassword)
{
string sessionId = Guid.NewGuid().ToString();
MemcachHelper.Set(sessionId, name + "$" + password, DateTime.Now.AddDays());
Response.Cookies["SessionId"].Value = sessionId;
return View("Index");
} return View("Login");
}
使用POST方式提交用户页面信息进行验证,我这里放了2个静态变量,真实的环境中,这个数据应该是从数据库中查询到的。
当用户直接请求非身份验证的页面的时候,我们首先是查找Cookie中是否有我们在登录的时候写入的SessionID,存在SessionId则直接去Memecached拉取前次登录的信息。
代码实现如下:
public ActionResult Index()
{
if (Request.Cookies["SessionId"] == null || string.IsNullOrEmpty(Request.Cookies["SessionId"].ToString()))
{
return View("Login");
}
else
{
string key = Request.Cookies["SessionId"].Value.ToString();
string[] arrUserInfo = MemcachHelper.Get(key).ToString().Split('$');
if (arrUserInfo.Length >= )
{
if (arrUserInfo[] == myname && arrUserInfo[] == mypassword)
{
return View("Index");
}
return View("Login");
}
}
return View("Login");
}
实现起来的业务逻辑并不复杂了,这里两次操作了Memecached,所以在Model中加入了一个操作Memecached的帮助类,类代码如下:
public class MemcachHelper
{
private static MemcachedClient mclient; static MemcachHelper()
{
string[] serverList = new string[] { "127.0.0.1:11211" }; SockIOPool pool = SockIOPool.GetInstance("First");
pool.SetServers(serverList);
pool.Initialize();
mclient = new MemcachedClient();
mclient.PoolName = "test";
mclient.EnableCompression = false;
} public static bool Set(string key, object value, DateTime expiry)
{
return mclient.Set(key, value, expiry);
} public static object Get(string key)
{
return mclient.Get(key);
}
}
干脆利索的三个功能,由于使用的是静态类的静态方法,所以构造函数中对Memcached进行来了初始化,在类进行静态方法调用的时候,第一次回调用静态构造函数,将Memecached需要进行初始化的信息进行写入。其次,定义了Get和Set两个方法,一个读取,一个写入数据。操作Memecached就这么简单。
这里稍微解释一下静态构造函数中的代码:serverList实际上就是我们说的服务器集群列表,这个列表直接告诉了我们那台服务器,通过那个端口,加入这个memecached集群。建立SockIOPool连接,初始化连接池,并设置相应的过期时间。
抛砖引玉,欢迎吐槽学习!贴上我的源代码:http://files.cnblogs.com/aspnetdream/MemcachedMVC.rar
分布式缓存Memcached---开篇的话的更多相关文章
- CYQ.Data V5 分布式缓存MemCached应用开发介绍
前言 今天大伙还在热议关于.NET Core的东西,我只想说一句:在.NET 跨平台叫了这么多年间,其实人们期待的是一个知名的跨平台案例,而不是一堆能跨平台的消息. 好,回头说说框架: 在框架完成数据 ...
- NET分布式缓存Memcached测试体验
原文地址:http://onlyonewt.blog.sohu.com/160168896.html 一直在学习关注大访问量网站的缓存是如何实现,之前看过Memcached的资料,忙于没有时间来真正测 ...
- 分布式缓存Memcached/memcached/memcache详解及区别
先来解释下标题中的三种写法:首字母大写的Memcached,指的是Memcached服务器,就是独立运行Memcached的后台服务器,用于存储缓存数据的“容器”.memcached和memcache ...
- .NET分布式缓存Memcached从入门到实战
一.课程介绍 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是 ...
- 第八章 企业项目开发--分布式缓存memcached
注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存 ...
- 分布式缓存Memcached
分布式缓存服务器,既然用到数据缓存很明显就是想高效性的获取数据,大容量的存储数据.为了可以缓存大量的数据以及可以高效获取数据,那么分布式缓存数据库就要解决数据可以水平线性扩展,这样可以扩大数据容 ...
- 分布式缓存-Memcached
分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大 并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性).分布式缓存的核心技术包括首先是内存本身的管理问题,包括 ...
- 分布式缓存memcached介绍,win7环境安装,常用命令set,get,delete,stats, java访问
一.memcached是什么? 二.memcached不互相通信的分布式 三.安装步骤 四.本文介绍的命令主要包括: 存入命令(Storage commands) 取回命令(Retrieval com ...
- 第十五章(附)分布式缓存-Memcached
一.概念 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能. 二.适用场合 1.分布式应用.由于 ...
- 方法过滤器,分布式缓存 Memcached实现Session解决方案
控制器-〉方法过滤器-〉controller-> 方法 所以通过建立controller基类的方法进行方法过滤,所有控制器先执行基类的OnActionExecuting 方法. using Sp ...
随机推荐
- spring mvc 请求转发和重定向(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- Power BI for Office 365(一)移动端应用
此篇来自于微软商业智能网站的官方博客团队发布的Power BI在线资料其中的一部分,完整版地址: http://office.microsoft.com/en-us/office365-sharepo ...
- [BI项目记]-配置Sharepoint2013支持文档版本管理笔记
做开发或者做方案,写文档是很重要的一个工作,我们经常需要知道文档被修改的次数,谁在什么时间修改的文档,以及在某一个版本中,都修改了哪些内容,以及不同版本的文档之间有什么差别. 如何对文档进行版本管理, ...
- [Unity3D]NGUI用Sprite动画和屏幕自适应做游戏开始场景
我们在玩任何一款手游产品时,都是先上来个logo界面,游戏欢迎界面等,这就意味着我们要做一款游戏需要多个场景,场景之间来回切换实现游戏逻辑,unity也不例外,所以从本篇开始将会介绍如何搭建多个场景, ...
- OpenCV成长之路(2):图像的遍历
我们在实际应用中对图像进行的操作,往往并不是将图像作为一个整体进行操作,而是对图像中的所有点或特殊点进行运算,所以遍历图像就显得很重要,如何高效的遍历图像是一个很值得探讨的问题. 一.遍历图像的4种方 ...
- java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法
1 BitmapFactory.decodeFile(imageFile); 用BitmapFactory解码一张图片时,有时会遇到该错误.这往往是由于图片过大造成的.要想正常使用,则需要分配更少的内 ...
- Hibernate的检索方式
Hibernate的检索方式 检索方式(查询的方式) 导航对象图检索方式: 根据已经加载的对象导航到其他对象 Customer customer = (Customer)session.get(Cus ...
- react native TextInput
今天我想说一下react native中的一个控件,TextInput 翻译过来就是文本输入,对应着android中的EditText.我们先看一下官方是怎样描述的.TextInput是一个允许用户在 ...
- 表单验证——jquery validate使用说明【另一个教程】
[参考:http://www.tuicool.com/articles/y6fyme] jQuery Validate jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证 ...
- 所有的畅通工程[HDU1232][HDU1874][HDU1875][HDU1879]
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissio ...