C# memcache

2024-06-20 23:38
文章标签 c# .net netcore memcache

本文主要是介绍C# memcache,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

memcache是一套开放源的分布式高速缓存系统。由服务端和客户端组成,以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。memcache主要把数据对象缓存到内存中,通过在内存里维护一个统一的巨大的hash表。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。memcache基于一个存储键/值对的hashmap进行存储对象到内存中。memcache是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

  特性:  

  • 在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
  • Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分多个端口开启多个Memcached进程 。
  • 最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA
  • 单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制

Windows下安装Memcache

  了解memcache一些基本信息后,在来尝试在windows下安装memcache服务端。

  1. 首先下载memcache安装文件:【安装包】。安装包里面会有x64和x86两个文件夹,根据操作系统选择一个打开会找到memcached.exe。这个文件不能直接双击运行安装,需要通过cmd进行安装。
  2. 安装步骤如图所示:

步骤:

1.窗口+R:输入cmd
2.进行G盘: 输入 G:
3.进行Memcached for window 32/64的安装目录:输入 cd CK\memcached_en32or64\x64
4.安装memcached:输入 memcached -d install
5.启动服务:输入 memcached -d start

启动服务后在Windows进程中可以看到memcached.exe.

memcached -d start|stop|shutdown|restart|uninstall|install 启动|停止|关闭|重启|卸载|安装。

安装步骤不是很复杂。第一:找到文件(memcached.exe)路径。第二: memcached -d install  就OK..

基本默认参数说明:

-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助

服务器操作完成后,我们可以在本机telnet 到服务测试一个下。(如果提示telnet命令不存在,需要去控件面板开启windows的tel服务功能, win7的开启tel功能操作步骤是:【控制面板】->【程序和功能】->【打开或关闭window功能】,然后找到并勾选tel相关即可。其他window系统步骤类似。)

测试telnet是否正常运行 telnet 172.21.0.192 11211 

进入后先按ctrl+]启动回示功能,否则无法看到输入信息。回示功能启动成功后如下图:

然后按回车输入参数stats:

安装和测试工作已完成..

实例代码

有很多C#版本的Memcached客户端程序。在这里我们使用的是Memcached.ClientLibrary.dll客户端调用方法,调用需要二个DLL:

Memcached.ClientLibrary.dll  (Memcached客户端类库)

log4net.dll (log4net是为Memcached提供日志记录)     DLL下载地址:【点击下载】

在项目中引用这个二个dll,引用log4net.dll后还需进行一系列配置工作。在上篇博客中有对log4net的配置介绍。

【Log4Net 日志配置[附带源码]】

注意:Memcached.ClientLibrary.dll和log4net.dll有版本对应关系。

2.如果使用WinForm或控制台应用程序把log4net的配置文件独立出现,和写在App.config里面需要小小设置一下。

如图:Log4Net.config属性“复制到输出目录”:“始终复制”。不然在bin目录下找不到对应配置信息会产生报错。

memcache基于一个存储键/值对的hashmap进行存储对象到内存中。所以我们可以理解为主要在操作hashmap的键值对。

以下是一些简单操作[增,删,改,查,设置过期时间]:

复制代码
//参数设置
string SockIOPoolName = "Test_SockIOPoolName";
string[] MemcacheServiceList = { "172.21.0.192:11211" };//设置连接池
SockIOPool SPool = SockIOPool.GetInstance(SockIOPoolName);
SPool.SetServers(MemcacheServiceList);
SPool.Initialize();//实例化Client
MemcachedClient MClient = new MemcachedClient();
MClient.PoolName = SockIOPoolName;Console.WriteLine("1.创建memcache缓存Hello World");
MClient.Add("Key1001", "Hello World");
Console.WriteLine("2.查询缓存信息{0}", MClient.Get("Key1001"));Console.WriteLine("3.修改memcache缓存Hello World");
MClient.Set("Key1001", "Hello World - 修改版");
Console.WriteLine("4.查询缓存信息{0}", MClient.Get("Key1001"));if (MClient.KeyExists("Key1001"))
{Console.WriteLine("5.删除memcache缓存");MClient.Delete("Key1001");
}if (MClient.KeyExists("Key1001"))Console.WriteLine(MClient.Get("Key1001"));
elseConsole.WriteLine("6.删除已删除");Student stud = new Student() { id = "10001", name = "张三" };
MClient.Add("student", stud);
Student Get_stud = MClient.Get("student") as Student;
Console.WriteLine("6.缓存实体对象:{0} {1}", Get_stud.id, Get_stud.name);MClient.Add("Key1002", "我已设置过期时间1分钟", DateTime.Now.AddMinutes(1));
while (true)
{if (MClient.KeyExists("Key1002")){Console.WriteLine("key:Key1002 Value:{0},当前时间:{1}", MClient.Get("Key1002"), DateTime.Now);Thread.Sleep(20000);}else{Console.WriteLine("key:Key1002 我已过期,当前时间:{0}", DateTime.Now);break;}
}
复制代码

输出结果:

Memcached缓存过期机制:

惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃。

比如键key1002在2015-04-09 13:54 :18 我设置他的值为:”我已设置过期时间1分钟“。他的过期时间为1分钟。等到2015-04-09 13:55 :18时数据应该过期,但在内存中还是会保存这条数据,而是等客户端来请求这条数据时判断数据是否过期。过期就直接删除返回空。如果内存满了memcached会把最长时间未使用到期的缓存记录给删除,腾出空间继续使用。

Memcached分布存储

下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”、“kanagawa”、“chiba”、“saitama”、“gunma”的数据。

 

首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。

同样,“kanagawa”、“chiba”、“saitama”、“gunma”都是先选择服务器再保存。接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。

这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。 (参考:memcached全面剖析)

复制代码
//参数
string[] MemcacheServiceList = { "172.21.0.192:11211", "172.21.0.28:11211", "172.21.13.246:11211" };//设置连接池
SockIOPool SPool = SockIOPool.GetInstance();
SPool.SetServers(MemcacheServiceList);
SPool.Initialize();MemcachedClient MClient = new MemcachedClient();
MClient.FlushAll();int count = 5;
var time = Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{MClient.Add(i.ToString(), "value" + i);
}
Console.WriteLine("memcached缓存创建成功。耗时:{0}",time.ElapsedTicks);time = Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{if (MClient.KeyExists(i.ToString())){Console.WriteLine("key:{0}.value:{1}", i, MClient.Get(i.ToString()));}else{Console.WriteLine("--------未能查询到数据key:{0}--------",i);}
}
Console.WriteLine("memcached缓存数据查询完成。耗时:{0}", time.ElapsedTicks);SPool.Shutdown();
复制代码

这篇关于C# memcache的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079593

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

C# Hash算法之MD5、SHA

MD5我们用的还是比较多的,一般用来加密存储密码。但是现在很多人觉MD5可能不太安全了,所以都用上了SHA256等来做加密(虽然我觉得都差不多,MD5还是能玩)。 还是跟上一篇说的一样,当一个算法的复杂度提高的同时肯定会带来效率的降低,所以SHA和MD5比较起来的话,SHA更安全,MD5更高效。 由于HASH算法的不可逆性,所以我认为MD5和SHA主要还是应用在字符串的"加密"上。 由于

C#线程系列(1):BeginInvoke和EndInvoke方法

一、线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行。这就需要在同一个进程中开启多个线程。我们使用 C# 编写一个应用程序(控制台或桌面程序都可以),然后运行这个程序,并打开 windows 任务管理器,这时我们就会看到这个应用程序中所含有的线程数,如下图所示。

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一