在项目优化中,使用到了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 服务器。

附实际键值存储位置,以验证上述结论中的键值分布推测:

根据相关文档说明,新版的客户端已使用一致性哈希算法进行路由。因暂时未找到较新的动态库,此说法暂时搁置,以待后续验证。

最新文章

  1. swift_Class类的继承
  2. 最短路径(Floyd)算法
  3. js014-表单脚本
  4. echarts 各种细节问题
  5. 通过从代码层面分析Linux内核启动来探知操作系统的启动过程
  6. linux下简单文本处理
  7. react中createFactory, createClass, createElement分别在什么场景下使用,为什么要这么定义?
  8. c#入门系列——基础篇
  9. 老李秘技:loadrunner11是否还支持dblib协议?
  10. 《k8s-1.13版本源码分析》-调度器框架
  11. 剥开比原看代码09:通过dashboard创建密钥时,前端的数据是如何传到后端的?
  12. log4j配置文件位置详解
  13. SWIFT中获取当前经伟度
  14. 经典算法 KMP算法详解
  15. RHEL配置本地yum
  16. MongoDB的使用技巧(转)
  17. Types方法之isCastable-isConvertible
  18. [洛谷P3250][HNOI2016]网络
  19. Maven仓库设置代理
  20. ng-repeat和ng-options区别

热门文章

  1. document.frames与window.frames在不同浏览器中的使用
  2. c#各个版本的特性
  3. MySQL的模糊搜索
  4. js emoji表情长度判断
  5. Exception from System.loadLibrary(smjavaagentapi) java.lang.UnsatisfiedLinkError: no smjavaagentapi in java.library.path
  6. Golang教程:循环语句
  7. Spring ContextLoaderListener
  8. JS 提交反斜杠\替换成正斜杠/
  9. centos下mongodb安装
  10. MongoDB 学习(二)可视化界面