天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

Memcached使用點滴

  我對于Memcached的接觸,還是在去年看了CSDN的一系列國外大型網站架構設計而開始的。最初的時候只是簡單的封裝了Memcached Java版的客戶端,主要是對于配置的簡化以及Memcached多點備份作了一些工作,然后就作為ASF的組件一部分提供給其他Team使用。其實看過Memcached Java客戶端代碼的人就會了解其實客戶端的事情很簡單,就是要有一套高性能的Socket通信框架以及對Memcached的私有協議實現的接口,自己去做這些事情也是很簡單的,不過既然有可以滿足自己需求的開源部分,那么就去實現自己需要的但沒有實現的。這里我用的是Whalin的客戶端版本,這里為什么還要提出來講這個,后面會提到。

       在對Java客戶端作了簡單封裝和擴展以后,由于其他Team使用的沒有什么特殊需求,也就沒有再去做太多的修改,直到最近自己的服務集成平臺需要做服務訪問控制,才重新豐富了Cache組件,也就是這個過程中對于Memcached的一些特性和小的細節有了一些新的認識。

       作為服務集成平臺需要對服務有所監控,包括訪問頻率控制以及訪問次數控制。頻率控制其實很類似于硬件方面的頻率控制,例如硬件可以對IP的高頻率訪問視為攻擊,列入黑名單。而作為服務的訪問,對于服務訪問者的控制其實涉及到了業務參數,那么硬件就不是很適合去做這方面的控制,為此我也考慮了很久,最開始打算在Apache上做一個模塊控制,但是最后覺得還是放在后面的業務框架上做這件事情。當然后面我說說的方案可能并不好,但是也算是一種想法。要把頻繁的訪問數據記錄下來同時分析,那么數據庫肯定是不行的,最簡單的方式就是采用Cache,又因為是集群范圍內的控制,那么集中式Cache就非Memcached莫數了(分布式的Cache傳播本身損耗太大,集中式Cache本來的最大缺點就是單點,但作簡單的備份操作就可以基本解決此類問題)。

       作為解決這個問題的方法來說只需要實現兩部分工作:訪問計數器,定時任務。定時任務在我做日志分析框架的時候都是采用了Jdk5Concurrent包里面的ScheduledExecutorService,這個作簡單的循環任務足夠用了,同時也是有很好的多線程異步支持,復雜一點么用Quartz。計數器就要靠Memcached來實現了,本來一般的Cache最大的問題就是高并發下的事務保證,如果采用Get+Set來完成計數的話,那么高并發下計數器就會出現讀寫不一致性的問題,幸好Memcached提供了計數累加功能,讓這種累加動作能夠在服務端一次做好,服務端控制并發寫入,保證數據的一致性。

下面就看看以下幾個方法:

boolean storeCounter(String key, long count)存儲key的計數器,值為count

long getCounter(String key):獲取key的計數器,如果不存在返回-1

long addOrDecr(String key, long decr):計數器值減去decr,如果計數器不存在,保存decr作為計數器值

long addOrIncr(String key, long inc):計數器值增加inc,如果計數器不存在,保存inc作為計數器值

long decr(String key, long decr):與addOrDecr不同的是在計數器不存在的時候不保存任何值,返回-1

long incr(String key, long inc) :與addOrIncr不同的是在計數器不存在的時候不保存任何值,返回-1

這里需要說明幾點:

storeCounter和普通的set方法不同,如果通過set方式置入key:value的話,getCounter等其他四個方法都認為技術器不存在。所以Counter存儲方式是和普通內容存儲不同的。

在不同的場景要慎用addOrXXXXXXXX的方法,兩者還是有比較大的區別的。

計數器沒有提供移除特殊方法,使用delete方法可以移除計數器,但是頻繁的deleteaddOrXXXX有時候會出現一些奇怪的問題(例如同名的計數器就沒有辦法再次被創建,不過這個還需要進一步的去研究一下看看)。一般情況下如果計數器的key不是很多,同時也會被復用,那么可以通過置為0或者減去已經分析過的數量來復位。

       有上面的一套計數器機制就可以很方便的實現Memcached的計數功能,但是又一個問題出現了,如何讓定時任務去遍歷計數器,分析計數器是否到了閥值,觸發創建黑名單記錄的工作。早先我同事希望我能夠提供封裝好的keySet接口,但是我自己覺得其實作為Cache來說簡單就是最重要的,Cache不需要去遍歷。首先使用Cache的角色就應該知道Key,然后去Cache里面找,找不到就去后臺例如DB里面去搜索,然后將搜索的結果在考慮更新到Cache里面,這樣才是最高效并且最可靠的,Cache靠不住阿,隨時都可能會丟失或者崩潰,因此作為類似于一級緩存或者這類數據完整性要求不高,性能要求很高的場景使用最合適。當時就沒有提供這樣的接口,直到今天自己需要了,才考慮如何去做這件事情。

       開始考慮是否能夠將key都記錄在另外的Cache中或者是Memcached中,首先在高并發下更新操作就是一大問題,再者Memcached的內存分配回收機制以及Value的大小限制都不能滿足這樣的需求,如果使用數據庫,那么頻繁更新操作勢必不可行,采用異步緩存刷新又有一個時間間隔期,同時更新也不是很方便。最后考慮如果能夠讓Memcached實現Keyset那么就是最好的解決方案,網上搜索了一下,找到一種策略,然后自己優化了一下,優化后的代碼如下:

Code

NET技術Memcached使用點滴,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 好好的曰com久久 | 亚洲天堂av2017 | 学生妹被爆插到高潮无遮挡 | 宫交拔不出来了h黑人 | 亚洲熟女丰满多毛XXXXX | 18禁裸乳无遮挡免费网站 | 99久久精品国产一区二区三区 | 日韩欧美视频一区二区在线观看 | 最新国产精品福利2020 | 在线观看qvod | 嫩草成人国产精品 | A级毛片高清免费网站不卡 a级毛片高清免费视频 | 精品国产乱码久久久久久免费流畅 | 免费可以看污动画软件 | 日韩亚洲人成在线 | ai换脸在线全集观看 | 国产精品无码麻豆放荡AV | 泡妞高手在都市免费观看 | 色婷婷综合激情中文在线 | 欧美一区二区影院 | 久久精品一卡二卡三卡四卡视频版 | 男人到天堂a线牛叉在线 | 免费久久狼人香蕉网 | 性色少妇AV蜜臀人妻无码 | 亚洲综合免费视频 | 99久久中文字幕伊人情人 | 99久久国产露脸精品国产麻豆 | 国产亚洲欧洲日韩在线观看 | 神马伦理不卡午夜电影 | 诱受H嗯啊巨肉舍友1V1 | 女人久久WWW免费人成看片 | 国产又色又爽又刺激在线播放 | 秋霞电影网午夜鲁丝片无码 | 国产99久久九九免费精品无码 | 亚洲高清在线天堂精品 | 中文字幕在线观看网址 | 国产三级在线观看视频 | 免费国产黄线在线播放 | 99久久免费国产精精品 | 一级淫片bbbxxx | 月夜直播视频免费观看 |