为什么要使用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 命令各统计项
清楚所有缓存: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