memcache小结--【ITOO】

为什么要用memcache

    每个技术的出现必然有它出现的原因,为啥要用memcached?查了一下网上的资料,了解到Memcache的出现解决了数据库高并发访问的瓶颈。当数据架构建立在单数据库模式,数据库连接池峰值达500,程序离崩溃就不远了。有的小网站开发的时候没有关注性能,等用户访问量越来越大,程序很容易崩溃。

    如果客户端发送一个请求,服务端从数据库中存取相关数据,花费高昂。如果每次都从数据库取相同的数据,造成了数据库低效。然而如果把第一次取出的数据都存入到内存中,下次读取直接从内存中获得,给数据库就减负了。

    所以在数据库和web之间放一层cache层,好处:1.减轻数据库的负担 2.提高存取速度。


什么是memcache?

  Memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载。

  上面是官方的回答,我个人的理解是Memcache像一个临时数据库,以key-value的形式存取数据,key会通过一个Hash算法转换成Hash-key,便于查找。因为它存储数据在内存中,离cpu比较近,查询数据是很快速的。


memcache小结--【ITOO】_第1张图片



memcache原理是什么?2015年12月17日(Memcache缓存系统知识)

memcache小结--【ITOO】_第2张图片

1.客户端发送web请求,首先memcache Client检查客户端请求的数据是否存在memache中,如果有,直接返回数据,不对数据库进行任何操作,路径为1237。

2.如果不存在memache中,就去查询数据库中的数据,先把数据库中的数据返回给客户端,同时缓存一份数据在memcache中,路径为124576.

3.每次更新数据库的数据的时候,memache会同时更新,保持数据一致性。

4.当分配给memache的空间用完,采用LRU(Least Recently Used,最近最少使用的原则),策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。


memcache跟cookie、session有什么异同?

  cookie、session常用来保存用户信息,SSO中用户信息存到本地cookie中一份,发送到session也保存一份,cookie的安全性比session差。memcached可以用在考试的抽题中,保存的数据的特色:1.数据量大 2.数据被多次使用。session时效性、存取在服务器这两点来说,是比较安全的。cookie可以通过本地cookie加密来解决安全性的问题,手写SSO里面cookie存取的用户密码就被加密过,数据库中存取的是也是加密后的信息。memcached可以通过放在防火墙后面增加自身的安全性。


memcached实战演练

1.安装memcached的服务端

  1. 下载memcachewindows稳定版,解压放某个盘下面,比如在c:\r
  2. cmd下输入 c:\memcached\memcached.exe -d install 安装(请不要怀疑,真的安装完成了!)
  3. 再输入: c:\memcached\memcached.exe -d start 启动。默认分配64M内存,使用11211端口)

2.memcached使用

    首先用telnet 127.0.0.1 11211这样的命令连接上memcache,然后直接输入stats就可以得到当前memcache的状态。 (如果输入telnet 后报telnet不是内部或外部命令的时候,做如下操作。)

memcache小结--【ITOO】_第3张图片


得到以下信息:

memcache小结--【ITOO】_第4张图片


3.客户端代码

memcache小结--【ITOO】_第5张图片

控制台程序:


<font size="4"><span style="font-family:SimSun;"><span style="font-size:18px;"><span style="font-family:SimSun;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Memcached.ClientLibrary;

namespace memache
{
    class Program
    {
        static void Main(string[] args)
        {
             //添加多个缓存服务器地址
            string[] serverlist = { "192.168.24.247:11211","192.168.24.175:11211" };
 
             //初始化池
              SockIOPool pool = SockIOPool.GetInstance();
              pool.SetServers(serverlist);
              //设置memcached 的一些参数
              pool.InitConnections = 3;
              pool.MinConnections = 3;
              pool.MaxConnections = 5;
                
              pool.SocketConnectTimeout = 1000;
              pool.SocketTimeout = 3000;
 
              pool.MaintenanceSleep = 30;
              pool.Failover = true;
 
              pool.Nagle = false;
              pool.Initialize();
 
             // 获得客户端实例
              MemcachedClient mc = new MemcachedClient();
              mc.EnableCompression = false;
 
            
              Console.WriteLine("------------测   试-----------");
              bool flags1 = mc.Set("user1", "my value");  //存储数据到缓存服务器,这里将字符串"my value"缓存,key 是"test"
              bool flags2 = mc.Set("user2", "my value");
              bool flags3 = mc.Set("user3", "my value");
              bool flags4 = mc.Set("user4", "my value");
              bool flags5 = mc.Set("user5", "my value");
              bool flags6 = mc.Set("user6", "my value");

             if (mc.KeyExists("user1"))   //测试缓存存在key为test的项目
              {
                  Console.WriteLine("test is Exists");
                  Console.WriteLine(mc.Get("user1").ToString());  //在缓存中获取key为test的项目
              }
             else
              {
                  Console.WriteLine("test not Exists");
              }
 
             // Console.ReadLine();

             bool flag = mc.Delete("user1");  //移除缓存中key为test的项目

             if (mc.KeyExists("user1")) 
              {
                  Console.WriteLine("test is Exists");
                  Console.WriteLine(mc.Get("user1").ToString());
              }
             else
              {
                  //Console.WriteLine("test not Exists");
              }
              
              SockIOPool.GetInstance().Shutdown();  //关闭池, 关闭sockets
            
              Console.ReadLine();
          }

        

        
    }
}
</span></span></span></font>

程序执行结果:

首先要开启memcached服务,输入 c:\memcached\memcached.exe -d start 并执行。

memcache小结--【ITOO】_第6张图片

启动程序控制台,memcached可以用啦!

memcache小结--【ITOO】_第7张图片



总结

  学习是一个从罗列知识、个人消化、对比、总结织网、实战的过程,实战是最能检验人学的如何的方式,做项目挺好的。

   




你可能感兴趣的:(memcached,经验)