Skip to content

Instantly share code, notes, and snippets.

@ndzj081221130
Created March 17, 2014 01:34
Show Gist options
  • Select an option

  • Save ndzj081221130/9592463 to your computer and use it in GitHub Desktop.

Select an option

Save ndzj081221130/9592463 to your computer and use it in GitHub Desktop.
2014_3_14_Memcached研究
假设DEA节点来缓存session数据。
我们假设使用Ruby来做缓存。
我们需要一个分布式的缓存。
MemCached是一个强大的分布式高速缓存,并且支持多种语言。
[主页][1]
上述的程序会先到memcached检查是否有userrow:userid的数据,如果有则直接传回结果,如果不存在时再去数据库查询,并将结果放到memcached内。
在memcached内已经有高速缓存信息时将数据库的数据更新后,上述的程序会抓到旧的数据,这是属于Cache coherency的问题。其中一种解决的方法是在更新数据库时,同时更新memcached内的信息。
memcached安装:
sudo apt-get install memcached(注意,虽然项目名是memcache,但这里memcached)
手动启动服务:service memcached start
也可以使用memcached的指令起一個memcached server,-vv指的是將log打開,對debug很好用
memcached -vv
ruby 客户端安装:
sudo apt-get install libsasl2-dev
gem install memcached
登录memcached服务器
telnet localhost 11211
使用11211 memcached預設的port對memached service下stats的指令:
> echo stats | nc 127.0.0.1 11211
demo程序是以搜索SQL查询,并将查询结果缓存到memcached中
那么,以SQL的md5(hash)作为键值对的key,结果作为value。
这里的问题是,结果不会变么?
如果查询之后,数据库变了呢?
这个不管,下面考虑session缓存的数据格式。
一般的session缓存的是cookies。
cookies其实也是一组key,value对。
demo1:
HttpServlet:
get操作中:
>
Cookie nameCookie = new Cookie("name",user_name);
response.addCookie(nameCookie);
Cookie ageCookie = new Cookie("age","user_age");
response.addCookie(ageCookie);
post操作中:
>
Cookie[] cookies = request.getCookies();
for(int i=0;i< cookies.length();i++){
if(cookies[i].getName().equals("name"))
name = cookies[i].getValue();
else if(cookies[i].getName().equals("age"))
age = cookies[i].getName.getValue();
}
在进行请求的时候,根据firefox的network,可以看到,
在get请求头,
request中有Cookie,
Cookie "lastName=fd;firstName=fd"
response头部有设置Cookie
Set-Cookie "lastName=fffirstName=ff"
在post请求头中,有Cookie!
Cookie "lastName=fd;firstName=fd"
response中没有
----------
那么在ruby中。这里的StickyCookieKey是“**JSessionID**”
gorouter里,在http请求的头中,有Cookie
> for _, := range res.Cookies(){
if v.Name == **StickyCookieKey**{
needSticky = true
}
}
if needSticky && v.PrivateInstaceId != ""{
cookie := &http.Cookie{
Name: VcapCookieId,
Value: x.PrivateInstanceId,
Path: "/"
}
http.setCookie(rw,cookie)
}
----------
----------
在Rails中使用memcached:
在Rail3之前的版本,可以使用memcache-client
1. 在Gemfile中加上gem:gem 'memcache-client'
2. 在environments的檔案中加上設定:config.cache_store = :mem_cache_store
3. 接著就可以使用Rails.cache.xxx來使用memcache
在Rail3,則使用dalli
1. 在Gemfile中加上gem:gem 'memcache-client'
2. 在environments的檔案中加上設定:config.cache_store = :dalli_store
3. 接著就可以使用Rails.cache.xxx來使用memcache
使用Rails.cache的方式請參考下面連結:
Link:
Caching with Rails: An overview - http://guides.rubyonrails.org/caching_with_rails.html
Scaling Rails - http://railslab.newrelic.com/scaling-rails
Scaling Rails中文化 - by xdite - http://wp.xdite.net/?cat=84
----------
**验证HttpSession**
[1]: https://code.google.com/p/memcached/wiki/Clients
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment