1.软文推荐

2.软文推荐

3.软文推荐

目录: 1、利用memcached构建高性能的Web应用程序 2、memcached怎么安装和使用 3、C# 操作Memcached 4、windows memcached 怎么用 利用memcached构建高性能的Web应用程序

面临的问题

对于高并发高访问的Web应用程序来说 数据库存取瓶颈一直是个令人头疼的问题 特别当你的程序架构还是建立在单数据库模式 而一个数据池连接数峰值已经达到 的时候 那你的程序运行离崩溃的边缘也不远了 很多小网站的开发人员一开始都将注意力放在了产品需求设计上 缺忽视了程序整体性能 可扩展性等方面的考虑 结果眼看着访问量一天天网上爬 可突然发现有一天网站因为访问量过大而崩溃了 到时候哭都来不及 所以我们一定要未雨绸缪 在数据库还没罢工前 想方设法给它减负 这也是这篇文章的主要议题

大家都知道 当有一个request过来后 web服务器交给app服务器 app处理并从db中存取相关数据 但db存取的花费是相当高昂的 特别是每次都取相同的数据 等于是让数据库每次都在做高耗费的无用功 数据库如果会说话 肯定会发牢骚 你都问了这么多遍了 难道还记不住吗?是啊 如果app拿到第一次数据并存到内存里 下次读取时直接从内存里读取 而不用麻烦数据库 这样不就给数据库减负了?而且从内存取数据必然要比从数据库媒介取快很多倍 反而提升了应用程序的性能

因此 我们可以在web/app层与db层之间加一层cache层 主要目的 减少数据库读取负担 提高数据读取速度 而且 cache存取的媒介是内存 而一台服务器的内存容量一般都是有限制的 不像硬盘容量可以做到TB级别 所以 可以考虑采用分布式的cache层 这样更易于破除内存容量的限制 同时又增加了灵活性

Memcached 介绍

Memcached是开源的分布式cache系统 现在很多的大型web应用程序包括facebook youtube wikipedia yahoo等等都在使用memcached来支持他们每天数亿级的页面访问 通过把cache层与他们的web架构集成 他们的应用程序在提高了性能的同时 还大大降低了数据库的负载

具体的memcached资料大家可以直接从它的官方网站[ ]上得到 这里我就简单给大家介绍一下memcached的工作原理

Memcached处理的原子是每一个(key value)对(以下简称kv对) key会通过一个hash算法转化成hash key 便于查找 对比以及做到尽可能的散列 同时 memcached用的是一个二级散列 通过一张大hash表来维护

Memcached有两个核心组件组成 服务端(ms)和客户端(mc) 在一个memcached的查询中 mc先通过计算key的hash值来确定kv对所处在的ms位置 当ms确定后 客户端就会发送一个查询请求给对应的ms 让它来查找确切的数据 因为这之间没有交互以及多播协议 所以memcached交互带给网络的影响是最小化的

举例说明 考虑以下这个场景 有三个mc分别是X Y Z 还有三个ms分别是A B C

设置kv对

X想设置key= foo value= seattle

X拿到ms列表 并对key做hash转化 根据hash值确定kv对所存的ms位置

B被选中了

X连接上B B收到请求 把(key= foo value= seattle )存了起来

获取kv对

Z想得到key= foo 的value

Z用相同的hash算法算出hash值 并确定key= foo 的值存在B上

Z连接上B 并从B那边得到value= seattle

其他任何从X Y Z的想得到key= foo 的值的请求都会发向B

Memcached服务器(ms)

内存分配

默认情况下 ms是用一个内置的叫 块分配器 的组件来分配内存的 舍弃c++标准的malloc/free的内存分配 而采用块分配器的主要目的是为了避免内存碎片 否则操作系统要花费更多时间来查找这些逻辑上连续的内存块(实际上是断开的) 用了块分配器 ms会轮流的对内存进行大块的分配 并不断重用 当然由于块的大小各不相同 当数据大小和块大小不太相符的情况下 还是有可能导致内存的浪费

同时 ms对key和data都有相应的限制 key的长度不能超过 字节 data也不能超过块大小的限制 MB

因为mc所使用的hash算法 并不会考虑到每个ms的内存大小 理论上mc会分配概率上等量的kv对给每个ms 这样如果每个ms的内存都不太一样 那可能会导致内存使用率的降低 所以一种替代的解决方案是 根据每个ms的内存大小 找出他们的最大公约数 然后在每个ms上开n个容量=最大公约数的instance 这样就等于拥有了多个容量大小一样的子ms 从而提供整体的内存使用率

缓存策略

当ms的hash表满了之后 新的插入数据会替代老的数据 更新的策略是LRU(最近最少使用) 以及每个kv对的有效时限 Kv对存储有效时限是在mc端由app设置并作为参数传给ms的

同时ms采用是偷懒替代法 ms不会开额外的进程来实时监测过时的kv对并删除 而是当且仅当 新来一个插入的数据 而此时又没有多余的空间放了 才会进行清除动作

缓存数据库查询

现在memcached最流行的一种使用方式是缓存数据库查询 下面举一个简单例子说明

App需要得到userid=xxx的用户信息 对应的查询语句类似

SELECT * FROM users WHERE userid = xxx

App先去问cache 有没有 user:userid (key定义可预先定义约束好)的数据 如果有 返回数据 如果没有 App会从数据库中读取数据 并调用cache的add函数 把数据加入cache中

当取的数据需要更新 app会调用cache的update函数 来保持数据库与cache的数据同步

从上面的例子我们也可以发现 一旦数据库的数据发现变化 我们一定要及时更新cache中的数据 来保证app读到的是同步的正确数据 当然我们可以通过定时器方式记录下cache中数据的失效时间 时间一过就会激发事件对cache进行更新 但这之间总会有时间上的延迟 导致app可能从cache读到脏数据 这也被称为狗洞问题 (以后我会专门描述研究这个问题)

数据冗余与故障预防

从设计角度上 memcached是没有数据冗余环节的 它本身就是一个大规模的高性能cache层 加入数据冗余所能带来的只有设计的复杂性和提高系统的开支

当一个ms上丢失了数据之后 app还是可以从数据库中取得数据 不过更谨慎的做法是在某些ms不能正常工作时 提供额外的ms来支持cache 这样就不会因为app从cache中取不到数据而一下子给数据库带来过大的负载

同时为了减少某台ms故障所带来的影响 可以使用 热备份 方案 就是用一台新的ms来取代有问题的ms 当然新的ms还是要用原来ms的IP地址 大不了数据重新装载一遍

另外一种方式 就是提高你ms的节点数 然后mc会实时侦查每个节点的状态 如果发现某个节点长时间没有响应 就会从mc的可用server列表里删除 并对server节点进行重新hash定位 当然这样也会造成的问题是 原本key存储在B上 变成存储在C上了 所以此方案本身也有其弱点 最好能和 热备份 方案结合使用 就可以使故障造成的影响最小化

Memcached客户端(mc)

Memcached客户端有各种语言的版本供大家使用 包括java c 等等 具体可参见memcached api page[ ]

大家可以根据自己项目的需要 选择合适的客户端来集成

缓存式的Web应用程序架构

有了缓存的支持 我们可以在传统的app层和db层之间加入cache层 每个app服务器都可以绑定一个mc 每次数据的读取都可以从ms中取得 如果没有 再从db层读取 而当数据要进行更新时 除了要发送update的sql给db层 同时也要将更新的数据发给mc 让mc去更新ms中的数据

假设今后我们的数据库可以和ms进行通讯了 那可以将更新的任务统一交给db层 每次数据库更新数据的同时会自动去更新ms中的数据 这样就可以进一步减少app层的逻辑复杂度 如下图

不过每次我们如果没有从cache读到数据 都不得不麻烦数据库 为了最小化数据库的负载压力 我们可以部署数据库复写 用slave数据库来完成读取操作 而master数据库永远只负责三件事 更新数据 同步slave数据库 更新cache 如下图

以上这些缓存式web架构在实际应用中被证明是能有效并能极大地降低数据库的负载同时又能提高web的运行性能 当然这些架构还可以根据具体的应用环境进行变种 以达到不同硬件条件下性能的最优化

未来的憧憬

Memcached的出现可以说是革命性的 第一次让我们意识到可以用内存作为存储媒介来大规模的缓存数据以提高程序的性能 不过它毕竟还是比较新的东西 还需要很多有待优化和改进的地方 例如

如何利用memcached实现cache数据库 让数据库跑在内存上 这方面 tangent sofare 开发的memcached_engine[ ]已经做了不少工作 不过现在的版本还只是处于实验室阶段

lishixinzhi/Article/program/net/201311/12995

memcached怎么安装和使用

memcached安装和使用的方法

软件的下载,好像从官网上只能下载未经编译的源码,需要自己编译后才能安装使用,不熟悉的用户还是直接百度搜索下载比较好,

下载之后解压会出现两个版本,32位系统用x86,64位系统用x64,里面各有一个.exe程序。

建议把memcached的文件夹拷贝到自己的网站环境目录下方便统一管理。

接下来就是安装了。打开命令提示符,进入到memcached所在目录。

输入

memcached -d install

如果没有报错说明安装成功

打开  开始--管理工具--服务,或者 运行--services.msc来打开服务管理界面,前面的安装环节没有出现问题的话这里会多一个 Memcached Server服务。

点击启动此服务,或者命令行输入 net start "Memcached Server" 来启动memcached.

至此,memcached安装完成。C# 操作Memcached

要在nuget里引用(安装) EnyimMemcached ,下面是以调用阿里云的ocs(memcached)服务为例

using System;

using Enyim.Caching;

namespace MemcacheTest

{

///

/// MemcachedClient 帮组类 对外提供接口方法

    ///

public class MemcachedHelper    {      

///      

/// 定义一个静态MemcachedClient客户端,它随类一起加载,所有对象共用

        ///

private static MemcachedClient mclient;      

///      

/// 静态构造函数,初始化Memcached客户端

        ///

static MemcachedHelper()    

  {           

mclient = MemCached.getInstance();       

}      

///     

  /// 向Memcached缓存中添加一条数据

     ///

///返回是否添加成功

public static bool SetValue(string groupName,string key, object value, DateTime expiry)       

{          

key = groupName + "-" + key;           

return mclient.Store(Enyim.Caching.Memcached.StoreMode.Set,key, value, expiry);     

  }       

///     

  /// 向Memcached缓存中添加一条数据 默认超时24小时 

////

public static bool SetValue(string groupName, string key, object value)      

{          

key = groupName + "-" + key;           

eturn mclient.Store(Enyim.Caching.Memcached.StoreMode.Set, key, value, DateTime.Now.AddHours(24));      

}       

///      

/// 通过key 来得到一个对象

   ///

public static object GetValue(string groupName, string key)    

  {           

key = groupName + "-" + key;      

    return mclient.Get(key);       

}      

///      

/// 通过key 来得到一个对象(前类型)

    ///

public static T GetValue(string groupName, string key)   

    {          

key = groupName + "-" + key;     

      return mclient.Get(key);     

  }       

///       

/// 清除指定key的cache

///

public static bool Remove(string groupName, string key)     

  {          

key = groupName + "-" + key;         

  return mclient.Remove(key);     

  }      

///     

  /// 清除所有cache

       ///

public static void RemoveAll()    

  {       

    mclient.FlushAll();     

  }

  }

}

usingSystem.Net;

usingEnyim.Caching;

usingEnyim.Caching.Configuration;

usingEnyim.Caching.Memcached;

namespaceMemcacheTest

{

///

///MemcachedClient 配置类

///

publicsealedclassMemCached

    {

privatestaticMemcachedClient MemClient;

staticreadonlyobjectpadlock =newobject();

//线程安全的单例模式

publicstaticMemcachedClientgetInstance()

        {

if(MemClient ==null)

            {

lock(padlock)

                {

if(MemClient ==null)

                    {

                        MemClientInit();

                    }

                }

            }

returnMemClient;

        }

staticvoidMemClientInit()

        {

//初始化缓存

MemcachedClientConfiguration memConfig =newMemcachedClientConfiguration();

IPAddress newaddress = IPAddress.Parse(Dns.GetHostEntry("XXXXXXXXXX.m.cnhzalicm10pub001.ocs.aliyuncs.com").AddressList[0].ToString());//xxxx替换为ocs控制台上的“内网地址”

IPEndPoint ipEndPoint =newIPEndPoint(newaddress,11211);// 配置文件 - ip

            memConfig.Servers.Add(ipEndPoint);// 配置文件 - 协议

            memConfig.Protocol = MemcachedProtocol.Binary;

// 配置文件-权限,如果使用了免密码功能,则无需设置userName和password

memConfig.Authentication.Type =typeof(PlainTextAuthenticator);

memConfig.Authentication.Parameters["zone"] ="";

memConfig.Authentication.Parameters["userName"] ="XXXXXXXXXXXXXXXXX";

memConfig.Authentication.Parameters["password"] ="XXXXXXXXXX";

//下面请根据实例的最大连接数进行设置

memConfig.SocketPool.MinPoolSize =5;

memConfig.SocketPool.MaxPoolSize =200;

MemClient =newMemcachedClient(memConfig);

        }

    }

}

程序调用

MemcachedHelper.SetValue(groupName,strKey, strValue, DateTime.Now.AddMinutes(5));

varrestr = MemcachedHelper.GetValue(groupName,strKey);

varobj = MemcachedHelper.GetValue(groupName,"p001");

windows memcached 怎么用

memcached在windows7上的安装问题 错误: 通过cmd命令行进入到D:webEvememcached(下载后的解压目录) 运行 memcached.exe -d install 报错 failed to install service or service already installed 解决方法: 管理员身份安装,首先找出cmd.exe的原文件 右击以管理员身份运行,接下来就OK(win7下的用户还真麻烦). Windows下的Memcache安装: 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在D:webEvememcached 2. 在终端(也即cmd命令界面)下输入 ‘D:webEvememcachedmemcached.exe -d install’ 安装 3. 再输入:'D:webEvememcachedmemcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。 4.下载php_memcache.dll,请自己查找对应的php版本的文件 5. 在php.ini 加入一行 ‘extension=php_memcache.dll’ 6.重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功! memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stopshutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d uninstall 卸载memcached服务 -u 以的身份运行 (仅在以root运行的时候有效) -m 最大内存使用,单位MB。默认64MB -M 内存耗尽时返回错误,而不是删除项 -c 最大同时连接数,默认是1024 -f 块大小增长因子,默认是1.25 -n 最小分配空间,key+value+flags默认是48 -h 显示帮助

相关文章 8

1

office2019mac版(office2019mac版筛选收件人比较条件包含) 1分钟前

目录:1、Mac上office2019兼容模式怎么打开2、Mac 版 Office 好用吗?3、office2019是不是有bug4、Mac office2019 关闭自动更新后,每次打开仍然提示更新...

3

河南vps高防御虚拟主机(高防VPS服务器) 4分钟前

目录:1、河南景安VPS一年多少钱2、高防云主机跟VPS有什么区别?3、vps,虚拟主机,云主机是什么?三种有什么区别??4、vps,虚拟主机,云...

4

河北关键词优化包年(河北利用关键词优化网页) 7分钟前

目录:1、百度推广关键词有包年的吗?经常有网络公司给我打电话说,可以包年的,不知道是不是真的?2、做百度关键词网络优化,一般价...

5

企业网站优化好吗(企业网站怎么优化) 9分钟前

目录:1、企业网站做优化有什么好处?2、企业网站进行SEO优化有哪些好处?3、企业有必要做网站优化吗?4、网站优化对企业有什么好处?...

6

腾讯会议介绍(腾讯会议介绍添加) 10分钟前

目录:1、腾讯会议怎么使用2、腾讯会议特邀会议和常规会议有什么区别3、腾讯会议看不到其他人怎么解决 腾讯会议介绍腾讯会议怎么使用...

7

德国cn2云主机(nat云主机) 12分钟前

目录:1、请问老牌云拨号vps哪家最靠谱?2、请问现在CN2线路的云服务器什么价,去哪买3、CN2-是什么4、什么是CN2服务器,哪里的CN2服务器好...

8

mineserver怎么样的简单介绍 14分钟前

目录:...