memcached学习
既然要学memcached 我们就要知道他是什么然后就会看到一大堆概念
memcached是高性能的分布式内存缓存服务器。它通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。memcached的API使用32位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信
巴拉巴拉一大堆
虽然记不住但是我们找一些关键词
它是高性能分布式缓存服务器,
采用32位循环冗余校验(CRC-32)计算后存储在多台服务器上
有LRU机制
守护进程是用C写的能用各种语言连接
了解了概念接下来我们通过一个场景学习一下他的储存结构
上学的时候我们都经常做题,可能有这么一种情况 ,当你写某道题的时候,哎呀这个概念就是记不起来,怎么办呢 ,直接跳过去是吧,但是呢 我们又有强迫症,不写上去心里不舒服,于是我们就拿出了课本,开始找概念啊,啪的一声800多页的书拿不住掉在了桌子上,哎这么厚翻着好不方便啊,要是我能把这本书的内容都复制到脑子里,下次不会了我在脑子里把内容过一遍,是不是快的多了,想着想着就睡着了。现实骨干,梦里丰满。这时候一个白褂子长胡子老头飘过来。小子我看你骨骼精奇,送你一本最强最快的内功心法吧。你激动的叩拜感谢,喊着大师既然你肯将这么厉害的功夫传授给我。从此你就是我师傅,请受徒儿一拜。当你抬起头的时候那个老头已经不见了,手中出现了一本 “分布式缓存服务器memcached”
于是你盘腿而坐打算静心修炼一番,打开功夫第一章 memcached 内存分配机制 。读完标题一道金光发散而出随即你的身体被吸入其中,然后你深处一个国家,到处都是秘密麻麻的人啊,突然一道飓风吹来,你突然感觉到这飓风之中隐藏着巨大的杀气,你用力一跃,身体迅速上升。渐渐的你看到了整个国家的轮廓。虽然身处万米高空,但是你仍然能听得到地面的声音。不知为何自己的身体就这样漂浮在了那里,就如神人一般俯瞰这地下的整个王国。
当我在想这个王国是怎么来的时候就听到这样一个故事
这片大陆的掌控者会根据需要创建memcached 王国。
1. 指定memcached权限:既然要创建一个王国就要确定谁来掌控王国吧。总不能谁都能控制你的王国。都能来给你指指点点吧。于是就大笔一挥 -u root这个叫 root 的才能掌控这个王国。看他眉清目秀。必定是贤良之人啊。我觉得能管理好这个王国 (指定谁能够操作memcached)
2. 指定ip地址:创建王国就要告诉全天下你要把王国建在哪里啊。是不是需要找块风水宝地啊。然后咱们就找一块好地方呗。然后就开始找啊。突然发现 222.222.222.222 这个地方不错。风水宝地啊。于是就决定在这个地方建立国家了。大笔一挥 -l 222.222.222.222 告诉天下这个地方创建了王国。(指定服务器的ip)
3. 指定端口号:一个王国怎么可以没有大门呢,咱们设计一个大门吧。这个好啊。于是就建造了一个大门。有大门了就要告诉别人你大门在哪啊,从哪里进来啊。于是大笔一挥 -p 2222 。这就是大门的位置了就能进入我的王国了。(指定memcached监听的端口)
4. 指定分给memcached内存大小:创建一个王国就要划分一块地方用于存放自己的臣民啊。于是国王就根据自己国家人口的需要划定了100M(亩)地啊。但是呢,你想划100亩就有100亩么。别的国家又不知道啊。自己国家的子民也不知道啊。于是国王就要状告天下啊。于是大笔一挥 -m 100 。于是就告诉所有人自己的领土为 100M (指定分配给memcached的内存大小 单位M)
5.指定memcached客户端最大连接数:国王与外界通信需要信使,所以创建王国的时候就会确定一下我到底需要多少个信使,自己想完就需要状告天下啊 ,于是国王就拿出谕旨大笔一挥 -c 128 这样就确定自己王国需要招募128名信使。但是有的国王嫌麻烦就说我不想指定信使了让我的大臣来商议吧,大臣也懒啊,几个大臣一商议,以后这种情况我们都使用1024个人当信使吧。(指定客户端最大连接数)
6.指定memcached的Pid:王国创建好了总要给王国起个名字吧 这个简单 拿出我的大笔 一挥 -P myPid (注意这里是大写P)就叫这个国家myPid吧 (指定memcached的Pid)
7.设置启动方式为后台启动:创建完王国后。大陆的掌控者就离开了。(关闭连接memcached的窗口)就在这个时候海平面骤然上升把王国淹没。这时候掌控者发现这样不行啊。我还有很多事情需要做啊。不能一直在这里看着啊。我要想个办法。不如放在这个王国一个神器。这样就能不在我离开后被水淹没。于是就给这个王国了一个神奇 -d (启动一个守护进程)。
然后掌控者开开心心的飞走了。
下面是我看到的整个王国的轮廓

默认情况下这个王国很有趣哦
他会根据人口的数量进行划分成多个slab省。每个slab省里面又有page市、page市的默认领土面积是1M、在page市里面有分了许多的chunk县。每个chunk县的区域才是人口居住的地方。默认情况只能有80人(80byte)入住。最有趣的是memcached王国分配土地的人有很强的强迫症、为什么这么说呢。每个slab省里面的page市有1M的面积,但是划分出来的县级默认为80byte,这样就会有一个问题,如果page市里面最后的土地不够划分一个chunk省了会怎么办?这个王国是最任性的 我就这样空着什么也不做。
因为这个王国刚开始可能并没有那个多的人口所以在领土中就会根据需要开辟slab省,其余为未开辟的原始森林。
还有一个更有趣的事情是每个slab省中默认page面积为1M 但是每个slab省中chunk县的大小是依次递增的。这个增长因子默认为1.25。虽然不同的slab省中chunk大小不同,但是同一个slab省中chunk大小却是相同的。刚开是我也很迷,为什么这么做呢。
这还是因为这个memcached王国是一个强迫症,他会把所有王国中的人 (数据) 根据年龄 (数据大小) 把这些人分配到不同的salb省中的chunk县中居住 (存储) 这样有什么好处呢?那就是更好的节省王国的土地。
既然是个王国那必定会有人口的流动啊,接下来就说一下人口流动问题 ( 数据交互 )
上面咱们说了 memcached王国把自己的地理位置222.222.222.222 和大门的位置 2222 都公示出去了这样就有人找到这个王国想要来看看啊。所以就有了 下图的场景

1. 存储数据
外来人口 ( 我们就叫这个外来人口小王吧) 找到大门 ,发现有个门卫。
小王吧来到门口 给门卫说我要进去
这时候门卫就问了你叫什么啊 ? 小王吧说我叫小王吧 (设置key)
门卫又问了 你性格怎样啊 ? 小王吧说我性格比较外向 ( 设置flags )
门卫又问了 你是来常住啊 还是 临时啊 ?小王吧说 我常驻 (设置 exTime,按秒为单位)
门卫又问了 你多大啊?小王吧说我80byte (设置 length)
那好吧 我给你开个条子你就能进去了,但是你要填写你来做什么
于是门卫给小王吧开了个条
(set key flags exTime length)
set k1 0 0 2
v1
( 这里存储数据可以使用set和add 两者的区别是 add 只能在key 不存在的时候才能添加,而set 什么情况都能添加)
2.修改数据
【待写】
3.删除数据
【待写】
当有人员离开(过期)或者死亡(删除delete),天灾死亡(flush all 清空操作) 给他分配居住的地方并没有销毁,而是记录在人口薄(Slot中 )
数据是如何存储的
外来人员居住的时候会根据他的年龄 (数据长度) 把他安排到符合他年龄的chunk县中 ,
1. 首先呢会先看看人口薄中有没有合适的位置。如果有就直接安排进去,如果没有,就会看有没有空余的chunk县,如果这个slab中有空闲的chunk县就直接安排进去,如果没有就会在这个人对应的slab省中进行人口筛查(触发LRU流程)把那些经常没有贡献的人驱赶替换为新来的人(很久没有使用的数据会被替换 具体看LRU 算法介绍 ) ,如果没有符合他年龄的chunk 就会重新在 原始森林中开辟一块新地存储对应大小的年龄(存储对应大小的数据)
什么是LRU算法
可以这样理解 LRU算法 会把数据存储在一个特殊的栈中 每当访问一个栈中的数值的时候会把栈中的这个数据移除并重新压入栈顶,新添加一个数据时会把这个数据也压入栈顶,当栈中存储满的时候会先把栈底的数据移除并把新数据压入栈顶。
【其他内容有待补充】
【memcached分布式原理】
【余数hash算法】
【一致性hash算法】
文章是自己学习的总结,如有问题望各位指出
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
