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

大家好,我是IT修真院深圳分院第10期的JAVA学员,一枚正直纯洁善良的java程序员。

今天给大家分享一下,修真院官网Java任务6,深度思考中的知识点—为什么要使用MEMCACHE?MEMCACHE有什么作用?

1.背景介绍

Memcache是什么?

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

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

 

Memcache几种类型

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

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

memcache特征:

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服务:

在服务器上,进入Memcache安装目录下的,执行:memcached -d -p 11211 -m 256 

-d是开启守护进程的意思,-p 11211是指定开启的Memcache端口为11211,-m 256是开启Memcache的存储kong空间大小为256MB。

使用telnet进行连接(需在本机上开启安装Telnet功能):telnet  memcached_IP   memcached_PORT

如我的ip是47.XXX.xxx.xxx,端口默认是11211,则在cmd命令窗口输入:Telnet 47.XXX.xxx.xxx 11211,然后回车

注意这里ip地址跟端口号之间要有一个空格,不是冒号。

关闭Memcached服务

1.手动关闭memcached服务

查出进程PID:ps  -ef | grep memcached 

然后用命令kill将进程杀掉:kill  -9   PID 

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

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

 

管理操作:

1.stats命令:

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

stats 命令各统计项

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

清楚所有缓存:flush_all

用于清空memcached中所有的键值对

基本数据操作

set                设置指定键值对

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

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

get                获取指定键值对

delete           删除指定键值对

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

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

 

3、常见问题 

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

2)Redis与memcached有什么不同?

 

 

4、解决方案

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

在service层代码及时维护,增删改操作的时候,采用事物管理。

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

 

2)Redis与memcached有什么不同?

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.扩展思考

1)memcached适合做的东西?

     1、访问频繁的字典数据
     2、大量的hot数据(热门数据缓存)
     3、页面缓存(web站常用)
     4、搜索的查询条件和结果(热门搜索的内容缓存起来)
     5、临时处理数据(不需要入库,排重)

 

2)     memcached失效策略:

 Lazy expiration + LRU
Lazy expiration作用:假如我们所存储的数据项相当多的时候,在这时候进行监控的话,花费的代价是相当大的,所以memcached不会在过期监视上耗费过多的CPU时间,从而在性能方面也起到一定的优化作用。
  LRU:memcache会优先使用已超时的空间,但是还是会有追加信息时空间不足的状态,这时候会使用Least Recently Used(LRU)机制来分配空间,就从最近未被使用的记录中搜索,并将其空间分配给新的记录。

 

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

     service层代码及时维护
     尽量选择修改次数少,或一次性数据(验证码)

7.    参考文献

https://www.cnblogs.com/zhanghw0354/archive/2012/10/23/2735599.html
https://blog.csdn.net/kangvcar/article/details/78591899
https://blog.csdn.net/zhao13083837081/article/details/52957141

 

8.    更多讨论

1)memcached适合做的东西?

     1、访问频繁的字典数据
     2、大量的hot数据(热门数据缓存)
     3、页面缓存(web站常用)
     4、搜索的查询条件和结果(热门搜索的内容缓存起来)
     5、临时处理数据(不需要入库,排重)

 

2)     memcached失效策略:

 Lazy expiration + LRU
Lazy expiration作用:假如我们所存储的数据项相当多的时候,在这时候进行监控的话,花费的代价是相当大的,所以memcached不会在过期监视上耗费过多的CPU时间,从而在性能方面也起到一定的优化作用。
  LRU:memcache会优先使用已超时的空间,但是还是会有追加信息时空间不足的状态,这时候会使用Least Recently Used(LRU)机制来分配空间,就从最近未被使用的记录中搜索,并将其空间分配给新的记录。

 

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

     service层代码及时维护
     尽量选择修改次数少,或一次性数据(验证码)

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

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

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~我的邀请码:23656198,或者你可以直接点击此链接:http://www.jnshu.com/login/1/23656198

 

视频地址:https://v.qq.com/x/page/p07676h3bxd.html