1、首先为什么要用mamcached缓存呢?
1.1、使用数据库,从而出现高并发带来的数据库“死锁”;
1.2、磁盘IO读写的效率;
1.3、读写性能非常的好、开源、再者有很多的成功案例。
当然,memcached的有点远不止这些,有兴趣的小伙伴可以上网查阅资料哦!
2、memcahced的简介:
memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。
它的存储方式类似于一个容量庞大的hash表。例如:
属性 | 说明 |
---|---|
key | 这个值是唯一的 (string,另:key的最大长度为255个字符。) |
value | 可以存储基本的数据(整型、浮点型、字符串、布尔)、复合类型(数组、对象)、特殊类型(NULL、不能存放资源)、二进制数据(图片、视频、音频) |
3、安装memcached步骤:
3.1、下载链接:memcached.zip,提取码:d8d2
3.2、下载成功后解压可以看到三个文件,如图:
3.3、找到windows命令行,以管理员的身份运行,然后cd到文件的下载目录处,如下图:
3.4、然后输入安装命令:memcahed.exe -d install,输入完成后直接回车即可;
3.5、安装完成以后,输入命令:memcached.exe -h,查看是否安装成功,出现如图内容则表示已经安装成功:
3.6、安装成功以后启动memcached,输入命令:memcached -d start,如图:
此时打开任务管理器,可以看到memcached已经启动了,如图:
3.7、接下通过windows中的telnet工具实现memcached的登录,输入命令:telnet 127.0.0.1 11211,如图:
如果启动失败或者不存在该命令等错误,尝试看一下是否启用了telnet工具,打开“控制面板=》程序=》启用或关闭程序=》telnet”即可。
4、在C#中的使用:
4.1 简单的使用控制台,向memcached里面存储一个值进去:
所需的动态库:EnyimMemcached.dll
4.2 示例代码:
using Enyim.Caching;
using Enyim.Caching.Configuration;
class Program
{
static void Main(string[] args)
{
MemcachedClientConfiguration mcConfig = new MemcachedClientConfiguration();
mcConfig.AddServer("192.168.0.117:11211");//使用本地服务器的ip
using (MemcachedClient client = new MemcachedClient(mcConfig)) {
client.Store(Enyim.Caching.Memcached.StoreMode.Set, "name", "test-1");//存储一个键值
Console.WriteLine("数据存储成功!OK");
string name = client.Get("name").ToString();//根据键“key”,获取对应的值
Console.WriteLine($"取出来的值“value”为:"+name+",键“key”为“name”。");
}
Console.ReadKey();
}
}
4.3 代码运行效果,如图:
5.下面模拟简单的用户登录,将用户登录信息存储到memcache里面去。下面我把部分重要的代码贴出来(用户信息使用code-first/EF映射的):
需要引入的动态库:
=》Commons.dll
=》ICSharpCode.SharpZipLib.dll
=》Memcached.ClientLibrary.dll
5.1 =》MemcacheHelper.cs
using Memcached.ClientLibrary;
public static class MemcacheHelper
{
private static MemcachedClient mc;
static MemcacheHelper()
{
//在客户端的memcached的集群来配置
String[] serverList = { "127.0.0.1:11211" };
//配置memcached的服务池
SockIOPool pool = SockIOPool.GetInstance("test");
//设置服务器列表
pool.SetServers(serverList);
//各服务器之间负载均衡的设置比例
pool.SetWeights(new int[] { 1 });
pool.Initialize();
//实例化memcached客户端对象
mc = new MemcachedClient();
mc.PoolName = "test";
//是否启用压缩数据;如果启用了压缩数据,数据压缩长于门槛的数据将被存储在压缩的形式
mc.EnableCompression = false;
}
/// <summary>
/// 给 memcached中插入值
/// @author 王伟
/// @date 2019-06-25 15:08 多云
/// </summary>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <param name="expiry">过期时间</param>
/// <returns></returns>
public static bool Set(string key, object value, DateTime expiry)
{
return mc.Set(key, value, expiry);
}
/// <summary>
/// 在memcached中取值
/// @author 王伟
/// @date 2019-06-25 15:12 多云
/// </summary>
/// <param name="key">键</param>
/// <returns></returns>
public static object Get(string key)
{
return mc.Get(key);
}
}
5.2 =》SchoolDbContext.cs
public class SchoolDbContext : DbContext
{
public SchoolDbContext()
: base("name=SqlSugarDemoEntities")
{
this.Database.CreateIfNotExists();
}
public virtual DbSet<Student> Student { get; set; }
public virtual DbSet<UserInfo> UserInfo { get; set; }
}
5.3 =》BaseController.cs
public class BaseController : Controller
{
//用来保存当前用户的信息
public UserInfo LoginUser { get; set; }
/// <summary>
/// 通过过滤器来检查每个页面
/// @author 王伟
/// @date 2019-06-25 15:53 多云
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
//从cookie中获取咱们登录的sesionId
string sessionId = Request["sessionId"];
if (string.IsNullOrEmpty(sessionId))
{
Response.Redirect("/Login/Index");
}
object obj = MemcacheHelper.Get(sessionId);
UserInfo userInfo = obj as UserInfo;
if (User == null)
{
Response.Redirect("/Login/Index");
}
LoginUser = userInfo;
//实现session的滑动机制
MemcacheHelper.Set(sessionId, userInfo, DateTime.Now.AddMinutes(20));
}
}
5.3 =》HomeController.cs
public class HomeController : BaseController
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
5.4 =》LoginController.cs
public class LoginController : Controller
{
// GET: Login
public ActionResult Index()
{
return View();
}
[HttpGet]
public ActionResult UserLogin(UserInfo user)
{
SchoolDbContext schoolDbEntities = new SchoolDbContext();
var userList = schoolDbEntities.UserInfo.ToList();
var loginUser = schoolDbEntities.UserInfo.Where(t => t.UName.Equals(user.UName) && t.UPwd.Equals(user.UPwd)).FirstOrDefault();
if (loginUser == null)
{
return Content("用户名密码错误!");
}
else
{
Guid sessionid = Guid.NewGuid();
Response.Cookies["sessionId"].Value = sessionid.ToString();
string json = JsonConvert.SerializeObject(loginUser);//必须序列化以后才能存入
MemcacheHelper.Set(sessionid.ToString(), json, DateTime.Now.AddMinutes(20));
string userInfo = MemcacheHelper.Get(sessionid.ToString()).ToString();//从memcache中获取用户信息
return Content("用户登录成功!当前登录用户的信息为:" + userInfo);
}
}
}
5.5 =》MemcachedController.cs
public class MemcachedController : BaseController
{
private static MemcachedClient mc;
public ActionResult Index()
{
//通过客户端来进行memcached的集群配置,存入数据是使用一致的hash算法将key和value存入
String[] serverList = {"127.0.0.1:11211" };
//初始化Memcached的服务池
SockIOPool pool = SockIOPool.GetInstance("test");
//设置服务器列表
pool.SetServers(serverList);
//设置服务器之间的负载均衡比例
pool.SetWeights(new int[]{ 1});
pool.Initialize();
//创建一个memcached的客户端对象
mc = new MemcachedClient();
mc.PoolName = "test";
//是否启用压缩数据
mc.EnableCompression = false;
mc.Set("wangwei", "Hello World !", DateTime.Now.AddSeconds(5));
pool.Shutdown();//关闭连接池
return Content("OK");
}
}
6、运行结果,如图:
6.1 =》登录:
6.2 =》登陆成功:
到这儿,memcache的简单用法就结束了。欢迎评论吐槽!!!!!!
人生最困难的不是努力,也不是奋斗,而是做出正确的抉择。