﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-memcache</title><link>http://blogjava.net/stevenjohn/category/52535.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Sat, 23 May 2015 10:52:05 GMT</lastBuildDate><pubDate>Sat, 23 May 2015 10:52:05 GMT</pubDate><ttl>60</ttl><item><title>秒杀系统架构优化思路</title><link>http://www.blogjava.net/stevenjohn/archive/2015/05/23/425248.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 23 May 2015 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/05/23/425248.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/425248.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/05/23/425248.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/425248.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/425248.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;"><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">《秒杀系统架构优化思路》</strong></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">上周参加Qcon，有个兄弟分享秒杀系统的优化，其观点有些赞同，大部分观点却并不同意，结合自己的经验，谈谈自己的一些看法。</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;"><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">一、为什么难</strong></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">秒杀系统难做的原因：<span style="margin: 0px; padding: 0px; max-width: 100%; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">库存只有一份，所有人会在集中的时间读和写这些数据。</span></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">例如小米手机每周二的秒杀，可能手机只有1万部，但瞬时进入的流量可能是几百几千万。</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">又例如12306抢票，亦与秒杀类似，瞬时流量更甚。</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;"><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">二、常见架构</strong></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><img data-s="300,640" data-type="png" data-src="http://mmbiz.qpic.cn/mmbiz/YrezxckhYOzvspKwL1s0Cia9doJJEwl76Au6iblDpiceZeQaSiaIGPB2MIyJyP4c2moIcandIcxBMTJibV3WBCH0MEA/0?wx_fmt=png" src="http://mmbiz.qpic.cn/mmbiz/YrezxckhYOzvspKwL1s0Cia9doJJEwl76Au6iblDpiceZeQaSiaIGPB2MIyJyP4c2moIcandIcxBMTJibV3WBCH0MEA/0?wx_fmt=png" data-ratio="1.8144329896907216" data-w="97" style="margin: 0px; padding: 0px; border: none; max-width: 100%; height: auto !important; box-sizing: border-box !important; word-wrap: break-word !important; width: auto !important; visibility: visible !important;"  alt="" /><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">流量到了亿级别，常见站点架构如上：<br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">1）<span style="margin: 0px; padding: 0px; max-width: 100%; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">浏览器端</span>，最上层，会执行到一些JS代码</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">2）<span style="margin: 0px; padding: 0px; max-width: 100%; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">站点层</span>，这一层会访问后端数据，拼html页面返回给浏览器</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">3）<span style="margin: 0px; padding: 0px; max-width: 100%; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">服务层</span>，向上游屏蔽底层数据细节</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">4）<span style="margin: 0px; padding: 0px; max-width: 100%; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">数据层</span>，最终的库存是存在这里的，mysql是一个典型</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;"><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">三、优化方向</strong></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">1）<strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;"><span style="margin: 0px; padding: 0px; max-width: 100%; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">将请求尽量拦截在系统上游</span></strong>：传统秒杀系统之所以挂，请求都压倒了后端数据层，数据读写锁冲突严重，并发高响应慢，几乎所有请求都超时，流量虽大，下单成功的有效流量甚小【一趟火车其实只有2000张票，200w个人来买，基本没有人能买成功，请求有效率为0】</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">2）<span style="margin: 0px; padding: 0px; max-width: 100%; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;"><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">充分利用缓存</strong></span>：这是一个典型的读多些少的应用场景【一趟火车其实只有2000张票，200w个人来买，最多2000个人下单成功，其他人都是查询库存，写比例只有0.1%，读比例占99.9%】，非常适合使用缓存</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;"><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">四、优化细节</strong></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">4.1）浏览器层请求拦截</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">点击了&#8220;查询&#8221;按钮之后，系统那个卡呀，进度条涨的慢呀，作为用户，会不自觉的再去点击&#8220;查询&#8221;，继续点，继续点，点点点。。。有用么？平白无故的增加了系统负载（一个用户点5次，80%的请求是这么多出来的），怎么整？</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">a）<strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">产品层面，用户点击&#8220;查询&#8221;或者&#8220;购票&#8221;后，按钮置灰，禁止用户重复提交请求</strong></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">b）<strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">JS层面，限制用户在x秒之内只能提交一次请求</strong></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">如此限流，80%流量已拦</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">4.2）站点层请求拦截与页面缓存</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">浏览器层的请求拦截，只能拦住小白用户（不过这是99%的用户哟），高端的程序员根本不吃这一套，写个for循环，直接调用你后端的http请求，怎么整？</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">a）<strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">同一个uid，限制访问频度，做页面缓存</strong>，x秒内到达站点层的请求，均返回同一页面</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">b）<strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">同一个item的查询，例如手机车次，做页面缓存</strong>，x秒内到达站点层的请求，均返回同一页面</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">如此限流，又有99%的流量会被拦截在站点层</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">4.3）服务层请求拦截与数据缓存</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">站点层的请求拦截，只能拦住普通程序员，高级黑客，假设他控制了10w台肉鸡（并且假设买票不需要实名认证），这下uid的限制不行了吧？怎么整？</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">a）大哥，我是服务层，我清楚的知道小米只有1万部手机，我清楚的知道一列火车只有2000张车票，我透10w个请求去数据库有什么意义呢？<strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">对于写请求，做请求队列，每次只透过有限的写请求去数据层</strong>，如果均成功再放下一批，如果库存不够则队列里的写请求全部返回&#8220;已售完&#8221;</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">b）<strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">对于读请求</strong>，还用说么？<strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">cache来抗</strong>，不管是memcached还是redis，单机抗个每秒10w应该都是没什么问题的</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">如此限流，只有非常少的写请求，和非常少的读缓存mis的请求会透到数据层去，又有99.9%的请求被拦住了</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">4.4）数据层闲庭信步</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">到了数据这一层，几乎就没有什么请求了，单机也能扛得住，还是那句话，库存是有限的，小米的产能有限，透过过多请求来数据库没有意义。</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><br style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;" /></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;"><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">五、总结</strong></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;">没什么总结了，上文应该描述的非常清楚了，对于秒杀系统，再次重复下笔者的两个架构优化思路：</span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;"><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;"><span style="margin: 0px; padding: 0px; max-width: 100%; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">1）尽量将请求拦截在系统上游</span></strong><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;"></strong></span></p><p style="margin: 0px; padding: 0px; max-width: 100%; clear: both; min-height: 1em; white-space: pre-wrap; color: #3e3e3e; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; font-size: 16px; line-height: 25.600000381469727px; box-sizing: border-box !important; word-wrap: break-word !important; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; max-width: 100%; font-size: 14px; box-sizing: border-box !important; word-wrap: break-word !important;"><strong style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;"><span style="margin: 0px; padding: 0px; max-width: 100%; color: #ff0000; box-sizing: border-box !important; word-wrap: break-word !important;">2）读多写少的常用多使用缓存</span></strong></span></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/425248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-05-23 15:50 <a href="http://www.blogjava.net/stevenjohn/archive/2015/05/23/425248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcached master-slave</title><link>http://www.blogjava.net/stevenjohn/archive/2013/08/24/403272.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 24 Aug 2013 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/08/24/403272.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/403272.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/08/24/403272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/403272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/403272.html</trackback:ping><description><![CDATA[repcached实现memcached的复制功能:<br />
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">repcached<font style="line-height: 25px" face="宋体">是日本人开发的实现</font><font style="line-height: 25px" face="Times New Roman">memcached</font><font style="line-height: 25px" face="宋体">复制功能，它是一个单&nbsp;</font><font style="line-height: 25px" face="Times New Roman">master</font><font style="line-height: 25px" face="宋体">单&nbsp;</font><font style="line-height: 25px" face="Times New Roman">slave</font><font style="line-height: 25px" face="宋体">的方案，但它的&nbsp;</font><font style="line-height: 25px" face="Times New Roman">master/slave</font><font style="line-height: 25px" face="宋体">都是可读写的，而且可以相互同步，如果&nbsp;</font><font style="line-height: 25px" face="Times New Roman">master</font><font style="line-height: 25px" face="宋体">坏掉，&nbsp;</font><font style="line-height: 25px" face="Times New Roman">slave</font><font style="line-height: 25px" face="宋体">侦测到连接断了，它会自动&nbsp;</font><font style="line-height: 25px" face="Times New Roman">listen</font><font style="line-height: 25px" face="宋体">而成为&nbsp;</font><font style="line-height: 25px" face="Times New Roman">master</font><font style="line-height: 25px" face="宋体">；而如果&nbsp;</font><font style="line-height: 25px" face="Times New Roman">slave</font><font style="line-height: 25px" face="宋体">坏掉，&nbsp;</font><font style="line-height: 25px" face="Times New Roman">master</font><font style="line-height: 25px" face="宋体">也会侦测到连接断，它就会重新&nbsp;</font><font style="line-height: 25px" face="Times New Roman">listen</font><font style="line-height: 25px" face="宋体">等待新的&nbsp;</font><font style="line-height: 25px" face="Times New Roman">slave</font><font style="line-height: 25px" face="宋体">加入</font></span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">安装：</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">先安装<font style="line-height: 25px" face="Times New Roman">memcached(</font><font style="line-height: 25px" face="宋体">我安装的</font><font style="line-height: 25px" face="Times New Roman">1.2.8)</font></span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">有两种方式：</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">方式一、下载对应的<font style="line-height: 25px" face="Times New Roman">repcached</font><font style="line-height: 25px" face="宋体">版本</font></span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">#wget&nbsp;http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">#tar&nbsp;zxf&nbsp;memcached-1.2.8-repcached-2.2.tar.gz</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">#cd&nbsp;memcached-1.2.8-repcached-2.2</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">方式二、下载对应<font style="line-height: 25px" face="Times New Roman">patch</font><font style="line-height: 25px" face="宋体">版本</font></span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">#wget&nbsp;http://downloads.sourceforge.net/repcached/repcached-2.2-1.2.8.patch.gz</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">#gzip&nbsp;-cd&nbsp;../repcached-2.2-1.2.8.patch.gz&nbsp;|&nbsp;patch&nbsp;-p1</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">#./configure&nbsp;--enable-replication</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">#&nbsp;make</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">#&nbsp;make&nbsp;install</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 0pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 0pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 5pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 5pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">启动：</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">启动<font style="line-height: 25px" face="Times New Roman">master</font></span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">#memcached&nbsp;-v&nbsp;-l&nbsp;192.168.50.240&nbsp;-p&nbsp;11211&nbsp;-uroot</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">replication:&nbsp;listen&nbsp;(master<font style="line-height: 25px" face="宋体">监听</font><font style="line-height: 25px" face="Times New Roman">)</font></span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 5pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 5pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">启动<font style="line-height: 25px" face="Times New Roman">salve</font></span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">#memcached&nbsp;-v&nbsp;-l&nbsp;192.168.50.241&nbsp;-p&nbsp;11213&nbsp;-uroot&nbsp;-x&nbsp;127.0.0.1&nbsp;-X&nbsp;11212</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">replication:&nbsp;connect&nbsp;(peer=192.168.50.240:11212)</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">replication:&nbsp;marugoto&nbsp;copying</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">replication:&nbsp;start</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 5pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 5pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">启动正常后，<font style="line-height: 25px" face="Times New Roman">master</font><font style="line-height: 25px" face="宋体">将</font><font style="line-height: 25px" face="Times New Roman">accept</font><font style="line-height: 25px" face="宋体">。</font></span><span style="line-height: 25px; font-size: 10.5pt">测试：</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">操作<font style="line-height: 25px" face="Times New Roman">master</font></span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">#telnet&nbsp;192.168.50.240&nbsp;11211</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">#set&nbsp;key1&nbsp;0&nbsp;0&nbsp;3</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">111</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 5pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 5pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">查看<font style="line-height: 25px" face="Times New Roman">slave</font></span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">#telnet&nbsp;192.168.50.241&nbsp;11213</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">#get&nbsp;key1</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 5pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 5pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">如果正常表示，配置成功</span><span style="line-height: 25px; font-size: 10.5pt"></span></div>
<div style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); margin-top: 5pt; text-indent: 0px; font: 14px/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; margin-bottom: 5pt; letter-spacing: normal; color: rgb(13,13,13); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="line-height: 25px; font-size: 10.5pt">应用：</span><span style="line-height: 25px; font-size: 10.5pt"><br style="line-height: 25px" /></span><span style="line-height: 25px; font-size: 10.5pt">可以实现<font style="line-height: 25px" face="Times New Roman">cache</font><font style="line-height: 25px" face="宋体">冗余</font></span><span style="line-height: 25px; font-size: 10.5pt"></span></div><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 10.5pt/25px Arial, Helvetica, simsun, u5b8bu4f53; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(128,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">注意：如果<font style="line-height: 25px" face="Times New Roman">master&nbsp;down</font><font style="line-height: 25px" face="宋体">机，</font><font style="line-height: 25px" face="Times New Roman">slave</font><font style="line-height: 25px" face="宋体">接管并成为</font><font style="line-height: 25px" face="Times New Roman">master</font><font style="line-height: 25px" face="宋体">，这时</font><font style="line-height: 25px" face="Times New Roman">down</font><font style="line-height: 25px" face="宋体">机的</font><font style="line-height: 25px" face="Times New Roman">master</font><font style="line-height: 25px" face="宋体">只能启用</font><font style="line-height: 25px" face="Times New Roman">slave,</font><font style="line-height: 25px" face="宋体">他们之间互换角色，才能保持复制功能。换句话说，</font><font style="line-height: 25px" face="Times New Roman">master</font><font style="line-height: 25px" face="宋体">没有抢占功能。</font></span><img src ="http://www.blogjava.net/stevenjohn/aggbug/403272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-08-24 17:15 <a href="http://www.blogjava.net/stevenjohn/archive/2013/08/24/403272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memcache内存分配策略</title><link>http://www.blogjava.net/stevenjohn/archive/2013/08/23/403250.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 23 Aug 2013 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/08/23/403250.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/403250.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/08/23/403250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/403250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/403250.html</trackback:ping><description><![CDATA[<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font: 14px/21px Tahoma, Helvetica, Arial, STHeiti; white-space: normal; orphans: 2; letter-spacing: normal; color: #454545; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><strong>一、Memcache内存分配机制</strong></p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font: 14px/21px Tahoma, Helvetica, Arial, STHeiti; white-space: normal; orphans: 2; letter-spacing: normal; color: #454545; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;关于这个机制网上有很多解释的，我个人的总结如下。</p>
<ol style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: #ffffff; list-style-type: none; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font: 14px/21px Tahoma, Helvetica, Arial, STHeiti; white-space: normal; orphans: 2; letter-spacing: normal; color: #454545; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong>Page为内存分配的最小单位。</strong> 
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Memcached的内存分配以page为单位，默认情况下一个page是1M，可以通过-I参数在启动时指定。如果需要申请内存时，memcached会划分出一个新的page并分配给需要的slab区<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/stevenjohn/images/11.jpg" width="511" longdesc="" height="272" /></p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"></p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">域。page一旦被分配在重启前不会被回收或者重新分配（page ressign已经从1.2.8版移除了）<span class="Apple-converted-space">&nbsp;</span><br /><br /></p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong>Slabs划分数据空间。</strong> 
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Memcached并不是将所有大小的数据都放在一起的，而是预先将数据空间划分为一系列slabs，每个slab只负责一定范围内的数据存储。如下图，每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。例如：slab 3只存储大小介于137 到 224 bytes的数据。如果一个数据大小为230byte将被分配到slab 4中。从下图可以看出，每个slab负责的空间其实是不等的，memcached默认情况下下一个slab的最大值为前一个的1.25倍，这个可以通过修改-f参数来修改增长比例。<span class="Apple-converted-space">&nbsp;<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/stevenjohn/images/22.jpg" width="372" longdesc="" height="474" /></span><br /></p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"></p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;&nbsp;</p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong>Chunk才是存放缓存数据的单位。</strong> 
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Chunk是一系列固定的内存空间，这个大小就是管理它的slab的最大存放大小。例如：slab 1的所有chunk都是104byte，而slab 4的所有chunk都是280byte。chunk是memcached实际存放缓存数据的地方，因为chunk的大小固定为slab能够存放的最大值，所以所有分配给当前slab的数据都可以被chunk存下。如果时间的数据大小小于chunk的大小，空余的空间将会被闲置，这个是为了防止内存碎片而设计的。例如下图，chunk size是224byte，而存储的数据只有200byte，剩下的24byte将被闲置。<span class="Apple-converted-space">&nbsp;<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/stevenjohn/images/33.jpg" width="511" longdesc="" height="272" /></span><br /></p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"></p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><br />&nbsp;</p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong>Slab的内存分配。</strong> 
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Memcached在启动时通过-m指定最大使用内存，但是这个不会一启动就占用，是随着需要逐步分配给各slab的。<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 如果一个新的缓存数据要被存放，memcached首先选择一个合适的slab，然后查看该slab是否还有空闲的chunk，如果有则直接存放进去；如果没有则要进行申请。slab申请内存时以page为单位，所以在放入第一个数据，无论大小为多少，都会有1M大小的page被分配给该slab。申请到page后，slab会将这个page的内存按chunk的大小进行切分，这样就变成了一个chunk的数组，在从这个chunk数组中选择一个用于存储数据。如下图，slab 1和slab 2都分配了一个page，并按各自的大小切分成chunk数组。<span class="Apple-converted-space">&nbsp;<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/stevenjohn/images/44.jpg" width="522" longdesc="" height="360" /></span><br /></p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"></p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><br />&nbsp;</p></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong>Memcached内存分配策略。</strong> 
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">综合上面的介绍，memcached的内存分配策略就是：按slab需求分配page，各slab按需使用chunk存储。<br />这里有几个特点要注意，</p>
<ol style="padding-bottom: 0px; list-style-type: none; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Memcached分配出去的page不会被回收或者重新分配</li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Memcached申请的内存不会被释放</li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">slab空闲的chunk不会借给任何其他slab使用<br /><div>&nbsp;每一个slab=1M&nbsp;&nbsp;&nbsp;切分的chunk个数=1M/最小的chunk大小<br />下一个chunk=上一个chunk大小*增长因子</div></li><li style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/stevenjohn/images/55.jpg" width="538" longdesc="" height="815" /></li></ol>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><br /></p></li></ol>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font: 14px/21px Tahoma, Helvetica, Arial, STHeiti; white-space: normal; orphans: 2; letter-spacing: normal; color: #454545; word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="padding: 0px; widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; margin: 0px; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: 21px; font-family: Tahoma, Helvetica, Arial, STHeiti; white-space: normal; orphans: 2; letter-spacing: normal; color: #454545; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">&nbsp;&nbsp; &nbsp; &nbsp;知道了这些以后，就可以理解为什么总内存没有被全部占用的情况下，memcached却出现了丢失缓存数据的问题了。<br />*******************<br />当存储的值item大于1M的时候：<br /></p><div>按照官方解释，当大于1M时，按现有的 slab allocation内存分配管理机制，memcache的存取效率会下降很多，就失去了使用memcache的意义，之所以用memcache，一大原因就是它比数据库速度快，如果失去了速度优势，就没意思了。</div><div><div>&nbsp;支持大于1M的方法&nbsp;官方也给出了：一个是还是使用slab&nbsp;allocation&nbsp;机制修改源代码中&nbsp;POWER_BLOCK&nbsp;&nbsp;的值，然后重新编译。另一个方法是使用低效的&nbsp;malloc/free&nbsp;分配机制。&nbsp;</div></div><div><div>&nbsp;如果某个常用slab满了&nbsp;&nbsp;而且又没开启LRU,会出现命中低的情况&#183;</div></div><br /><div>&nbsp;1M/最小的chunk=存储的个数<br />然后第二个chunk=第一个chunk*1.25<br />这样1M被不断的分<br />切到最后1M只能存一个chunk</div><p>&nbsp; 1M&nbsp;用完会申请一个新的&nbsp;1M</p><div>但是&nbsp;不能超过你的最大内存数<br />超过了&nbsp;就开始回收<br />也就是LRU<br /><div><div>&nbsp;当memcache每次在get的时候会检测key所对应的value过期时间&nbsp;&nbsp;那么当检测到此item过期了&nbsp;value会被清除&nbsp;&nbsp;key呢&nbsp;保留&nbsp;还是也会被清除&nbsp;？<br />不会被清除，只会返回空<br />直到lru覆盖这个过期值<br />那就是当我程序弃用了大量的key时&nbsp;&nbsp;cmd_get时&nbsp;这些key&nbsp;还会被扫描到？<br />不会<br />只是还存在内存里&nbsp;&nbsp;占着内存</div></div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/403250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-08-23 17:06 <a href="http://www.blogjava.net/stevenjohn/archive/2013/08/23/403250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ehcache.memcached</title><link>http://www.blogjava.net/stevenjohn/archive/2013/08/09/402639.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 09 Aug 2013 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/08/09/402639.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/402639.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/08/09/402639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/402639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/402639.html</trackback:ping><description><![CDATA[<div>memcached<br /><p style="margin: 1em 0px 0.5em; padding: 0px; font-family: verdana, sans-serif; font-size: 14.44444465637207px; line-height: 20.98958396911621px; background-color: #faf7ef; color: #444444;">&nbsp;Memcached 是一个高性能的分布式内存对象缓存系统，用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数，从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程（daemon ）是用C写的，但是客户端可以用任何语言来编写，并通过memcached协议与守护进程通信。但是它并不提供冗余（例如，复制其hashmap条目）；当某个服务器S停止运行或崩溃了，所有存放在S上的键/值对都将丢失。</p><p style="margin: 1em 0px 0.5em; padding: 0px; font-family: verdana, sans-serif; font-size: 14.44444465637207px; line-height: 20.98958396911621px; background-color: #faf7ef; color: #444444;">Memcached官方：<a href="http://danga.com/memcached/" style="margin: 0px; padding: 0px; color: #6fbc4c; text-decoration: initial;">http://danga.com/memcached/</a></p><p style="margin: 1em 0px 0.5em; padding: 0px; font-family: verdana, sans-serif; font-size: 14.44444465637207px; line-height: 20.98958396911621px; background-color: #faf7ef; color: #444444;">关于Memcached的介绍请参考：<a href="http://www.yaosansi.com/post/1395.html" style="margin: 0px; padding: 0px; color: #6fbc4c; text-decoration: initial;">Memcached深度分析</a></p><p style="margin: 1em 0px 0.5em; padding: 0px; font-family: verdana, sans-serif; font-size: 14.44444465637207px; line-height: 20.98958396911621px; background-color: #faf7ef; color: #444444;"><strong style="margin: 0px; padding: 0px;">下载Windows的Server端</strong></p><p style="margin: 1em 0px 0.5em; padding: 0px; font-family: verdana, sans-serif; font-size: 14.44444465637207px; line-height: 20.98958396911621px; background-color: #faf7ef; color: #444444;">下载地址：<a href="http://code.jellycan.com/memcached/" style="margin: 0px; padding: 0px; color: #6fbc4c; text-decoration: initial;">http://code.jellycan.com/memcached/</a></p>windows服务端下载地址:<!--StartFragment -->






<div>http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip<br />windows服务端安装:<br /><a href="http://www.cnblogs.com/xd502djj/archive/2012/09/25/2701800.html">http://www.cnblogs.com/xd502djj/archive/2012/09/25/2701800.html</a><br /><div>http://www.cnblogs.com/wucg/archive/2011/03/01/1968185.html</div>ehcache集群的相关文章：<br /><a href="http://www.cnblogs.com/yangy608/archive/2011/10/07/2200669.html">http://www.cnblogs.com/yangy608/archive/2011/10/07/2200669.html</a><br /><a href="http://www.cnblogs.com/hoojo/archive/2012/07/19/2599534.html">http://www.cnblogs.com/hoojo/archive/2012/07/19/2599534.html</a><br /><a href="http://www.open-open.com/lib/view/open1345651870876.html">http://www.open-open.com/lib/view/open1345651870876.html</a><br /><br /><!--StartFragment -->



<div>以图为例<br />Cache&nbsp;A、Cache&nbsp;B，Cache&nbsp;C为三台Memcached服务器<br />根据三台Memcached的IP和端口，计算出他们的Hash值，然后分布在整个圆环上<br />每两台Memcached服务器的Hash值之间为一个区间<br />Key1、Key2、Key3、Key4<br />为要存储在Memcached里的4个Key<br />根据4个Key计算出他们的Hash值，同样也落在这个圆环上<br />在这个环形空间中，如果沿着顺时针方向从对象的&nbsp;key&nbsp;值出发，直到遇见一个&nbsp;cache&nbsp;，那么就将该对象存储在这个&nbsp;cache&nbsp;上，因为对象和&nbsp;cache&nbsp;的&nbsp;hash&nbsp;值是固定的，因此这个&nbsp;cache&nbsp;必然是唯一和确定的。<br />根据上面的方法，对象&nbsp;key1&nbsp;将被存储到&nbsp;cache&nbsp;A&nbsp;上；&nbsp;key2&nbsp;和&nbsp;key3&nbsp;对应到&nbsp;cache&nbsp;C&nbsp;；&nbsp;key4&nbsp;对应到&nbsp;cache&nbsp;B;<br />同一个key不是三台服务器上面都有映射， 只会映射到其中一台服务器上面<br /><br />集群中其中一个Memcached节点宕机，会导致存在着上面的Key全部失效而重新对这些key进行hash<br /><!--StartFragment -->


<div>对其他活着的Memcached节点上的key没有影响</div><br /><!--StartFragment -->

<div>如果是集群<br />Set和Get时触发操作的是否为同一个配置<br />如果是多个应用服务器触发Set、Get操作，每一个的Memcached节点配置顺序是否相同<br />可以通过telnet的方式，去Memcached节点上Get一下响应的Key，看是否真的过期<br /><br />你分析一下你的slab构成，看看每个slab分配了多少page页，加起来是不是跟总分配内存一样，如果是一样的表示你的内存已经分配完了，每个slab只能使用已分配的大小，不能再增涨。再分析一下存这个value的slab的大小，如果比较小，且hits量很大，就会出现你这样的情况，刚存没多久的数据没到过期就会被挤掉。 <br /><br /><!--StartFragment -->

<div>失效就几种可能：<br />1，cache满了，刚插进去就被lru剔出来<br />2，失效时间设置不对，导致数据一插进去就失效（不能超过30天）</div></div><br /><div>&nbsp;使用了64的操作系统，能分配2GB以上的内存。32位操作系统中，每个进程最多只能使用2GB内存。可以启动多个分配2GB以下内存的进程，但这样一台服务器上的TCP连接数就会成倍增加，管理上也变得复杂，所以尽量统一使用了64位操作系统。<br />另外，最好分配内存为3GB，是因为内存分配量超过这个值，就有可能导致内存交换(swap)，memcached的内存存储&#8220;slab&#8221;，&nbsp;memcached启动时指定的内存分配量是memcached用于保存数据的量，没有包括&#8220;slab&#8221;本身占用的内存、以及为了保存数据而设置的管理空间。因此，memcached进程的实际内存分配量要比指定的容量要大。<br />如果在memcached中的数据大部分都比较小。这样，进程的大小要比指定的容量大很多。因此，改变内存分配量进行验证，确认了3GB的大小不会引发swap。<br /><br /><div>&nbsp;64位操作系统不受限制（小于你的物理内存大小即可），不过得注意Memcache软件本身是有内存消耗的（相比可以忽略），但这点还是注意一下。</div></div></div></div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/402639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-08-09 17:34 <a href="http://www.blogjava.net/stevenjohn/archive/2013/08/09/402639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java应用的Memcached统一使用策略</title><link>http://www.blogjava.net/stevenjohn/archive/2013/04/03/397372.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 03 Apr 2013 10:45:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/04/03/397372.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/397372.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/04/03/397372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/397372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/397372.html</trackback:ping><description><![CDATA[<h2><div style="margin: 0px 0px 20px; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #a9a9a9; float: left; width: 510px; font-family: Cambria, Georgia, Times, serif; font-size: 16px; font-weight: normal; line-height: 24px;"><div style="margin: 0px;"><div style="margin: 0px;"><h2>使用simple-spring-memcached统一缓存的使用</h2><p style="margin: 0px 0px 1.375em; padding: 0px;">如何在一个中型的Java应用中使用Memcached缓存数据不是个简单的问题。当某个缓存数据需要在多个系统间共享和失效时，必须要有统一的规划才能保证不出错。经过各种实践，目前系统在使用Memcached缓存数据全部采用Simple-Spring-Memcached框架来完成，并统一规划各系统Spring和Cache key的配置。<br />下面对在使用过程中需要注意的点做一个详细说明：</p><h3><a name="Java%E5%BA%94%E7%94%A8%E7%9A%84Memcache%E4%BD%BF%E7%94%A8%E7%AD%96%E7%95%A5-Cache%E6%95%B4%E4%BD%93%E8%A7%84%E5%88%92" style="cursor: pointer; color: rgb(235, 55, 75);"></a>Cache整体规划</h3><p style="margin: 0px 0px 1.375em; padding: 0px;">目前我们系统中有两个不同的Memcached服务器：</p><ol style="margin: 0px 0px 1.375em 2em; padding: 0px;"><li style="margin: 0px; padding: 0px;">session memcached服务器：主要存储用户的session</li><li style="margin: 0px; padding: 0px;">app memcached服务器: 主要用于缓存应用数据</li></ol><p style="margin: 0px 0px 1.375em; padding: 0px;">由于应用所有的缓存数据都放在app缓存上，为避免各应用的缓存数据出现冲突，必须规划好它们的命名空间。所幸Simple-Spring-Memcached支持namespace的概念，因此对各应用的namespace前缀规定如下：</p><div style="margin: 0px;"><table style="border-collapse: collapse; border-spacing: 0px; margin: 0px 0px 1.625em; border-bottom-style: solid; border-bottom-color: #dddddd; width: 510px;"><tbody><tr><th style="margin: 0px; padding: 0px; font-weight: 500; color: #666666; font-size: 10px; letter-spacing: 0.1em; line-height: 2.6em; text-transform: uppercase;">应用</th><th style="margin: 0px; padding: 0px; font-weight: 500; color: #666666; font-size: 10px; letter-spacing: 0.1em; line-height: 2.6em; text-transform: uppercase;">NAMESPACE前缀</th><th style="margin: 0px; padding: 0px; font-weight: 500; color: #666666; font-size: 10px; letter-spacing: 0.1em; line-height: 2.6em; text-transform: uppercase;"></th></tr><tr><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">goodscenter</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">goodscenter</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;"></td></tr><tr><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">trade</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">trade</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;"></td></tr><tr><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">uic</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">uic</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;"></td></tr></tbody></table></div><p style="margin: 0px 0px 1.375em; padding: 0px;">这个namespace在生成key时，将放在最前面，稍后会有例子详述。<br />同一个应用中存在许多需要缓存的对象，因此约定namespace前缀之后再加上缓存对象的类名。<br />例子如下：</p><div style="margin: 0px;"><table style="border-collapse: collapse; border-spacing: 0px; margin: 0px 0px 1.625em; border-bottom-style: solid; border-bottom-color: #dddddd; width: 539px;"><tbody><tr><th style="margin: 0px; padding: 0px; font-weight: 500; color: #666666; font-size: 10px; letter-spacing: 0.1em; line-height: 2.6em; text-transform: uppercase;">应用</th><th style="margin: 0px; padding: 0px; font-weight: 500; color: #666666; font-size: 10px; letter-spacing: 0.1em; line-height: 2.6em; text-transform: uppercase;">缓存对象</th><th style="margin: 0px; padding: 0px; font-weight: 500; color: #666666; font-size: 10px; letter-spacing: 0.1em; line-height: 2.6em; text-transform: uppercase;">完整的NAMESPACE</th><th style="margin: 0px; padding: 0px; font-weight: 500; color: #666666; font-size: 10px; letter-spacing: 0.1em; line-height: 2.6em; text-transform: uppercase;">最终生成的KEY</th></tr><tr><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">trade</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">TcRate (id为42)</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">trade:TcRate</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">trade:TcRate:12</td></tr><tr><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">goodscenter</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">GoodsDo(id为42)</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">goodscenter:GoodsDo</td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">goodscenter:GoodsDo:12</td></tr></tbody></table></div><h3><a name="Java%E5%BA%94%E7%94%A8%E7%9A%84Memcache%E4%BD%BF%E7%94%A8%E7%AD%96%E7%95%A5-key%E7%9A%84%E7%94%9F%E6%88%90%E8%A7%84%E5%88%99" style="cursor: pointer; color: rgb(235, 55, 75);"></a>key的生成规则</h3><p style="margin: 0px 0px 1.375em; padding: 0px;">Simple-Spring-Memcached提供的针对单个对象的注解接口提供了两种key生成方式，<a title="使用SSM注解做缓存操作（一）" href="http://www.colorfuldays.org/program/java/ssm_memcache/" target="_blank" style="cursor: pointer; color: #eb374b;">详情见此文</a></p><ol style="margin: 0px 0px 1.375em 2em; padding: 0px;"><li style="margin: 0px; padding: 0px;">AssignCache类注解通过assignKey指定cache的key</li><li style="margin: 0px; padding: 0px;">SingleCache类注解通过ParameterValueKeyProvider注解指定生成key的方法</li></ol><p style="margin: 0px 0px 1.375em; padding: 0px;">对于第一种只要求必须保证key不与其它的冲突，且namesapce符合规则。<br />第二种时，约定缓存的数据对象必须实现有带CacheKeyMethod的cacheKey方法，参考实现如下：</p><div style="margin: 0px;"><div style="margin: 0px;"><pre style="margin-top: 0px; margin-bottom: 24px; padding: 5px; background-color: #dddddd; font-size: 9pt; font-family: Monaco, Consolas, 'Lucidia Console', 'Lucidia Sans Typewriter', 'Courier New', Courier, monospace; line-height: 1.2em; overflow: auto;">    @CacheKeyMethod     public String cacheKey() {         return this.getId();     }</pre></div></div><div style="margin: 0px;"><table style="border-collapse: collapse; border-spacing: 0px; margin: 0px 0px 1.625em; border-bottom-style: solid; border-bottom-color: #dddddd; width: 510px;"><colgroup><col width="24"><col></colgroup><tbody><tr><td valign="top" style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;"><img src="http://cf.okhqb.net/images/icons/emoticons/forbidden.gif" alt="" width="16" height="16" align="absmiddle" border="0" style="border: 0px; height: auto; max-width: 100%;" /></td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">目前@CacheKeyMethod只支持返回String的方法，需要改造成可接受Long，Integer型的。当前必须有单独的方法来作为缓存Key的生成器</td></tr></tbody></table></div><div style="margin: 0px;"><table style="border-collapse: collapse; border-spacing: 0px; margin: 0px 0px 1.625em; border-bottom-style: solid; border-bottom-color: #dddddd; width: 510px;"><colgroup><col width="24"><col></colgroup><tbody><tr><td valign="top" style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;"><img src="http://cf.okhqb.net/images/icons/emoticons/warning.gif" alt="" width="16" height="16" align="absmiddle" border="0" style="border: 0px; height: auto; max-width: 100%;" /></td><td style="margin: 0px; padding: 6px 10px 6px 0px; border-top-style: solid; border-top-color: #dddddd;">真实存放到Memcached的key的生成规则是：namespace:key。<br />如goodscenter的id为42的domain对象GoodsDo,按上述方式生成的key为：goodscenter:GoodsDo:42</td></tr></tbody></table></div><h3><a name="Java%E5%BA%94%E7%94%A8%E7%9A%84Memcache%E4%BD%BF%E7%94%A8%E7%AD%96%E7%95%A5-spring%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E" style="cursor: pointer; color: rgb(235, 55, 75);"></a>spring配置说明</h3><p style="margin: 0px 0px 1.375em; padding: 0px;">关于Simple-Spring-Memcached具体XML配置如下：</p><div style="margin: 0px;"><div style="margin: 0px;"><pre not-hl"="" version="1.0" encoding="UTF-8" style="margin-top: 0px; margin-bottom: 24px; padding: 5px; font-size: 9pt; font-family: Monaco, Consolas, 'Lucidia Console', 'Lucidia Sans Typewriter', 'Courier New', Courier, monospace; line-height: 1.2em; overflow: auto; background-color: #eae9e5 !important; border: 1px solid #c0c0c0 !important;">&lt;beans xmlns="http://www.springframework.org/schema/beans"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"        xmlns:context="http://www.springframework.org/schema/context"        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"&gt;      &lt;import resource="classpath:simplesm-context.xml"/&gt;      &lt;aop:aspectj -autoproxy/&gt;     &lt;context:annotation -config/&gt;      &lt;bean name="appCache" class="com.google.code.ssm.CacheFactory"&gt;         &lt;property name="cacheClientFactory"&gt;             &lt;bean class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl"/&gt;         &lt;/property&gt;         &lt;property name="addressProvider"&gt;             &lt;bean class="com.google.code.ssm.config.DefaultAddressProvider"&gt;                 &lt;!--memcached服务器ip:port 可以是多个，格式为: 127.0.0.1:11211,192.168.100.11:11211--&gt;                 &lt;property name="address" value="{memcached.server}"/&gt;             &lt;/bean&gt;         &lt;/property&gt;         &lt;property name="configuration"&gt;             &lt;!-- memcached连接器的配置，具体的配置项参考这个类 --&gt;             &lt;bean class="com.google.code.ssm.providers.XMemcachedConfiguration"&gt;                 &lt;!--是否使用一致性哈希--&gt;                 &lt;property name="consistentHashing" value="true"/&gt;                 &lt;!--连接池--&gt;                 &lt;property name="connectionPoolSize" value="10"/&gt;                 &lt;property name="optimizeGet" value="true"/&gt;              &lt;/bean&gt;         &lt;/property&gt;         &lt;property name="cacheName"&gt;             &lt;!-- 该Memcached配置的Cache名称 一个应用中存在多个Memcached时，各个配置的cacheName必须不同。如果该值未设，系统默认为default --&gt;             &lt;value&gt;appCache&lt;/value&gt;         &lt;/property&gt;     &lt;/bean&gt; &lt;/beans&gt;</pre></div></div><h3><a name="Java%E5%BA%94%E7%94%A8%E7%9A%84Memcache%E4%BD%BF%E7%94%A8%E7%AD%96%E7%95%A5-Java%E4%BB%A3%E7%A0%81%E4%B8%AD%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E" style="cursor: pointer; color: rgb(235, 55, 75);"></a>Java代码中使用说明</h3><h4><a name="Java%E5%BA%94%E7%94%A8%E7%9A%84Memcache%E4%BD%BF%E7%94%A8%E7%AD%96%E7%95%A5-a.%E6%B3%A8%E8%A7%A3%E6%96%B9%E5%BC%8F%E4%BD%BF%E7%94%A8" style="cursor: pointer; color: rgb(235, 55, 75);"></a>a. 注解方式使用</h4><p style="margin: 0px 0px 1.375em; padding: 0px;">直接使用注解来处理缓存及失效非常简单，下面是相应的例子：<br /><strong>读取缓存：</strong></p><div style="margin: 0px;"><div style="margin: 0px;"><strong>EventGoodsServiceClientImpl.java</strong></div><div style="margin: 0px;"><pre style="margin-top: 0px; margin-bottom: 24px; padding: 5px; background-color: #dddddd; font-size: 9pt; font-family: Monaco, Consolas, 'Lucidia Console', 'Lucidia Sans Typewriter', 'Courier New', Courier, monospace; line-height: 1.2em; overflow: auto;">    @Override     @ReadThroughSingleCache(namespace = "goodscenter:EventGoodsDo", expiration = 60)     @CacheName("appCache")     public EventGoodsDo queryEventGoodsDo(@ParameterValueKeyProvider(order = 0) long goodsId, @ParameterValueKeyProvider(order = 1) long eventId) {         return getRemoteServiceBean().queryEventGoodsDo(goodsId, eventId);     }</pre></div></div><p style="margin: 0px 0px 1.375em; padding: 0px;"><strong>更新缓存：</strong></p><div style="margin: 0px;"><div style="margin: 0px;"><strong>EventGoodsDaoImpl.java</strong></div><div style="margin: 0px;"><pre style="margin-top: 0px; margin-bottom: 24px; padding: 5px; background-color: #dddddd; font-size: 9pt; font-family: Monaco, Consolas, 'Lucidia Console', 'Lucidia Sans Typewriter', 'Courier New', Courier, monospace; line-height: 1.2em; overflow: auto;">@BridgeMethodMappings(value = {@BridgeMethodMapping(erasedParamTypes ={Object.class},targetParamTypes = {com.hqb360.promotion.dao.entity.EventGoods.class},methodName = "update")}) public class EventGoodsDaoImpl&amp;lt;EventGoods&amp;gt; extends BaseDaoImpl&amp;lt;EventGoods&amp;gt; implements EventGoodsDao&amp;lt;EventGoods&amp;gt; {      @Override     public DaoStatementName getDaoStatementName() {         return new DefaultDaoStatementName() {             public String getDomainName() {                 return "EventGoods";             }         };     }      @Override     @InvalidateSingleCache(namespace = "goodscenter:EventGoodsDo")     @CacheName("appCache")     public void update(@ParameterValueKeyProvider EventGoods obj) throws DataAccessException {         super.update(obj);     } }</pre></div></div><div style="margin: 0px;"><div style="margin: 0px;"><strong>EventGoods.java</strong></div><div style="margin: 0px;"><pre style="margin-top: 0px; margin-bottom: 24px; padding: 5px; background-color: #dddddd; font-size: 9pt; font-family: Monaco, Consolas, 'Lucidia Console', 'Lucidia Sans Typewriter', 'Courier New', Courier, monospace; line-height: 1.2em; overflow: auto;">    @CacheKeyMethod     public String getCacheKey() {         return goodsId + CACHE_ID_SEPARATOR + eventId;     }      public static final String CACHE_ID_SEPARATOR = "/";</pre></div></div><h5><a name="Java%E5%BA%94%E7%94%A8%E7%9A%84Memcache%E4%BD%BF%E7%94%A8%E7%AD%96%E7%95%A5-%E4%B8%8A%E8%BF%B0%E4%BB%A3%E7%A0%81%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E7%82%B9" style="cursor: pointer; color: rgb(235, 55, 75);"></a>上述代码需要注意的点</h5><ol style="margin: 0px 0px 1.375em 2em; padding: 0px;"><li style="margin: 0px; padding: 0px;">多个方法参数都作为cacheKey时，ParameterValueKeyProvider必须指明其order值</li><li style="margin: 0px; padding: 0px;">多个方法参数作为cacheKey时，参数之间在 / 号分隔</li><li style="margin: 0px; padding: 0px;">EventGoodsDaoImpl类中的update方法参数接收的是一个泛型对象，因此必须在该类上配置BridgeMethodMappings。具体配置见示例</li></ol><h4><a name="Java%E5%BA%94%E7%94%A8%E7%9A%84Memcache%E4%BD%BF%E7%94%A8%E7%AD%96%E7%95%A5-b.%E4%BB%A5bean%E7%9A%84%E6%96%B9%E5%BC%8F%E4%BD%BF%E7%94%A8Cache%E5%AF%B9%E8%B1%A1" style="cursor: pointer; color: rgb(235, 55, 75);"></a>b. 以bean的方式使用Cache对象</h4><p style="margin: 0px 0px 1.375em; padding: 0px;">某些场景我们希望更便捷地自己手动来管理缓存数据，此时需要使用Simple-Spring-Memcached配置中定义的bean。以上面的配置文件为例，使用方法如下<br /><strong>bean的注入：</strong></p><div style="margin: 0px;"><div style="margin: 0px;"><pre style="margin-top: 0px; margin-bottom: 24px; padding: 5px; background-color: #dddddd; font-size: 9pt; font-family: Monaco, Consolas, 'Lucidia Console', 'Lucidia Sans Typewriter', 'Courier New', Courier, monospace; line-height: 1.2em; overflow: auto;">@Autowired private Cache appCache;</pre></div></div><p style="margin: 0px 0px 1.375em; padding: 0px;"><strong>bean的使用:</strong></p><div style="margin: 0px;"><pre style="margin-top: 0px; margin-bottom: 24px; padding: 5px; background-color: #dddddd; font-size: 9pt; font-family: Monaco, Consolas, 'Lucidia Console', 'Lucidia Sans Typewriter', 'Courier New', Courier, monospace; line-height: 1.2em; overflow: auto;">appCache.set(Constants.CACHE_KEY + members.getMemberId(), 3600,cacheValue);</pre></div></div><div id="labels-section" style="margin: 0px;"></div><div id="comments-section" style="margin: 0px;"></div></div></div><div style="margin: 0px; clear: both; font-family: Cambria, Georgia, Times, serif; font-size: 16px; font-weight: normal;"><p style="margin: 0px; padding: 0px; color: #474646; font-size: 0.875em;">Posted in&nbsp;<a href="http://www.colorfuldays.org/category/program/java/" title="View all posts in Java" rel="category tag" style="cursor: pointer; color: #eb374b;">Java</a></p></div></h2><div style="margin: 0px; clear: both; line-height: 21px;"><p style="margin: 0px; padding: 0px; color: #474646; font-size: 0.875em;"><span style="padding-left: 10px;"></span></p></div><p>&nbsp;</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/397372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-04-03 18:45 <a href="http://www.blogjava.net/stevenjohn/archive/2013/04/03/397372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>simple-spring-memcached-3.0.x 注解详解</title><link>http://www.blogjava.net/stevenjohn/archive/2013/04/03/397371.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 03 Apr 2013 10:43:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/04/03/397371.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/397371.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/04/03/397371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/397371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/397371.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">CacheName</span>:&nbsp;<span style="color: #0000ff;">指定缓存实例注解</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">CacheKeyMethod</span>:<span style="color: #0000ff;">缓存key生成注解</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">---------------------------------读取-------------------------------------------</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">ReadThroughAssignCache</span>(assignedKey = "SomePhatKey", namespace = "Echo", expiration = 3000):&nbsp;<span style="color: #0000ff;">读取指定key缓存</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">ReadThroughSingleCache</span>(namespace = SINGLE_NS, expiration = 0):<span style="color: #0000ff;">读取单个缓存</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">ReadThroughMultiCache</span>(option = @<span style="color: #ff0000;">ReadThroughMultiCacheOption</span>(generateKeysFromResult = true)):<span style="color: #0000ff;">读取多个缓存</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">ReadThroughMultiCacheOption</span>(generateKeysFromResult = true)&nbsp;<span style="color: #0000ff;">读取多个缓存操作generateKeysFromResult 通过结果生成key</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">---------------------------------更新-------------------------------------------</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">UpdateAssignCache</span>(assignedKey = "SomePhatKey", namespace = "Echo", expiration = 3000):&nbsp;<span style="color: #0000ff;">指定key更新缓存</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">UpdateSingleCache</span>(namespace = SINGLE_NS, expiration = 2):&nbsp;<span style="color: #0000ff;">更新单个缓存(namespace 命名空间, expiration 失效时间单位秒)</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">UpdateMultiCache</span>(namespace = "Bravo", expiration = 300):&nbsp;<span style="color: #0000ff;">更新多个缓存</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">---------------------------------失效-------------------------------------------</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">InvalidateAssignCache</span>(assignedKey = "SomePhatKey", namespace = "Echo") :&nbsp;<span style="color: #0000ff;">指定key失效缓存</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">InvalidateSingleCache</span>(namespace = SINGLE_NS):<span style="color: #0000ff;">失效单个缓存</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">InvalidateMultiCache</span>(namespace = "Delta") :&nbsp;<span style="color: #0000ff;">失效多个缓存</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">---------------------------------参数-------------------------------------------</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">ParameterDataUpdateContent</span>:&nbsp;<span style="color: #0000ff;">标记方法的参数作为更新内容。这个注解应结合Update*Cache注解使用</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@ParameterValueKeyProvider:&nbsp;<span style="color: #0000ff;">标记将方法的参数做为计算缓存key.如果方法被注解的对象标记CacheKeyMethod的方法将会用来生成缓存key否则调用toString()生成</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@ParameterValueKeyProvider(<span style="color: #ff0000;">order</span>=0)&nbsp;<span style="color: #0000ff;">属性表示如果多个参数做为key时需提供参数顺序</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">与@<span style="color: #ff0000;">ParameterValueKeyProvider</span>类似的注解有:</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">{</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp; @<span style="color: #ff0000;">ReturnValueKeyProvider</span>:&nbsp;<span style="color: #0000ff;">返回值对象中计算key</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">}</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">---------------------------------泛型处理-------------------------------------------</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">@<span style="color: #ff0000;">BridgeMethodMappings</span>({ @<span style="color: #ff0000;">BridgeMethodMapping</span>(methodName = "updateUser",&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">erasedParamTypes = { Object.class }, targetParamTypes = { AppUser.class }) }):&nbsp;<span style="color: #0000ff;">泛型桥接注解</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="color: #ff0000;">methodName&nbsp;</span>:&nbsp;<span style="color: #0000ff;">指定方法</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="color: #ff0000;">erasedParamTypes&nbsp;</span>:&nbsp;<span style="color: #0000ff;">擦除对象类型</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="color: #ff0000;">targetParamTypes&nbsp;</span>:&nbsp;<span style="color: #0000ff;">目标转换类型</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">---------------------------------计数器-------------------------------------------</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="color: #ff0000;">@InvalidateAssignCache</span>&nbsp; :<span style="color: #0000ff;">在给的计算器上加1. 如果不存在则初始化为1</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="color: #ff0000;">@DecrementCounterInCache&nbsp;</span>:&nbsp;<span style="color: #0000ff;">在给的计数器上减1</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="color: #ff0000;">@ReadCounterFromCache</span>&nbsp; :<span style="color: #0000ff;">读取计数器</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><span style="color: #ff0000;">@UpdateCounterFromCache&nbsp;</span>:&nbsp;<span style="color: #0000ff;">更新计数器</span></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><a target="_blank" href="http://www.colorfuldays.org/program/java/bridgemethod%E7%9A%84%E4%BD%9C%E7%94%A8/" style="color: #108ac6;">Simple-Spring-Memcached代码阅读之BridgeMethod</a></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;"><a target="_blank" href="http://www.colorfuldays.org/program/java/bridgemethod%E7%9A%84%E4%BD%9C%E7%94%A8/" style="color: #108ac6;">http://www.colorfuldays.org/program/java/bridgemethod%E7%9A%84%E4%BD%9C%E7%94%A8/</a></p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">http://www.colorfuldays.org/tag/ssm/ &nbsp; 这个系列不错</p><p style="margin: 0px; padding: 0px; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">&nbsp;</p><div style="background-color: #ffffff; margin: 0px 0px 20px; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #a9a9a9; float: left; width: 510px; font-family: Cambria, Georgia, Times, serif; font-size: 16px; line-height: 24px;"><div style="margin: 0px;"><div style="margin: 0px;"><h4>b. 以bean的方式使用Cache对象</h4><p style="margin: 0px; padding: 0px;">某些场景我们希望更便捷地自己手动来管理缓存数据，此时需要使用Simple-Spring-Memcached配置中定义的bean。以上面的配置文件为例，使用方法如下<br /><strong>bean的注入：</strong></p><div style="margin: 0px;"><div style="margin: 0px;"><pre style="font-size: 1em;">@Autowired private Cache appCache;</pre></div></div><p style="margin: 0px; padding: 0px;"><strong>bean的使用:</strong></p><div style="margin: 0px;"><pre style="font-size: 1em;">appCache.set(Constants.CACHE_KEY + members.getMemberId(), 3600,cacheValue);</pre></div></div></div></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/397371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-04-03 18:43 <a href="http://www.blogjava.net/stevenjohn/archive/2013/04/03/397371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memcached_Session_Manager</title><link>http://www.blogjava.net/stevenjohn/archive/2013/01/27/394815.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 27 Jan 2013 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/01/27/394815.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/394815.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/01/27/394815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/394815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/394815.html</trackback:ping><description><![CDATA[<a href="http://www.iteye.com/topic/1125301"><span style="font-size: medium"><font size="3">MSM--Memcached_Session_Manager介绍及使用</font></span><br />http://www.iteye.com/topic/1125301</a><img src ="http://www.blogjava.net/stevenjohn/aggbug/394815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-01-27 22:42 <a href="http://www.blogjava.net/stevenjohn/archive/2013/01/27/394815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>simple-spring-memcached-3.0.x 注解详解 </title><link>http://www.blogjava.net/stevenjohn/archive/2013/01/21/394517.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 21 Jan 2013 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2013/01/21/394517.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/394517.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2013/01/21/394517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/394517.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/394517.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/small_love/article/details/6600391">http://blog.csdn.net/small_love/article/details/6600391</a><br /><a href="http://nassir.iteye.com/blog/1628626">http://nassir.iteye.com/blog/1628626</a><br /><a href="http://www.itivy.com/java/archive/2012/3/13/634672668187652766.html">http://www.itivy.com/java/archive/2012/3/13/634672668187652766.html</a><br />
<h3 sizcache="0" sizset="20"><span class="link_title" sizcache="0" sizset="20"><a href="http://blog.csdn.net/javaman_chen/article/details/7682290">simple-spring-memcached简介 </a></span><br /><a href="http://blog.csdn.net/javaman_chen/article/details/7682290">http://blog.csdn.net/javaman_chen/article/details/7682290</a></h3>
<h3 sizcache="0" sizset="20"><a href="http://blog.csdn.net/a9529lty/article/details/8529421">http://blog.csdn.net/a9529lty/article/details/8529421</a><br /><br /><br /><br /><br /></h3><img src ="http://www.blogjava.net/stevenjohn/aggbug/394517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2013-01-21 22:01 <a href="http://www.blogjava.net/stevenjohn/archive/2013/01/21/394517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring memcache </title><link>http://www.blogjava.net/stevenjohn/archive/2012/11/10/391153.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sat, 10 Nov 2012 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/11/10/391153.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/391153.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/11/10/391153.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/391153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/391153.html</trackback:ping><description><![CDATA[<div>
<p>学习了memcache，这是个好东西，分享一下自己的小实例，也方便以后查找使用</p>
<p>一、前期准备</p>
<p><code class="cpp plain">1)&nbsp; 下载memcached服务端memcached-1.2.6-win32-bin.zip，地址：http:</code><code class="cpp comments">//code.jellycan.com/memcached/</code></p>
<div class="line number2 index1 alt1"><code class="cpp plain">2)&nbsp; 下载java版客户端 java_memcached-release_2.6.1.zip</code></div>
<div class="line number3 index2 alt2"><code class="cpp plain">3)&nbsp; 解压缩memcached-1.2.6-win32-bin.zip到指定目录，例如：D:\memcached-1.2.6-win32 ，</code>在终端（即cmd命令行界面）</div>
<div class="line number3 index2 alt2">&nbsp;</div>
<div class="line number4 index3 alt1"><code class="cpp string">D:\memcached-1.2.6-win32\memcached.exe -d install</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain"></code><code class="cpp string">D:\memcached\memcached.exe -d start</code></div>
<div class="line number5 index4 alt2">&nbsp;</div>
<div class="line number5 index4 alt2"><code class="cpp string"></code><code class="cpp plain">这样memcache就会作为windows系统服务在每次开机时启动memcache服务。</code></div>
<div class="line number5 index4 alt2">&nbsp;</div>
<div class="line number5 index4 alt2">常用命令</div>
<div class="line number5 index4 alt2">&nbsp;</div>
<div class="line number5 index4 alt2"><span>-p 监听的端口&nbsp;</span><br /><span>-l 连接的IP地址, 默认是本机&nbsp;</span><br /><span>-d start 启动memcached服务&nbsp;</span><br /><span>-d restart 重起memcached服务&nbsp;</span><br /><span>-d stop|shutdown 关闭正在运行的memcached服务&nbsp;</span><br /><span>-d install 安装memcached服务&nbsp;</span><br /><span>-d uninstall 卸载memcached服务&nbsp;</span><br /><span>-u 以的身份运行 (仅在以root运行的时候有效)&nbsp;</span><br /><span>-m 最大内存使用，单位MB。默认64MB&nbsp;</span><br /><span>-M 内存耗尽时返回错误，而不是删除项&nbsp;</span><br /><span>-c 最大同时连接数，默认是1024&nbsp;</span><br /><span>-f 块大小增长因子，默认是1.25&nbsp;</span><br /><span>-n 最小分配空间，key+value+flags默认是48&nbsp;</span><br /><span>-h 显示帮助&nbsp;</span></div><br /><br /><br />spring-memcache.xml 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&lt;?</span><span style="color: #000000">xml&nbsp;version</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1.0</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;encoding</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">?&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">beans&nbsp;xmlns</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/beans</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.w3.org/2001/XMLSchema-instance</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;xmlns:aop</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/aop</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:cache</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/cache</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/context</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:mvc</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/mvc</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;xmlns:oxm</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/oxm</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:p</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/p</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;xmlns:util</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/util</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans.xsd&nbsp;&nbsp;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000">//</span><span style="color: #008000">www.springframework.org/schema/aop&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.springframework.org/schema/aop/spring-aop-3.1.xsd</span><span style="color: #008000">&nbsp;&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000">//</span><span style="color: #008000">www.springframework.org/schema/context&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.springframework.org/schema/context/spring-context-3.1.xsd</span><span style="color: #008000">&nbsp;&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000">//</span><span style="color: #008000">www.springframework.org/schema/mvc&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000">//</span><span style="color: #008000">www.springframework.org/schema/util&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.springframework.org/schema/util/spring-util-3.1.xsd</span><span style="color: #008000">"&gt;</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">memcachedPool</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.danga.MemCached.SockIOPool</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory</span><span style="color: #000000">-</span><span style="color: #000000">method</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">getInstance</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;init</span><span style="color: #000000">-</span><span style="color: #000000">method</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">initialize</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;destroy</span><span style="color: #000000">-</span><span style="color: #000000">method</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">shutDown</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">constructor</span><span style="color: #000000">-</span><span style="color: #000000">arg</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">neeaMemcachedPool</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">constructor</span><span style="color: #000000">-</span><span style="color: #000000">arg</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">servers</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">list</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">127.0</span><span style="color: #000000">.</span><span style="color: #000000">0.1</span><span style="color: #000000">:</span><span style="color: #000000">11211</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">list</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">initConn</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">20</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">minConn</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">10</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">maxConn</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">50</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">maintSleep</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">3000</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">nagle</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #0000ff">false</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">socketTO</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">3000</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">memcachedClient</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.danga.MemCached.MemCachedClient</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">constructor</span><span style="color: #000000">-</span><span style="color: #000000">arg</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">neeaMemcachedPool</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">constructor</span><span style="color: #000000">-</span><span style="color: #000000">arg</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">beans</span><span style="color: #000000">&gt;</span></div><br /><br /><br /><br /><br /><br />测试类：<br />
<p>package com.abin.lee.spring.memcache;</p>
<p>import org.junit.BeforeClass;<br />import org.junit.Test;<br />import org.springframework.context.ApplicationContext;<br />import org.springframework.context.support.ClassPathXmlApplicationContext;</p>
<p>import com.danga.MemCached.MemCachedClient;</p>
<p>public class MemcacheUtilTest {<br />&nbsp;static MemCachedClient memcachedClient;<br />&nbsp;@BeforeClass<br />&nbsp;public static void setUpBeforeClass() throws Exception {<br />&nbsp;&nbsp;ApplicationContext context= new ClassPathXmlApplicationContext("com/abin/lee/spring/memcache/spring-memcache.xml");<br />&nbsp;&nbsp;memcachedClient= (MemCachedClient)context.getBean("memcachedClient");<br />&nbsp;}</p>
<p>&nbsp;@Test<br />&nbsp;public void test() {<br />&nbsp;&nbsp;memcachedClient.set("name", "abin");<br />&nbsp;&nbsp;System.out.println(memcachedClient.get("name"));<br />&nbsp;}<br />}<br /></p></div><img src ="http://www.blogjava.net/stevenjohn/aggbug/391153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-11-10 22:33 <a href="http://www.blogjava.net/stevenjohn/archive/2012/11/10/391153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memcached安装、使用，与AOP集成</title><link>http://www.blogjava.net/stevenjohn/archive/2012/10/26/390299.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 26 Oct 2012 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/10/26/390299.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/390299.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/10/26/390299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/390299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/390299.html</trackback:ping><description><![CDATA[<p><strong>一：安装</strong><br />&nbsp; 1，如果是LINUX系统，可以到官方网址http://memcached.org/进行下载，安装教程网上一大堆，这里不再叙述。<br />&nbsp; 2，如果是WINDOWS系统</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; - 到http://code.jellycan.com/memcached/下载稳定版。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; - 下载后解压到某个盘下面，比如在c:\memcached，在终端（也即cmd命令界面）下输入 &#8216;c:\memcached\memcached.exe -d install&#8217; 安装。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; - 再输入： &#8216;c:\memcached\memcached.exe -d start&#8217; 启动。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; - 修改memcache的内存大小，可以在注册表里找到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/memcached Server，修改ImagePath的值为<br />&#8220;C:/memcached/memcached.exe&#8221; -d runservice -m 512<br />&nbsp; NOTE: Windows版本一般用作开发调试只用，不建议在产品环境中使用。<br /><br /><strong>二：JAVA连接使用Memcached</strong><br />&nbsp; 1, 下载memcached客户端开发包，地址https://github.com/gwhalin/Memcached-Java-Client<br />&nbsp; 2，下面是一个连接并使用的简单例子</p>
<p>&nbsp;</p>
<p>package com.ea.online.memcache;</p>
<p>import java.util.Date;</p>
<p>import com.danga.MemCached.MemCachedClient;<br />import com.danga.MemCached.SockIOPool;</p>
<p>public class MyClass {</p>
<p>&nbsp;&nbsp;&nbsp; // create a static client as most installs only need<br />&nbsp;&nbsp;&nbsp; // a single instance<br />&nbsp;&nbsp;&nbsp; protected static MemCachedClient mcc = new MemCachedClient();</p>
<p>&nbsp;&nbsp;&nbsp; protected static SockIOPool pool = null;<br />&nbsp;&nbsp;&nbsp; // set up connection pool once at class load<br />&nbsp;&nbsp;&nbsp; static {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Server list<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] servers = { "localhost:11211" };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Specify memcached capacity<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer[] weights = { 3, 3, 2 };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * String[] serverlist = { "cache0.server.com:12345",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * "cache1.server.com:12345" }; Integer[] weights = { new<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Integer(5), new Integer(2) }; int initialConnections = 10; int<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * minSpareConnections = 5; int maxSpareConnections = 50; long<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * maxIdleTime = 1000 * 60 * 30; // 30 minutes long maxBusyTime = 1000 *<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 60 * 5; // 5 minutes long maintThreadSleep = 1000 * 5; // 5 seconds<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * int socketTimeOut = 1000 * 3; // 3 seconds to block on reads int<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * socketConnectTO = 1000 * 3; // 3 seconds to block on initial<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * connections. If 0, then will use blocking connect (default) boolean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * failover = false; // turn off auto-failover in event of server down<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * boolean nagleAlg = false; // turn off Nagle's algorithm on all<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * sockets in pool boolean aliveCheck = false; // disable health check<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * of socket on checkout<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * SockIOPool pool = SockIOPool.getInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setServers(serverlist);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setWeights(weights);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setInitConn(initialConnections);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setMinConn(minSpareConnections);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setMaxConn(maxSpareConnections); pool.setMaxIdle(maxIdleTime);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setMaxBusyTime(maxBusyTime);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setMaintSleep(maintThreadSleep);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setSocketTO(socketTimeOut); pool.setNagle(nagleAlg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * pool.setAliveCheck(true); pool.initialize();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // grab an instance of our connection pool<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool = SockIOPool.getInstance();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set the servers and the weights<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setServers(servers);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setWeights(weights);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Specify main thread maintain frequency<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setMaintSleep(30);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set some TCP settings<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // disable nagle<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setNagle(false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set the read timeout to 3 secs<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setSocketTO(3000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // and don't set a connect timeout<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setSocketConnectTO(0);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // initialize the connection pool<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.initialize();</p>
<p><br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; // from here on down, you can call any of the client calls<br />&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Test expired<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mcc.set("foo", "This is a test String", new Date(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Date().getTime() + 3000));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String bar = mcc.get("foo").toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("test--&gt;" + bar);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (true) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(mcc.get("foo"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // pool.shutDown();<br />&nbsp;&nbsp;&nbsp; }<br />}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>详细使用可以借鉴这篇文章：http://sillycat.iteye.com/blog/563615</strong><br /><br /><strong>三：结合AOP编程</strong><br />&nbsp; 1，对于memcached与spring aop的集成网上又是一堆，这里不提了。<br />&nbsp; 2，对于memcached与guice aop的集成可参考http://code.google.com/p/google-guice/wiki/AOP<br />&nbsp; 3，对于需要通过手动实现动态代理的方式来实现AOP的可以参考 http://www.blogjava.net/DoubleJ/archive/2008/03/04/183796.html<br /><br /><strong>四：一个简单的环绕通知切面，不可运行，仅作参考</strong></p>
<p>public Around implements MethodInterceptor {<br />&nbsp;....<br />&nbsp;&nbsp;&nbsp; public Object invoke(MethodInvocation mi, Object[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object obj = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从Memcached中获取<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj = mcc.get(this.class.getName() + mi.getMethodName() + args.hashcode());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(obj != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj = method.invoke(args);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //存入Memcached<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mcc.set(this.class.getName() + mi.getMethodName() + args.hashcode, obj, expiredDate);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return obj;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;....<br />}&nbsp;</p><img src ="http://www.blogjava.net/stevenjohn/aggbug/390299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-10-26 22:54 <a href="http://www.blogjava.net/stevenjohn/archive/2012/10/26/390299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcached的数据怎么与数据库的数据保持同步啊？？</title><link>http://www.blogjava.net/stevenjohn/archive/2012/10/23/390098.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 23 Oct 2012 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/10/23/390098.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/390098.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/10/23/390098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/390098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/390098.html</trackback:ping><description><![CDATA[<p><font face="Verdana">虾米(354668137)&nbsp; 11:17:35<br />memcached的数据怎么与数据库的数据保持同步啊？？<br />南京-HF(226358522)&nbsp; 11:18:04<br />手动同步<br />南京-HF(226358522)&nbsp; 11:18:06<br />代码实现<br />沧海长风(136419390)&nbsp; 11:18:12<br />两边同时写<br />沧海长风(136419390)&nbsp; 11:18:31<br />或者定期写<br />沧海长风(136419390)&nbsp; 11:18:35<br />或者特定条件写<br />虾米(354668137)&nbsp; 11:19:23<br />额，memcached没有提供相关的支持吗<br />南京-HF(226358522)&nbsp; 11:20:30<br />有个对mysql的同步的库<br />南京-HF(226358522)&nbsp; 11:20:49<br />是由mysql同步数据到memcached的<br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:21:13<br />虾米(354668137)&nbsp; 11:17:35<br />memcached的数据怎么与数据库的数据保持同步啊？？<br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:21:16<br />同求。<br />南京-HF(226358522)&nbsp; 11:21:22<br />他的机制也就是，写都是往mysql写，查询从memcached里面查询<br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:22:29<br />这样写mysql的时候同样得更新mc吧。</font></p>
<p><font face="Verdana"></font>&nbsp;</p>
<p><font face="Verdana">南京-HF(226358522)&nbsp; 11:22:44<br />对<br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:22:50<br />加mc 本来就是为了减少mysql操作的。。<br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:22:54<br />这样子都没啥意义了。。<br />南京-HF(226358522)&nbsp; 11:23:07<br />应该是mysql里面有触发器，当数据有改变，就会同步到memcached<br />南京-HF(226358522)&nbsp; 11:23:30<br />就看你以哪个数据为主了<br />南京-HF(226358522)&nbsp; 11:24:04<br />这样memcached的目的就是加快你的查询速度<br />沧海长风(136419390)&nbsp; 11:24:18<br />这方案根据自己需求设定<br />沧海长风(136419390)&nbsp; 11:24:23<br />组合很多吧<br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:25:03<br />最近也碰到。。mysql与mc同步的。。不知道有啥好方案<br />南京-HF(226358522)&nbsp; 11:25:08<br />毕竟，查询用的是最多的。修改或者插入的话，数据库的数据必须得边，所以才有这么个方案。当然这个也不一定适合你们的场景，你自己取舍<br />南京-HF(226358522)&nbsp; 11:26:21<br />如果你的数据，增删改查都很频繁那这种就不适合了<br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:26:54<br />恩。。这样的话读写都直接对mc操作。。然后定时同步。。<br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:27:09<br />但是蛋疼的就是同步方案。。</font></p>
<p><font face="Verdana"><br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:27:25<br />不好做增量同步。。<br />沧海长风(136419390)&nbsp; 11:27:31<br />有时做些冗余是不错的<br />&#950; 过了时的流行 ♬(779014475)&nbsp; 11:27:36<br />服务端用c写的。<br /></font></p><img src ="http://www.blogjava.net/stevenjohn/aggbug/390098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-10-23 13:19 <a href="http://www.blogjava.net/stevenjohn/archive/2012/10/23/390098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【学习点滴-memcached】mecached内存管理与原理</title><link>http://www.blogjava.net/stevenjohn/archive/2012/09/03/386862.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 03 Sep 2012 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2012/09/03/386862.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/386862.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2012/09/03/386862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/386862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/386862.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/ohmygirl/article/details/7776013">http://blog.csdn.net/ohmygirl/article/details/7776013</a>&nbsp; <br /><br /><a href="http://blog.csdn.net/laigood12345/article/details/7350295">http://blog.csdn.net/laigood12345/article/details/7350295</a><img src ="http://www.blogjava.net/stevenjohn/aggbug/386862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2012-09-03 13:14 <a href="http://www.blogjava.net/stevenjohn/archive/2012/09/03/386862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>