Created
March 17, 2014 01:34
-
-
Save ndzj081221130/9592463 to your computer and use it in GitHub Desktop.
2014_3_14_Memcached研究
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 假设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