为什么要使用MEMCACHE?MEMCASHE有什么作用?

大家好,我是IT修真院,一枚正直纯洁善良的如刚入门的Java程序员,今天跟大家分享一下修真院官网JAVA任务六,深度思考中的知识点————为什么要使用MEMCACHE?MEMCASHE有什么作用?


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

  1. 创建时保存进程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


今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT

视频


技能树.IT修真院

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~

作者:闵仕宇

不足之处,欢迎指正~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值