一、Memcached简介

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

目前有多种平台的Memcached版本,比如Linux、FreeBSD、Solaris 、Mac OS X及Windows平台。

可在官网下载到最新版本: http://memcached.org/ (LINUX) 。

这里,官网上好像没有找到Memcached for windows 
我们安装Windows版本来演示。

32bit:下载 memcached-win32-1.4.4-14.zip

64bit:如果需要win64版,下载 memcached-win64-1.4.4-14.zip

二、安装和启动

首先,我解压文件路径
D:\Memcached\Memcached32

安装命令
以管理员身份运行 cmd.exe

进入到解压文件
D:\>cd Memcached\Memcached32

安装
D:\Memcached\Memcached32>memcached.exe -d install

启动
D:\Memcached\Memcached32>memcached.exe -d start

OK,命令咱们已经执行完了.怎么才知道Memcached服务已经安装成功并启动了呢?

cmd  命令 services.msc

有时候,为了方便起见,我们也不能每次安装,停止和启动服务的时候都打开cmd命令框吧

常见的办法是做成批处理命令,如下:

install.bat

memcached.exe -d install

start.bat

memcached.exe -d start

stop.bat

memcached.exe -d stop

unInstall.bat

memcached.exe -d uninstall

三、.net 项目中使用

笔者查阅了相关资料,发现有很多支持Memcached的客户端,这里由于笔者的个人喜好,

选择了EnyimMemcached.2.13

可以通过Nuget安装

PM> Install-Package EnyimMemcached

笔者特意做了一个Demo来体验一下,EnyimMemcached使用

首先,我们要连接到这个分布式数据库服务,类似以前的关系型数据库,这里也是需要配置连接的,配置如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="enyim.com">
<section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection,Enyim.Caching" />
</sectionGroup>
<section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching"/>
</configSections>
<enyim.com>
<memcached>
<servers>
<!-- put your own server(s) here-->
<add address="127.0.0.1" port="11211" />
</servers>
<socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
</memcached>
</enyim.com>
<memcached keyTransformer="Enyim.Caching.TigerHashTransformer,Enyim.Caching">
<servers>
<add address="127.0.0.1" port="11211" />
</servers>
<socketPool minPoolSize="2" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00" />
</memcached>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>

为了方便使用,可以再封装一下,便于调用,

using Enyim.Caching;
using Enyim.Caching.Configuration;
using Enyim.Caching.Memcached;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks; namespace MemcachdDemo.Helper
{
public sealed class MemCachedHelper
{
private static MemcachedClient MemClient;
static readonly object padlock = new object(); //线程安全的单例模式
public static MemcachedClient getInstance()
{
if (MemClient == null)
{
lock (padlock)
{
if (MemClient == null)
{
MemClientInit();
}
}
}
return MemClient;
} static void MemClientInit()
{
try
{
MemClient = new MemcachedClient();
/*MemcachedClientConfiguration config = new MemcachedClientConfiguration();
config.Servers.Add(new System.Net.IPEndPoint(IPAddress.Parse("127.0.0.1"), 11211));
config.Protocol = MemcachedProtocol.Binary;
//config.Authentication.Type = typeof(PlainTextAuthenticator);
//config.Authentication.Parameters["userName"] = "memcache";
//config.Authentication.Parameters["password"] = "password";
MemClient = new MemcachedClient(config);*/
/*MemcachedClientConfiguration config = new MemcachedClientConfiguration();
//config.Servers.Add(new IPEndPoint("127.0.0.1", 11211));
config.Servers.Add(new System.Net.IPEndPoint(IPAddress.Parse("127.0.0.1"), 11211));
config.Protocol = MemcachedProtocol.Binary;
config.Authentication.Type = typeof(PlainTextAuthenticator);
config.Authentication.Parameters["userName"] = "username";
config.Authentication.Parameters["password"] = "password";
config.Authentication.Parameters["zone"] = ""; MemClient = new MemcachedClient(config);*/
}
catch (Exception ex)
{
throw ex;
}
} #region getAllKeys public static List<string> GetAllKeys(string ipString, int port)
{
List<string> allKeys = new List<string>();
//var ipString = "127.0.0.1";
//var port = 11211; var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse(ipString), port));
var slabIdIter = QuerySlabId(socket);
var keyIter = QueryKeys(socket, slabIdIter);
socket.Close(); foreach (String key in keyIter)
{
if (!allKeys.Contains(key))
allKeys.Add(key);
} return allKeys;
} /// <summary>
/// 执行返回字符串标量
/// </summary>
/// <param name="socket">套接字</param>
/// <param name="command">命令</param>
/// <returns>执行结果</returns>
static String ExecuteScalarAsString(Socket socket, String command)
{
var sendNumOfBytes = socket.Send(Encoding.UTF8.GetBytes(command));
var bufferSize = 0x1000;
var buffer = new Byte[bufferSize];
var readNumOfBytes = 0;
var sb = new StringBuilder(); while (true)
{
readNumOfBytes = socket.Receive(buffer);
sb.Append(Encoding.UTF8.GetString(buffer)); if (readNumOfBytes < bufferSize)
break;
} return sb.ToString();
} /// <summary>
/// 查询slabId
/// </summary>
/// <param name="socket">套接字</param>
/// <returns>slabId遍历器</returns>
static IEnumerable<String> QuerySlabId(Socket socket)
{
var command = "stats items STAT items:0:number 0 \r\n";
var contentAsString = ExecuteScalarAsString(socket, command); return ParseStatsItems(contentAsString);
} /// <summary>
/// 解析STAT items返回slabId
/// </summary>
/// <param name="contentAsString">解析内容</param>
/// <returns>slabId遍历器</returns>
static IEnumerable<String> ParseStatsItems(String contentAsString)
{
var slabIds = new List<String>();
var separator = "\r\n";
var separator2 = ':';
var items = contentAsString.Split(separator, StringSplitOptions.RemoveEmptyEntries); for (Int32 i = 0; i < items.Length; i += 4)
{
var itemParts = items[i].Split(separator2, StringSplitOptions.RemoveEmptyEntries); if (itemParts.Length < 3)
continue; slabIds.Add(itemParts[1]);
} return slabIds;
} /// <summary>
/// 查询键
/// </summary>
/// <param name="socket">套接字</param>
/// <param name="slabIdIter">被查询slabId</param>
/// <returns>键遍历器</returns>
static IEnumerable<String> QueryKeys(Socket socket, IEnumerable<String> slabIdIter)
{
var keys = new List<String>();
var cmdFmt = "stats cachedump {0} 200000 ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s] \r\n";
var contentAsString = String.Empty; foreach (String slabId in slabIdIter)
{
contentAsString = ExecuteScalarAsString(socket, String.Format(cmdFmt, slabId));
keys.AddRange(ParseKeys(contentAsString));
} return keys;
} /// <summary>
/// 解析stats cachedump返回键
/// </summary>
/// <param name="contentAsString">解析内容</param>
/// <returns>键遍历器</returns>
static IEnumerable<String> ParseKeys(String contentAsString)
{
var keys = new List<String>();
var separator = "\r\n";
var separator2 = ' ';
var prefix = "ITEM";
var items = contentAsString.Split(separator, StringSplitOptions.RemoveEmptyEntries); foreach (var item in items)
{
var itemParts = item.Split(separator2, StringSplitOptions.RemoveEmptyEntries); if ((itemParts.Length < 3) || !String.Equals(itemParts.FirstOrDefault(), prefix, StringComparison.OrdinalIgnoreCase))
continue; keys.Add(itemParts[1]);
} return keys;
}
} /// <summary>
/// String扩展函数
/// </summary>
static class StringExtension
{
/// <summary>
/// 切割
/// </summary>
/// <param name="str">字符串</param>
/// <param name="separator">分隔符</param>
/// <param name="options">选项</param>
/// <returns>切割结果</returns>
public static String[] Split(this String str, Char separator, StringSplitOptions options)
{
return str.Split(new Char[] { separator }, options);
} /// <summary>
/// 切割
/// </summary>
/// <param name="str">字符串</param>
/// <param name="separator">分隔符</param>
/// <param name="options">选项</param>
/// <returns>切割结果</returns>
public static String[] Split(this String str, String separator, StringSplitOptions options)
{
return str.Split(new String[] { separator }, options);
} #endregion }
}

因为EnyimMemcached帮我们封装的很好,剩下的就是调用了

private void button3_Click(object sender, EventArgs e)
{
try
{
if (String.IsNullOrEmpty(this.txtKey.Text))
{
MessageBox.Show("key不能为空!");
return;
}
else
{
var key = this.txtKey.Text.Trim();
var value = this.txtValue.Text.Trim();
var bRet = client.Store(StoreMode.Set, key.Trim(), txtValue.Text.Trim());
}
}
catch (Exception ex)
{
throw ex;
}
}

截图如下

由于是key-value存储,查询方法:

var value = mc.Get("name");

对于Memcached的安装,启动和基本使用,有了简单的介绍,希望对你有用, 有用的话,请支持一下哈!

转载:https://www.cnblogs.com/lucky_hu/p/4676734.html

Memcached部署和用法的更多相关文章

  1. memcached部署memcached环境及PHP扩展

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lxsym.blog.51cto.com/1364623/876209 Memca ...

  2. 企业级memcached部署(session共享)

    服务端部署 第一个里程碑:安装依赖关系 Memcache用到了libevent这个库用于Socket的处理. [root@nfs01 ~]# yum install libevent libevent ...

  3. Nginx+Tomcat+Memcached部署

    环境清单列表:(因为只有三台电脑,所有把Nginx和memcached放到一起) 应用服务器1:192.168.51.10: 应用服务器2:192.168.55.110: memcached服务器:1 ...

  4. Kerberos基本原理、安装部署及用法

    1. 概述 Kerberos是一种认证机制. 目的是,通过密钥系统为客户端/服务器应用程序提供强大的认证系统:保护服务器防止错误的用户使用,同时保护它的用户使用正确的服务器,即支持双向验证:Kerbe ...

  5. Memcached操作以及用法

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  6. Memcached 的一些用法

    public interface ICache { object Get(string key); /// <summary> /// 根据 key 从缓存中读取数据 /// </s ...

  7. Memcached命令:简单获取缓存value用法

    Memcached:命令用法1.cmd 输入telnet ip  端口 进入memcached服务端窗口比如:xxx.Token_T1435622096xxx为key获取此key的memcached ...

  8. Nginx+Tomcat+Memcached 实现集群部署时Session共享

    Nginx+Tomcat+Memcached 实现集群部署时Session共享 一.简介 我们系统经常要保存用户登录信息,有Cookie和Session机制,Cookie客户端保存用户信息,Sessi ...

  9. 高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景

    一.应用场景1 最近在一个项目中,用到了Nginx的Memcached模块,所以就在这个系列教程中提前把Memcached模块拿出来写了.另外发现最近我的 博客文章频频被很多用采集器的网站拿走,帮我发 ...

随机推荐

  1. springboot swagger 整合

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步. 作用: 1.  ...

  2. Angularjs自定义指令计算浏览器高度

    <!DOCTYPE html> <html ng-app="app"> <head> <title>柳絮飞祭奠</title& ...

  3. 05 IO和管道

    目录   三种I/O设备 把I/O重定向至文件 使用管道   知识铺垫     1)查看fd-文件描述符 (L)   ll /proc/$$/fd   在Linux中,系统打开文件时会随机分配一个编号 ...

  4. 跨域访问问题js

    您可以通过使用JSONP形式的回调函数来加载其他网域的JSON数据 访问百度的地址解析  返回来省,地区,市 $.getJSON("http://api.map.baidu.com/clou ...

  5. Python序列结构

    python中常用的序列结构由列表.元组.字典.字符串.集合等,列表.元组.字符串等有序序列以及range对象均支持双向索引 是否有序 序列结构 是否是可变序列 有序序列 元组 不可变序列 有序序列 ...

  6. OkHttp 入门篇

    OkHttp是一个HTTP & HTTP2的客户端,能够用来进行Android 和 Java 开发. HTTP是现代应用的最基本的网络环境.让你的HTTP更加有效的工作能够让你的东西加载更快而 ...

  7. 小鬼难缠--python小bug备忘

    今天编译pyhon做人脸识别,遇到几个问题,做个记录吧. 编译报错: File "harrClassifier.py", line 17, in <module> fl ...

  8. Linux下用ifconfig命令设置IP、掩码、网关

    设置IP和掩码ifconfig eth0 192.168.1.240 netmask 255.255.255.0设置网关route add default gw 192.168.1.1 每日一言:靡不 ...

  9. 学习react

    推荐资源: 一位react的最初构建者写的学习react的建议,这是翻译过的http://www.360doc.com/content/16/0129/07/13518188_531384175.sh ...

  10. 一个 react 小的 demo

    一.搭建开发环境: webpack构建工具. 新建一个文件夹(login),进入根目录, 1.输入命令:cnpm init,生成了一个package.json文件,这是一个标准的npm说明文件,里面蕴 ...