读书人

Memcached 学习札记一

发布时间: 2012-07-08 17:43:44 作者: rapoo

Memcached 学习笔记一

(2010-03-26 17:03:19)Memcached 学习札记一转载1???????Memcache是什么

Memcache是danga.com的一个项目,最早是为?LiveJournal?服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。

它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。

???

为什么会有Memcache和memcached两种名称?

其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,

????

Memcache官方网站:http://www.danga.com/memcached,

?

2???????Memcache工作原理

首先?memcached?是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端?API?包括?Perl/PHP/Python/Ruby/Java/C#/C?等等。客户端在与?memcached?服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符?key,存取操作均通过这个?key?进行,保存到?memcached?中的对象实际上是放置内存中的,并不是保存在?cache?文件中的,这也是为什么memcached?能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

?

与许多?cache?工具类似,Memcached?的原理并不复杂。它采用了C/S的模式,在?server?端启动服务进程,在启动时可以指定监听的?ip,自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。Memcached?的目前版本是通过C实现,采用了单进程,单线程,异步I/O,基于事件?(event_based)?的服务方式.使用?libevent?作为事件通知实现。多个?Server?可以协同工作,但这些?Server?之间是没有任何通讯联系的,每个?Server?只是对自己的数据进行管理。Client?端通过指定?Server?端的?ip?地址(通过域名应该也可以)。需要缓存的对象或数据是以?key->value?对的形式保存在Server端。key?的值通过?hash?进行转换,根据?hash?值把?value?传递到对应的具体的某个?Server?上。当需要获取对象数据时,也根据?key?进行。首先对?key?进行?hash,通过获得的值可以确定它被保存在了哪台?Server?上,然后再向该?Server?发出请求。Client?端只需要知道保存?hash(key)?的值在哪台服务器上就可以了。

?

????????其实说到底,memcache?的工作就是在专门的机器的内存里维护一张巨大的?hash?表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。

?

3???????如何使用
  • 建立Manager类

    ??

    Java代码
    1. package?com.alisoft.sme.memcached; ??
    2. ??
    3. import?java.util.Date; ??
    4. ??
    5. import?com.danga.MemCached.MemCachedClient; ??
    6. import?com.danga.MemCached.SockIOPool; ??
    7. ??
    8. public?class?MemCachedManager?{ ??
    9. ??
    10. ????//?创建全局的唯一实例???
    11. ????protected?static?MemCachedClient?mcc?=?new?MemCachedClient(); ??
    12. ??
    13. ????protected?static?MemCachedManager?memCachedManager?=?new?MemCachedManager(); ??
    14. ??
    15. ????//?设置与缓存服务器的连接池???
    16. ????static?{ ??
    17. ????????//?服务器列表和其权重???
    18. ????????String[]?servers?=?{?"127.0.0.1:11211"?}; ??
    19. ????????Integer[]?weights?=?{?3?}; ??
    20. ??
    21. ????????//?获取socke连接池的实例对象???
    22. ????????SockIOPool?pool?=?SockIOPool. getInstance_r(); ??
    23. ??
    24. ????????//?设置服务器信息???
    25. ????????pool.setServers(servers); ??
    26. ????????pool.setWeights(weights); ??
    27. ??
    28. ????????//?设置初始连接数、最小和最大连接数以及最大处理时间???
    29. ????????pool.setInitConn(5); ??
    30. ????????pool.setMinConn(5); ??
    31. ????????pool.setMaxConn(250); ??
    32. ????????pool.setMaxIdle(1000?*?60?*?60?*?6); ??
    33. ??
    34. ????????//?设置主线程的睡眠时间???
    35. ????????pool.setMaintSleep(30); ??
    36. ??
    37. ????????//?设置TCP的参数,连接超时等???
    38. ????????pool.setNagle(false); ??
    39. ????????pool.setSocketTO(3000); ??
    40. ????????pool.setSocketConnectTO(0); ??
    41. ??
    42. ????????//?初始化连接池???
    43. ????????pool.initialize(); ??
    44. ??
    45. ????????//?压缩设置,超过指定大小(单位为K)的数据都会被压缩???
    46. ????????mcc.setCompressEnable(true); ??
    47. ????????mcc.setCompressThreshold(64?*?1024); ??
    48. ????} ??
    49. ??
    50. ??????
    51. ????protected?MemCachedManager()?{ ??
    52. ??
    53. ????} ??
    54. ??
    55. ??????
    56. ????public?static?MemCachedManager??getInstance_r()?{ ??
    57. ????????return?memCachedManager; ??
    58. ????} ??
    59. ??
    60. ??????
    61. ????public?boolean?add(String?key,?Object?value)?{ ??
    62. ????????return?mcc.add(key,?value); ??
    63. ????} ??
    64. ??
    65. ????public?boolean?add(String?key,?Object?value,?Date?expiry)?{ ??
    66. ????????return?mcc.add(key,?value,?expiry); ??
    67. ????} ??
    68. ??
    69. ????public?boolean?replace(String?key,?Object?value)?{ ??
    70. ????????return?mcc.replace(key,?value); ??
    71. ????} ??
    72. ??
    73. ????public?boolean?replace(String?key,?Object?value,?Date?expiry)?{ ??
    74. ????????return?mcc.replace(key,?value,?expiry); ??
    75. ????} ??
    76. ??
    77. ??????
    78. ????public?Object??get_r(String?key)?{ ??
    79. ????????return?mcc. get_r(key); ??
    80. ????} ??
    81. ??
    82. ????public?static?void?main(String[]?args)?{ ??
    83. ????????MemCachedManager?cache?=?MemCachedManager. getInstance_r(); ??
    84. ????????cache.add("hello",?234); ??
    85. ????????System.out.print("get?value?:?"?+?cache. get_r("hello")); ??
    86. ????} ??
    87. }??

    ?建立数据对象Java代码
    1. package?com.alisoft.sme.memcached; ??
    2. ??
    3. import?java.io.Serializable; ??
    4. ??
    5. public?class?TBean?implements?Serializable?{ ??
    6. ???????
    7. ????private?static?final?long?serialVersionUID?=?1945562032261336919L; ??
    8. ??
    9. ????private?String?name; ??
    10. ??
    11. ????public?String??getName_r()?{ ??
    12. ????????return?name; ??
    13. ????} ??
    14. ??
    15. ????public?void?setName(String?name)?{ ??
    16. ????????this.name?=?name; ??
    17. ????} ??
    18. }??
    Java代码
    1. </SPAN></SPAN> ??
    2. <PRE?class=java?name="code">?</PRE> ??
    3. </H1> ??
    4. <H2?style="MARGIN:?13pt?0cm?13pt?28.8pt"><SPAN?lang=EN-US><SPAN><SPAN?style="FONT-FAMILY:?&apos">???</SPAN></SPAN></SPAN><SPAN><SPAN?style="FONT-SIZE:?large">创建测试用例</SPAN></SPAN></H2> ??
    5. <H2?style="MARGIN:?13pt?0cm?13pt?28.8pt">?</H2> ??
    6. <PRE?class=java?name="code">package?com.alisoft.sme.memcached.test; ??
    7. ??
    8. import?junit.framework.TestCase; ??
    9. ??
    10. import?org.junit.Test; ??
    11. ??
    12. import?com.alisoft.sme.memcached.MemCachedManager; ??
    13. import?com.alisoft.sme.memcached.TBean; ??
    14. ??
    15. public?class?TestMemcached?extends?TestCase?{ ??
    16. ??
    17. ????private?static?MemCachedManager?cache; ??
    18. ??
    19. ????@Test??
    20. ????public?void?testCache()?{ ??
    21. ???????????
    22. ????????TBean?tb?=?new?TBean(); ??
    23. ????????tb.setName("E网打进"); ??
    24. ????????cache.add("bean",?tb); ??
    25. ???????????
    26. ????????TBean?tb1?=?(TBean)?cache. get_r("bean"); ??
    27. ????????System.out.println("name="?+?tb1. getName_r()); ??
    28. ????????tb1.setName("E网打进_修改的"); ??
    29. ???????????
    30. ????????tb1?=?(TBean)?cache. get_r("bean"); ??
    31. ????????System.out.println("name="?+?tb1. getName_r()); ??
    32. ????} ??
    33. ??
    34. ????@Override??
    35. ????protected?void?setUp()?throws?Exception?{ ??
    36. ????????super.setUp(); ??
    37. ????????cache?=?MemCachedManager. getInstance_r(); ??
    38. ????} ??
    39. ??
    40. ????@Override??
    41. ????protected?void?tearDown()?throws?Exception?{ ??
    42. ????????super.tearDown(); ??
    43. ????????cache?=?null; ??
    44. ????} ??
    45. ??
    46. } ??
    47. </PRE> ??
    48. <H2?style="MARGIN:?13pt?0cm?13pt?28.8pt">?<SPAN>测试结果</SPAN></H2> ??
    49. <H2?style="MARGIN:?13pt?0cm?13pt?28.8pt"><SPAN> ??
    50. <PRE?class=java?name="code">[INFO]?++++?serializing?for?key:?bean?for?class:?com.alisoft.sme.memcached.TBean ??
    51. [INFO]?++++?memcache?cmd?(result?code):?add?bean?8?0?93?(NOT_STORED) ??
    52. [INFO]?++++?data?not?stored?in?cache?for?key:?bean ??
    53. [INFO]?++++?deserializing?class?com.alisoft.sme.memcached.TBean ??
    54. name=E网打进 ??
    55. [INFO]?++++?deserializing?class?com.alisoft.sme.memcached.TBean ??
    56. name=E网打进 ??
    57. </PRE> ??
    58. ?</SPAN></H2> ??

    ?

读书人网 >软件架构设计

热点推荐