Memcached相关内容总结
1.Memcached常用命令總結(jié)
Memcached命令格式一般為:
command
其中描述如下:
| command | 操作命令,一般為set/add/replace/get/delete等 |
| key | 緩存的key,Memcache內(nèi)部限制不能超過(guò)250個(gè)字符, |
| flag | 標(biāo)識(shí)數(shù)據(jù)格式,比如JSON、XML等 |
| expiration time | 過(guò)期時(shí)間,單位為s,0為不過(guò)期,最好設(shè)置過(guò)期時(shí)間,以免保存大量無(wú)效數(shù)據(jù),最大過(guò)期時(shí)間為30天,超過(guò)30天則緩存獲取不到 |
| bytes | 字節(jié)數(shù),比如1234,則字節(jié)數(shù)為4 |
| value | 緩存中的值 |
比如以下命令:
set name 0 0 4 test// key 為name,value為test,字節(jié)數(shù)4個(gè),緩存不過(guò)期常用命令列表如下:
| set | 添加或者更新 |
| get | 獲取數(shù)據(jù) |
| add | 數(shù)據(jù)不存在的時(shí)候添加 |
| replace | 數(shù)據(jù)存在的時(shí)候替換value的值 |
| append | 后面追加 |
| prepend | 前面追加 |
2.Memcached主要特征
1.協(xié)議簡(jiǎn)單
server和client的通信并不使用復(fù)雜的XML或者json協(xié)議,而是使用簡(jiǎn)單的文本協(xié)議和二進(jìn)制協(xié)議2.內(nèi)置內(nèi)存存儲(chǔ)方式
Memcached是純內(nèi)存存儲(chǔ),不支持持久化,因此當(dāng)Memcached重啟或者機(jī)器重啟的時(shí)候所有數(shù)據(jù)會(huì)丟失。因此會(huì)存在數(shù)據(jù)重啟無(wú)法恢復(fù)的問(wèn)題。
3.Memcached使用客戶端分布式
Memcached服務(wù)端沒(méi)有分布式的功能,各個(gè)實(shí)例之間并不會(huì)互相通信或者數(shù)據(jù)共享,因此需要依賴客戶端實(shí)現(xiàn)分布式。3.Memcached存在的問(wèn)題
1.因此會(huì)存在數(shù)據(jù)重啟無(wú)法恢復(fù)的問(wèn)題 可以通過(guò)配合持久化數(shù)據(jù)庫(kù)MemcachedDB使用 2.無(wú)法通過(guò)key做范圍查詢3.沒(méi)有提供高可用相關(guān)支持,只能通過(guò)客戶端邏輯來(lái)處理,比如寫入的時(shí)候同時(shí)寫入主備服務(wù)器4.Memcached內(nèi)存存儲(chǔ)分析
Memcached使用Slab Allocator機(jī)制分配和管理內(nèi)存,這種分配機(jī)制可以減少內(nèi)存碎片的產(chǎn)生,減輕系統(tǒng)管理內(nèi)存的負(fù)擔(dān)。
Slab Allocator的分配機(jī)制其實(shí)很簡(jiǎn)單,就是將內(nèi)存分割成各種尺寸的內(nèi)存快(Chunk)并將尺寸相同的內(nèi)存塊分組Slab Class。其中分配的快可以重新利用,不會(huì)釋放到內(nèi)存中。
其中分配給Slab Class的內(nèi)存空間為Page(默認(rèn)大小為1MB)。
內(nèi)存分配結(jié)構(gòu)大致如下:
分配的內(nèi)存快大小目前默認(rèn)最小內(nèi)存塊為:88Bytes,Growth Factor決定了內(nèi)存塊增長(zhǎng)的幅度,默認(rèn)值為1.25,可以通過(guò)啟動(dòng)參數(shù)配置。
這種分配方式在一定程度上也會(huì)造成內(nèi)存的浪費(fèi),比如要保存100字節(jié)的數(shù)據(jù)的時(shí)候,只能放到112Bytes的內(nèi)存塊中,剩余的12Byte內(nèi)存空間被浪費(fèi)。
結(jié)構(gòu)中各個(gè)部分?jǐn)?shù)量的計(jì)算:
Page個(gè)數(shù) = 內(nèi)存總空間 / 1MB 各個(gè)Page中Chunk的個(gè)數(shù) = 1MB / Chunk的大小 Chunk大小計(jì)算 = 初始值 * Growth Factor當(dāng)設(shè)置緩存的時(shí)候,會(huì)根據(jù)Item的大小來(lái)決定保存到那個(gè)Slab Class中,其中Item大小為:
key長(zhǎng) + value長(zhǎng)度 + 后綴長(zhǎng)度 + item長(zhǎng)度大小(32個(gè)字節(jié))其中Memcached可以保存的數(shù)據(jù)Item最大為1MB。
5.Memcached典型問(wèn)題分析
對(duì)于Memcached的使用中一般會(huì)出現(xiàn)以下問(wèn)題:
1. 容量問(wèn)題 單一節(jié)點(diǎn)無(wú)法突破內(nèi)存上限 2. 服務(wù)高可用 服務(wù)宕機(jī)會(huì)導(dǎo)致訪問(wèn)全部穿透數(shù)據(jù)庫(kù) 3. 擴(kuò)展問(wèn)題 無(wú)法突破單實(shí)例請(qǐng)求峰值Memcached當(dāng)達(dá)到內(nèi)存上線的時(shí)候,會(huì)對(duì)內(nèi)存數(shù)據(jù)進(jìn)行垃圾回收,垃圾回收有兩種方式:
1.Lazy模式,Memcached不會(huì)自動(dòng)去檢查數(shù)據(jù)的過(guò)期情況,而是在查詢的時(shí)候,檢查數(shù)據(jù)的過(guò)期情況,然后對(duì)數(shù)據(jù)進(jìn)行相應(yīng)處理。 2.使用LRU算法進(jìn)行內(nèi)存垃圾回收(最近最少使用算法) 其中垃圾回收是在Slab Class范圍內(nèi)的,并不是全局的LRU對(duì)于Memcached使用集群的方式,有兩種算法來(lái)計(jì)算緩存落在那一臺(tái)緩存機(jī)器。
方法一: key.hashCode() / 緩存節(jié)點(diǎn)個(gè)數(shù) 缺點(diǎn):當(dāng)對(duì)分布式緩存中添加、刪除或者節(jié)點(diǎn)故障剔除操作中,會(huì)導(dǎo)致所有的歷史數(shù)據(jù)都無(wú)法找到 方法二:使用一致性哈希算法可以解決1中的問(wèn)題數(shù)據(jù)一致性問(wèn)題怎么解決
key沖突的問(wèn)題解決
可以使用明明空間,對(duì)于不同的系統(tǒng),使用不同的明明空間,比如前綴:ns_
轉(zhuǎn)載于:https://www.cnblogs.com/vitasyuan/p/9463400.html
總結(jié)
以上是生活随笔為你收集整理的Memcached相关内容总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用PHPCS+GIT钩子保障团队开发中
- 下一篇: 祈祷平安的句子简短 愿世间无灾无病的句子