为什么选择Memcache

一、缓存什么时候用?

数据量增大后,直接频繁操作数据库会对库造成很大的压力,对于变更不太频繁,读的频率远大于写的频率,而且对实时性要求不太高的内容,放在缓存中,能减小数据库压力,提高访问速度。下图为使用缓存和不使用缓存时的请求处理流程:

可见,在使用了缓存后,直接通过缓存取数据,减小了数据库的压力。

二、缓存技术Redis?

现在所在的项目缓存技术用的是Memcache,都知道Memcache和Redis一样,都用做缓存之用。一直被旁人灌输的就是Redis的种种优越性,二者相比,Redis的两大特点是:

(1)Memcache只能存储键值对,Redis除了可以存储键值对而外,还支持list、set等数据类型;

(2)Memcache存储的数据只能放在内存中,而Redis支持数据的持久化,可以定期将内存中的数据持久化到硬盘上。

如此看来,Redis似乎要优于Memcache,那么,Memcache应该作为被抛弃的对象才对,为什么还会有人选择它呢?

三、为什么要用Memcache?

    (1)考虑具体应用目的:

在视频专区这个项目中,前台首页分版块展示视频节目的封面图片,通过封面链接到视频的详情页,进行视频的播放。这些内容变更不频繁,正好符合使用缓存的条件,到底该使用哪种缓存技术呢?在Redis和Memcache的选择中:1、存取图片只需要进行简单的key-value存储,不需要更多的数据类型;2、首页内容不需要持久化到硬盘;3、经过调研,在100k以上的数据中,Memcache性能要高于Redis,对于大数据的存储,Memcache还是要占优势一些。结合以上三点,最终项目选择使用Memcache。

当然,业务不同选择也各不相同,总之一句话,合理分析合理选择。

    (2)Memcache二三事:

   1、工作原理:

Memcache的工作模式并不复杂,同样也是惯用的C/S模式,分为服务器端和客户端。服务器端启动后就一直保持可用状态,等待客户端的连接。在Memcache中数据使用key-value的形式进行存储,你可能会问,key如何生成和管理呢?还是具体问题具体分析,生成规则可以根据业务自己来定,假如你要存用户名,那么就可以用用户id来作为key。key的值通过hash进行转换,根据 hash值把value传递到对应的具体的某个 服务器上。当需要获取对象数据时,也要对key进行hash,通过获得的值可以确定它被保存在了哪台Server上,然后再向该Server发出请求获取数据,客户端只需要知道保存hash(key)的值在哪台服务器上就可以了。

说到底,Memcache的工作就是在专门的机器的内存里维护一张巨大的hash表,来存储经常被读写的一些数组与文件。

 2、分布式:

单台Memcache的内存容量的有限的,Memcache可以实现分布式来扩充内存,例如可以由10台8G内存的机器,构成一个80G的内存池,如果觉得还不够大可以增加机器,这样一个大的内存池,完全可以把大部分热点业务数据保存进去,由内存来阻挡大部分对数据库读的请求,对数据库释放可观的压力。

它的分布式是怎么实现的呢?个人对这部分内容很好奇。Memcache服务器端仅提供存储功能,等待客户端的连接,分布式主要通过客户端路由来实现。每次存取某key的value时,通过某种算法把key映射到某台Memcached服务器节点上,因此这个key所有操作都在这个节点上。怎么才能让数据平均到所有服务器上呢?经常采用的是hash算法。hash后对服务器数目n取模,假设有3台机子,余数为1即分配到第一台机子。

顿时我产生了一个疑问,分布式的机子只要有一个宕机了,服务器数目发生变化,key的分配就会发生根本性的变化,怎样才能使影响最小化呢?consistent hashing思想应运而生,它指的是服务器节点的hash值配置到一个0到232的圆上,同时求出key的hash值,也映射到圆上,然后顺时针找到的第一个服务器即为保存数据的服务器。这样一来,增加或减小服务器,只会影响增加或减小点之前的数据分布。我不禁对如此精妙的思想感到万分佩服。

四、后记

对于Memcache,暂时只是将了解的皮毛总结记录下来,希望后续一步一步学习后能持续更新。

时间: 2024-10-12 15:02:58

为什么选择Memcache的相关文章

我为什么选择使用Go语言?

谢孟军:EGO会员.GopherChina组织者.<Go Web编程>一书的作者,专注Golang技术架构.本文来自EGO会员群分享,入群方式见文末 在这里我主要想和大家分享一些Go和我个人的成长史.首先聊聊Go,在2009年全部开源出来后,它获得了当年的年度语言,但是直到2011年它才发布正式的稳定版本.Go稳定版发布时,Go Team承诺后续的版本都会兼容之前的版本.这对于我们开发者来说简直太重要了,Go后续的版本也一直在提升内功,从而可以让我们无缝的升级Go版本. Go的核心贡献者 Go

Redis简介 &amp; 与Memcache的区别

redis 是一个基于内存的高性能key-value数据库. Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存.因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB.        Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制

nginc+memcache

memcache 分为服务端和客户端.服务端用来存放缓存,客户端用来操作缓存.因此,可以使用 Nginx 直接访问 Memcache,并用$uri 和$args 等 Nginx 内置变量设定缓存 key规则,这样,当缓存命中时,Nginx 可以跳过通过 fastcgi 和 PHP 通信的过程,直接从 memcache中获取数据并返回.OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

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

Memcache学习总结2-Memcache的使用基本介绍

Memcache学习总结2-Memcache的使用基本介绍 上一次总结中我们已经安装部署好了Memcached,并且把PHP扩展Memcache也安装好了,这一节我们详细学习一下PHP扩展Memcache.Memcache客户端包含两组接口,一组是面向过程的接口,一组是面向对象的接口,具体可以参考PHP手册:http://php.net/manual/zh/book.memcache.php . 我们为了简单方便,就使用面向对象的方式,也便于维护和编写代码,那我们先来一段示例代码吧. Memca

MemCache超详细解读

MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度.MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串.对象等)所使用的key-value存储,数据可以来自数据库调用.API调用,或者页面渲染的结果.MemCache设计理念就是小而强大,它简单的设计促进了快速部署.易于开发并解决面对大规模的数据缓存的

我为什么选择go语言

这里,我并不打算引起语言争论的口水仗,我并不是什么大牛,对语言的造诣也不深,只是想通过自己实际的经历,来说说为什么我在项目中选择go. 其他语言的经历 C++ 在接触go之前,我已经有多年的c++开发经验.主要用在游戏服务端引擎开发以及P2P上面,那可是一段痛并快乐的时期,以至于我看到任何的程序钉子问题都觉得可以用c++这把锤子给敲定.但是对于互联网项目开发来说,除非你的团队整体的c++技术水平nb,并且有很强的代码规范,不然真可能是一场灾难,更别说我们现有团队几乎没其他人会这玩意了. 本来,我

mysql+nginx+php+memcache

***************** mysql+nginx+php+memcache ****************** 1.Mysql 安装 软件包依赖性: # yum install -y gcc-c++ make ncurses-devel bison openssl-devel zlib-devel cmake-2.8.12.2-4.el6.x86_64.rpm # tar zxf mysql-boost-5.7.17.tar.gz # cd mysql-5.7.17/ cmake -

nginx+tomcat+memcache

nginx支持静态页面tomcat支持动态页面如果所在的nginx服务器想要进行动态页面则需与tomcat结合此时nginx只是起到转发的作用对jsp的处理是由tomcat来处理的. 一 搭建jdk 先搭建java环境 1  tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/    ###解压到/usr/local下### 2 ln -s jdk1.7.0_79/ java            ###软链接方便版本升级后的使用### 3 vim /