大家好,我是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
- 创建时保存进程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 删除指定键值对
set、add、replace 操作指令需要输入两行才能完成,第一行是指令前段,第二行是value值;
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
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~
作者:闵仕宇
不足之处,欢迎指正~