为什么要使用memcache?memcashe有什么作用?

小课堂

分享人:闵仕宇

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

简单介绍

memcached是一种缓存技术,存储在内存中(高性能分布式内存缓存服务器)。目的:提速。(传统的都是把数据保存在关系型数据库管理系统即RDBMS,客户端请求时会从RDBMS中读取数据并在浏览器中显示,这样当访问量过大时或集中时,导致RSBMS负担过重,数据库响应恶化,浏览器中显示延迟等严重问题,使用memcached减少数据库查询和访问次数以提高访问速度,提高扩展性) memcached为key->value非关系型数据库,key为一般字串,值唯一。value除了php中的资源不能存,其它的数据都能存储(字符串、数值、数组、对象、布尔值、null、二进制<图片、视频>)

Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,也就是一个是项目名称,一个是主程序文件名

Memcached Client目前有3种: Memcached Client for Java, SpyMemcached, XMemcached

这三种Client一直存在各种争议: Memcached Client for Java 比 SpyMemcached更稳定、更早、更广泛; SpyMemcached 比 Memcached Client for Java更高效; XMemcached 比 SpyMemcache并发效果更好。

memcached特征:

1、协议简单(文本行协议)

2、基于libevent事件处理(注:libevent是一个程序库,封装了linux的epoll、BSD类操作系统的kqueue等事件处理功能。即使对服务器的连接数添加,也能发挥O(1)的性能。memcached在linux、BSD等操作系统上能发挥其高性能。)

3、内置内存存储方式(存储在memcached内置的内存存储空间中,提高性能。 问题:memcached重启或操作系统重启数据会丢失,达到一定量后会启动算法自动删除不使用的缓存)

4、不互相通信的分布式(不互相通信共享信息。)

2.知识剖析

memcache工作原理:

memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件, 从而极大的提高网站的运行效率。

采用的是C/S模式,在 server 端启动服务进程,在启动时可以指定监听的 ip,自己的端口号, 所使用的内存大小等几个关键参数。采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。 每个 Server 只是对自己的数据进行管理。Client 端通过指定 Server 端的 ip 地址(通过域名应该也可以)。 以key->value形式,key 的值通过 hash 进行转换,然后确定对那台sever存储/获取数据。

命令:

开启memcached服务:

memcached -d -p 11211 -m 256

使用上述的指令是以守护进程的形式开启memcached服务,端口为11211,使用256MB大小的内存空间存储数据。

使用telnet进行连接:

telnet memcached_IP memcached_PORT

启动和关闭:

启动memcached 很简单,在shell中输入memcached即可

1.手动关闭memcached服务

ps -ef | grep memcached

kill -9 PID

2. 创建时保存进程PID到文件,关闭的时候直接从文件获取PID

需要关闭此memcached服务时,直接读取对应文件的PID,然后使用kill -9 PID 杀死即可。

管理操作:stats、flush_all 操作:

stats

是statistics单词的拼写,即统计的意思。该指令攻击当前memcached服务的各种指标。 这些指标跟memcached 的性能和工作状况紧密相关。

flush_all

flus_all 指令用于清空memcached中所有的键值对。

基本数据操作

set 设置指定键值对

add 若当前键值Key不存在,添加指定键值对

replace 若当前键值Key存在,更新当前Value值

get 获取指定键值对

delete 删除指定键值对

1. set、add、replace 操作指令需要输入两行才能完成,第一行是指令前段,第二行是value值;

2. set、add、replace操作指定的字节数 参数的大小要和第二行输入的字符串的个数保持完全相同, 否则将会报:“CLIENT_ERROR bad data chunk”

高级数据操作

gets 获取键值key对应的值,返回信息中携带版本号

cas 指定版本号对键值key进行赋值,版本号不匹配,允许赋值

cas 的操作语法如下:

cas key flags expiration_time length version

缓存管理操作

stats 统计当前memcached 的数据信息。

flush_all 清空当前memcached 服务的所有缓存数据

3.常见问题

数据库信息更改,怎么保证缓存和数据库的信息一致?

Redis与memcached有什么不同?

4.解决方案

service层代码及时维护

尽量选择修改次数少,或一次性数据(验证码

1.数据库类型支持不同

与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多。

最为常用的数据类型主要由五种:String、Hash、List、Set和Sorted Set。 Redis内部使用一个redisObject对象来表示所有的key和value。

2.内存管理机制不同

在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。 当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘。

3.集群管理不同

Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略: RDB快照和AOF日志。而memcached是不支持数据持久化操作的。

4.内存管理机制不同

Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。

Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。

Redis更偏向于在服务器端构建分布式存储。最新版本的Redis已经支持了分布式存储功能。Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,具有线性可伸缩的功能。

5.编码实战

6.扩展思考

memcached适合做的东西?

memcached失效策略?

memcached适合做的东西:

1、访问频繁的字典数据

2、大量的hot数据(热门数据缓存)

3、页面缓存(web站常用)

4、搜索的查询条件和结果(热门搜索的内容缓存起来)

5、临时处理数据(不需要入库,排重)

memcached失效策略:

Lazy expiration + LRU

Lazy expiration作用:假如我们所存储的数据项相当多的时候,在这时候进行监控的话,花费的代价是相当大的, 所以memcached不会在过期监视上耗费过多的CPU时间,从而在性能方面也起到一定的优化作用。

LRU:memcache会优先使用已超时的空间,但是还是会有追加信息时空间不足的状态, 这时候会使用Least Recently Used(LRU)机制来分配空间,就从最近未被使用的记录中搜索,并将其空间分配给新的记录。

7.参考文献

https://blog.csdn.net/guugle2010/article/details/40115675

https://blog.csdn.net/luanlouis/article/details/42425105

https://my.oschina.net/willSoft/blog/39311

http://www.cnblogs.com/loveincode/p/7411911.html

8.更多讨论

Thanks

By : 上海分院 闵仕宇