zoukankan      html  css  js  c++  java
  • 分布式缓存Memcache和Redis

    引言

            针对于如今计算机的CPU和网络设施,相应用程序来说,运行效率的瓶颈。已经不是代码的长度(实现同一个功能)和带宽了,而是,代码訪问资源的过程。即:让我们的程序慢下来的罪魁祸首就是IO操作。

           程序从硬盘上读取数据是一个很花费时间的操作,由于我们如今所使用的硬盘是机械式的,你想机械的执行速度和电的速度,那是一个级别上的选手吗?

           为了解决程序的瓶颈,人们提出了一种想法:使用空间换取时间。程序訪问硬盘用的时间长。那就让数据放到内存中,让程序訪问内存,这样不就节省了时间。这样确实剩下了我们程序获取数据时的等待时间,可是。我们的内存却是被占用了。

           我们大家都知道,内存这个资源对于计算机来说,是很紧缺和有限的(就那么多),假设我们计算机的内存资源都被这些数据使用了。那么一定会影响我们程序的执行的,你想。假设此时程序再须要一片内存空间的话,计算机会有什么反应,不用说,一定进行虚拟内存处理,虚拟内存是什么?硬盘上的空间。你看,我们费了半天劲又绕到了这个瓶颈,这不得不偿失嘛。

           当然。上面的那种情况是程序和缓存数据共用一个计算机的内存。假设。这个程序使用的人少。那么程序和缓存数据在一个计算机上仅仅有积极的影响,没有负面的影响,可是,假设我们程序推广出去了,并且被全部人所接受,致使我们server每一分钟都有10万用户的訪问量。此时,上述的那种情况就会严重影响程序的效率了。

    为了解决上述的问题,于是出现了分布式缓存。硬盘上的数据。缓存在别的计算机(不是程序执行的计算机)的内存上,并且。能够缓存的计算机的个数不止一个,能够是n个。这个就是本篇博客的主要内容:分布式缓存Memcache(主讲)和Redis(做个简单介绍)


    操作流程

            下载Memcache服务端;启动服务;下载.net平台的驱动;应用程序中加入驱动的引用;编敲代码


    详细操作(Memcache)

            下载Mecachedserver(win版)。安装并启动server。

    打开命令窗体。切换到memcached文件文件夹,然后。输入:memcached.exe –d install和memcached.exe –d start。此时安装并启动了服务。引入对应的驱动(dll)

            编程代码例如以下:

            staticvoidMain(string[] args)

            {

                //组成memcache集群

                //string[]servers = { "127.0.0.1:11211","10.0.9.20:11211" };集群

                string[]servers = { "127.0.0.1:11211" };

                //初始化对象池

                SockIOPool pool = SockIOPool.GetInstance();

                //SockIOPoolpool = SockIOPool.GetInstance("test1");

               

               pool.SetServers(servers);

               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();

                //client实例

                MemcachedClient mc = new MemcachedClient();

                //不压缩

               mc.EnableCompression = false;

                //mc.PoolName= "test1";//获得指定对象池的对象

               mc.Set("key1","Value1",DateTime.Now.AddMinutes(10));

                objectobj = mc.Get("key1");

                Console.WriteLine(obj);

                Console.ReadKey();

            }


    集群问题

    Memcache存储数据的原理

            先把key做一个哈希算法,得到哈希值;哈希值除以memcacheserver个数,取余,得出存放数据的server

    一致性哈希原理

            暂时添加一个memcacheserver,则之前key-value存放的server就会发生变化。此时取之前的值就会出现故障;此时,我们能够使用一致性哈希原理:每一个server相应的是一段值,此时添加一个server。出现错误的概略会降低,可是,没有办法根治


    内存存储管理

    内存分配

            Memcache把内存分成大小不同的块。当数据来了后,找到一个最小匹配上块。来存储数据

    内存使用

            採用CAS(CAS: ClientAssessService)协议,而不是採用锁,解决多并发訪问题

            client读取数据时。获得一个CAS-ID。当写入缓存前,先检查clientCAS-ID和server端CAS-ID(最后一个client訪问时的CAS-ID)是否同样,同样。能够改动。否则,不同意改动,这个和我们使用的版本号控制的原理大致是一样的

    内存回收

    Lazy Expiration(惰性检測)

            当用户通过key获取数据时才检查数据是否过期。最长过期时间为30d

    LRU(Least RecentlyUsed)

            算法:最近最少使用算法。

    闲置内存—》过期内存—》最少使用


    Memcache和Redis的差别

           都是分布式缓存;官方提供Linux版,但都不提供win版;都能够实现集群的,仅仅只是。Memecache是在client设置,而Redis是在server端设置。Memcache提供的存储类型单一。Redis提供的类型比較丰富。提供了非常多种语言的驱动。


    总结

           Memcache和Redisserver都是分布式缓存思想的详细化,使用他们,能够使我们的web应用程序高效的被很多其它的用户使用。

  • 相关阅读:
    WPF 使用 Direct2D1 画图 绘制基本图形
    WPF 使用 Direct2D1 画图 绘制基本图形
    dot net core 使用 IPC 进程通信
    dot net core 使用 IPC 进程通信
    win2d 图片水印
    win2d 图片水印
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    PHP closedir() 函数
    PHP chroot() 函数
    PHP chdir() 函数
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7358510.html
Copyright © 2011-2022 走看看