没有合适的资源?快使用搜索试试~ 我知道了~
Memcached使用点滴.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 12 浏览量
2021-09-13
19:34:05
上传
评论
收藏 23KB DOCX 举报
温馨提示
试读
14页
...
资源推荐
资源详情
资源评论
Memcached 使用点滴
我对于 Memcached 的接触,还是在去年看了 CSDN 的一系列国外大型
网站架构设计而开始的。最初的时候只是简单的封装了 MemcachedJava 版
的客户端,主要是对于配置的简化以及 Memcached 多点备份作了一些工作,
然后就作为 ASF 的组件一部分提供给其他 Team 使用。其实看过
MemcachedJava 客户端代码的人就会了解其实客户端的事情很简单,就是
要有一套高性能的 Socket 通信框架以及对 Memcached 的私有协议实现的
接口,自己去做这些事情也是很简单的,不过既然有可以满足自己需求的
开源部分,那么就去实现自己需要的但没有实现的。这里我用的是
Whalin 的客户端版本,这里为什么还要提出来讲这个,后面会提到。
在对 Java 客户端作了简单封装和扩展以后,由于其他 Team 使用的没
有什么特殊需求,也就没有再去做太多的修改,直到最近自己的服务集成
平台需要做服务访问控制,才重新丰富了 Cache 组件,也就是这个过程中
对于 Memcached 的一些特性和小的细节有了一些新的认识。
作为服务集成平台需要对服务有所监控,包括访问频率控制以及访问
次数控制。频率控制其实很类似于硬件方面的频率控制,例如硬件可以对
IP 的高频率访问视为攻击,列入黑名单。而作为服务的访问,对于服务
访问者的控制其实涉及到了业务参数,那么硬件就不是很适合去做这方面
的控制,为此我也考虑了很久,最开始打算在 Apache 上做一个模块控制,
但是最后觉得还是放在后面的业务框架上做这件事情。当然后面我说说的
方案可能并不好,但是也算是一种想法。要把频繁的访问数据记录下来同
时分析,那么数据库肯定是不行的,最简单的方式就是采用 Cache,又因
为是集群范围内的控制,那么集中式 Cache 就非 Memcached 莫数了(分布
式的 Cache 传播本身损耗太大,集中式 Cache 本来的最大缺点就是单点,
但作简单的备份操作就可以基本解决此类问题)。
作为解决这个问题的方法来说只需要实现两部分工作:访问计数器,
定时任务。定时任务在我做日志分析框架的时候都是采用了 Jdk5 的
Concurrent 包里面的 ScheduledE 某 ecutorService,这个作简单的循环
任务足够用了,同时也是有很好的多线程异步支持,复杂一点么用
Quartz。计数器就要靠 Memcached 来实现了,本来一般的 Cache 最大的问
题就是高并发下的事务保证,如果采用 Get+Set 来完成计数的话,那么高
并发下计数器就会出现读写不一致性的问题,幸好 Memcached 提供了计数
累加功能,让这种累加动作能够在服务端一次做好,服务端控制并发写入,
保证数据的一致性。
下面就看看以下几个方法:
booleantoreCounter(Stringkey,longcount):存储 key 的计数器,
值为 count。
longgetCounter(Stringkey):获取 key 的计数器,如果不存在返回-
1。
longaddOrDecr(Stringkey,longdecr):计数器值减去 decr,如果计
数器不存在,保存 decr 作为计数器值
longaddOrIncr(Stringkey,longinc):计数器值增加 inc,如果计数
器不存在,保存 inc 作为计数器值
longdecr(Stringkey,longdecr):与 addOrDecr 不同的是在计数器不存在
的时候不保存任何值,返回-1
longincr(Stringkey,longinc):与 addOrIncr 不同的是在计数器不存在
的时候不保存任何值,返回-1
这里需要说明几点:
toreCounter 和普通的 et 方法不同,如果通过 et 方式置入
key:value 的话,getCounter 等其他四个方法都认为技术器不存在。所以
Counter 的存储方式是和普通内容存储不同的。
在不同的场景要慎用 addOr 某某某某和某某某某的方法,两者还是有
比较大的区别的。
计数器没有提供移除特殊方法,使用 delete 方法可以移除计数器,
但是频繁的 delete 和 addOr 某某某某有时候会出现一些奇怪的问题(例
如同名的计数器就没有办法再次被创建,不过这个还需要进一步的去研究
一下看看)。一般情况下如果计数器的 key 不是很多,同时也会被复用,
那么可以通过置为 0 或者减去已经分析过的数量来复位。
有上面的一套计数器机制就可以很方便的实现 Memcached 的计数功能,
但是又一个问题出现了,如何让定时任务去遍历计数器,分析计数器是否
到了阀值,触发创建黑名单记录的工作。早先我同事希望我能够提供封装
好的 keySet 接口,但是我自己觉得其实作为 Cache 来说简单就是最重要
的,Cache 不需要去遍历。首先使用 Cache 的角色就应该知道 Key,然后
去 Cache 里面找,找不到就去后台例如 DB 里面去搜索,然后将搜索的结
果在考虑更新到 Cache 里面,这样才是最高效并且最可靠的,Cache 靠不
住阿,随时都可能会丢失或者崩溃,因此作为类似于一级缓存或者这类数
据完整性要求不
高,性能要求很高的场景使用最合适。当时就没有提供这样的接口,
直到今天自己需要了,才考虑如何去做这件事情。
剩余13页未读,继续阅读
资源评论
苦茶子12138
- 粉丝: 1w+
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功