• 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 CKmemcached_en32or64x64
    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"));
    else
        Console.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会把最长时间未使用到期的缓存记录给删除,腾出空间继续使用。

    //参数
    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();

  • 相关阅读:
    第十三周编程总结
    第十二周总结
    第十一周课程总结
    第十周编程总结
    第七次实验报告及编程总结
    第六次实验报告及学习总结
    课程总结
    第十四周课程总结&实验报告
    第十三周课程总结
    第十二周总结
  • 原文地址:https://www.cnblogs.com/mmbbflyer/p/7793711.html
Copyright © 2020-2023  润新知