(原)使用 memcache 使用过程中可能遇到的问题
在项目优化中,使用到了memcache,刚开始不能用,后来期间总会偶尔抛出异常,刚开始怀疑动态库版本问题,后来尝试了各种替换依旧误解,搞得我日思夜想的,天天惦记着他。。=_=
下午拿出半天时间,进行错误精准定位,问题解决了,,,整理一下,可能会遇到的问题。
一、MemcachedClient 对象或者所在的类为静态全局的,否则,会因为多实例共抢bufferstream资源导致异常。如下图:
二、存入的缓存中的key值中不能包含空格,否则,会偶尔抛出上图错误。key的长度理论上不能超过250字节,value值不能超过1M,永久期限的最长期限是30天(程序内部决定)。
三、如果项目中使用了log4,则需要log4动态库,memcache动态库以及ICSharpCode.SharpZipLib动态库版本一致,否则引起log程序集版本问题。最佳解决方案,下载一个动态库包,包含这三个动态库的那种。
四、如果存取“值”类型的数据,在获取前,一定要判断是否存在该键值,避免 int a=null; 这种错误。
-------------------------------------------------------------------------------------------------------
关于memcache服务集群时,客户端默认使用的路由算法验证问题:
关于路由使用到的算法(余数哈希、一致性哈希),请参考以下两篇不错的博文:
http://www.cnblogs.com/mecity/archive/2011/06/13/Memcached.html
http://www.cnblogs.com/xrq730/p/4948707.html
实验设计思路:
按照余数哈希和一致性哈希算法的特点,我们手动创建几个key值,其特点是,key值的哈希值差异较大,按服务器数取余后分布均匀,添加服务器 时,取余后较之以前差异大,但与之前部分取余有交叉。取某一版本client实验,如果路由规则是余数哈希算法,则键值会按照取余后的百分比分配到各个服务器上。如果是一致性哈希算法,则会在服务器上分布不均。添加服务器后,因为键值特殊设计,如果是余数哈希算法,取值的命中率将会骤降,而如果是一致性哈希算法,则命中率虽有下降,但影响不大。
测试客户端版本号:
memcache服务集群:
源码:
运行结果:
命中情况:
增加一个memcache服务器时:
运行结果:
结果表明上述程序中的推测正确。
命中情况:
根据上述设计思想及实验结果可知,此版本的客户端路由算法为余数哈希法。因为有三台服务器,六个键值的哈希值取余后刚好平局命中0/1/2 三个数,而实际服务器上的键值存取也平均分配到了三台服务器上。当增加一台服务器时,六个键值的哈希值余数结果仅有一个与之前一致,而实验结果刚好仅有一个值被命中。两种表现共同佐证了路由算法为余数哈希法。并且根据实验结果,可以推测出,键值 c 和 e 被存储到了11213服务器,a 和 d 被存储到了11214 服务器,b 和 f 被存储到了 11212 服务器。
附实际键值存储位置,以验证上述结论中的键值分布推测:
根据相关文档说明,新版的客户端已使用一致性哈希算法进行路由。因暂时未找到较新的动态库,此说法暂时搁置,以待后续验证。
最新文章
- swift_Class类的继承
- 最短路径(Floyd)算法
- js014-表单脚本
- echarts 各种细节问题
- 通过从代码层面分析Linux内核启动来探知操作系统的启动过程
- linux下简单文本处理
- react中createFactory, createClass, createElement分别在什么场景下使用,为什么要这么定义?
- c#入门系列——基础篇
- 老李秘技:loadrunner11是否还支持dblib协议?
- 《k8s-1.13版本源码分析》-调度器框架
- 剥开比原看代码09:通过dashboard创建密钥时,前端的数据是如何传到后端的?
- log4j配置文件位置详解
- SWIFT中获取当前经伟度
- 经典算法 KMP算法详解
- RHEL配置本地yum
- MongoDB的使用技巧(转)
- Types方法之isCastable-isConvertible
- [洛谷P3250][HNOI2016]网络
- Maven仓库设置代理
- ng-repeat和ng-options区别
热门文章
- document.frames与window.frames在不同浏览器中的使用
- c#各个版本的特性
- MySQL的模糊搜索
- js emoji表情长度判断
- Exception from System.loadLibrary(smjavaagentapi) java.lang.UnsatisfiedLinkError: no smjavaagentapi in java.library.path
- Golang教程:循环语句
- Spring ContextLoaderListener
- JS 提交反斜杠\替换成正斜杠/
- centos下mongodb安装
- MongoDB 学习(二)可视化界面