一篇文章让你了解并掌握memcached

一篇文章让你了解并掌握memcached

第一章 memcached简介

1.1为什么引入memcached

随着数据量的增大,访问的集中,REBMS负担加重,数据库响应恶化。

Memcached是高性能的分布式内存缓存服务器,目的是通过缓存数据库查询结果,减少数据库的访问次数,以提高动态web应用的速度,提高扩展性。

1.2memcached作为高速运行的分布式缓存服务器具有的特点

具有以下特点:

(1)协议简单:基于文本的协议,最终使用二进制协议代替文本协议,提高memcached的性能,减少文本协议漏洞。从1.3版本开始支持二进制协议。

(2)基于libevent的事件处理:所以能在linux、BSD、Solaris等操作系统上发挥其高性能。

(3)内置内存存储方式:memcached保存的数据都存储在memcached内置的内存存储空间中,重启memcached或重启系统,都会导致数据全部消失。几户不占用CPU。

(4)memcached不互通信的分布式:memcached尽管是分布式缓存服务器,但是服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。他的分布式主要是通过客户端来实现。

第二章 memcached内存管理

2.1 Slab Allocator内存管理

Memcached采用Slab Allocator来进行内存管理。

Slab Allocator基本原理:按照预先规定的大小,将分配的内存分割成特定长度的块。已完全解决内存碎片问题。

Slab Allocator缺点:由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。可以通过growth factor选项,调节slab class大小的差别。

2.2 memcached中的数据删除

删除数据时并不会真正从memcached中消失,memcached也不会释放已分配的内存。记录超时后,客户端无法查看该记录(透明的),其存储空间即可重复利用。

Memcached采用的是lazy expiration,内部不会监视记录是否过期,而是get时查看记录的时间戳,检查记录是否过期。

缓存容量满时的删除机制,需要考虑多种机制。一方面是按队列机制,一方面应该对应缓存对象本省的优先级,根据缓存对象的优先级进行对象的删除。

第三章 memcached分布式

3.1memcached分布式

Memcached虽然称为分布式缓存服务器,但是服务器端并没有分布式功能。Memcached的分布式完全由客户端实现。

例如:下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据。

首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。同样,“kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存。

接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。

这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。 memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。

第四章 缓存多副本

4.1缓存失效情况

(1)缓存超时被移除

(2)缓存由于存储空间限制被移除

(3)由于缓存节点变化而导致的缓存失效

4.2缓存多副本作用

缓存多副本主要是用于在缓存数据时存放缓存的多个副本,以防止缓存失效,同时,缓存多个副本可以作分布式并行读。

第五章 缓存的一致性问题

5.1缓存的一致性问题

对于读的情况下,如果存在数据变化,一种是同时更新缓存和数据库,另一种是直接对缓存进行失效处理。

缓存数据尽量只读,缓存本省不适合大量写和更新操作的数据场景。

第六章 memcached与spring整合

Memcached在项目中使用有两种方式,一种是使用工具类进行操作,另外一种是通过配置application.xml文件来进行操作。不论哪种方式,都需要先安装memcached.exe,启动服务后才可以在项目中进行操作。

6.1memcached.exe安装

(1)安装memcached.exe,解压后放在c盘的memcached文件下。

(2)cmd下,安装memcached

c:/memcached/memcached.exe –d install

(3)cmd下,启动memcached服务

c:/memcached/memcached.exe –d start

6.2使用工具类进行操作

(1)引入java_memcached-release_2.0.1.jar

(2)编写memcached工具类

1 package com.cmcc.core.Util; 2 3 import java.util.Date; 4 5 import com.danga.MemCached.MemCachedClient; 6 7 import com.danga.MemCached.SockIOPool; 8 9 10 11 public class MemcachedUtil { 12 13 14 15 protected static MemCachedClient mcc = new MemCachedClient; 16 17 18 19 protected static MemcachedUtil memCached = new MemcachedUtil; 20 21 22 23 24 25 static { 26 27 28 29 String servers = { "127.0.0.1:11211" }; 30 31 Integer weights = { 3 }; 32 33 34 35 //获取连接池的实例 36 37 SockIOPool pool = SockIOPool.getInstance; 38 39 40 41 //设置连接服务器和权重 42 43 pool.setServers(servers); 44 45 pool.setWeights(weights); 46 47 48 49 pool.setInitConn(5);//设置初始连接数 50 51 pool.setMinConn(5);//设置最小连接数 52 53 pool.setMaxConn(250);//设置最大连接数 54 55 pool.setMaxIdle(1000 * 60 * 60 * 6);//设置最大处理时间 56 57 58 59 pool.setMaintSleep(30);//设置连接池守护线程的睡眠时间 60 61 62 63 //设置TCP参数,连接超时 64 65 pool.setNagle(false); 66 67 pool.setSocketTO(3000); 68 69 pool.setSocketConnectTO(0); 70 71 72 73 //初始化并启动线程池 74 75 pool.initialize; 76 77 78 79 //压缩设置,超过指定大小的都压缩 80 81 mcc.setCompressEnable(true); 82 83 mcc.setCompressThreshold(64 * 1024); 84 85 } 86 87 88 89 /** 90 91 * 构造函数 92 93 * 94 95 */ 96 97 protected MemcachedUtil { 98 99 100 101 }102 103 104 105 /**106 107 * 获取memcached实例108 109 *110 111 * @return112 113 */114 115 public static MemcachedUtil getInstance {116 117 return memCached;118 119 }120 121 122 123 /**124 125 * 退出126 127 */128 129 public static void shutDown {130 131 memCached.shutDown;132 133 }134 135 136 137 /**138 139 * 添加140 141 *142 143 * @param key144 145 * @param value146 147 * @return148 149 */150 151 public boolean add(String key, Object value) {152 153 return mcc.add(key, value);154 155 }156 157 158 159 public boolean add(String key, Object value, Date expiry) {160 161 return mcc.add(key, value, expiry);162 163 }164 165 166 167 public boolean replace(String key, Object value) {168 169 return mcc.replace(key, value);170 171 }172 173 174 175 public boolean replace(String key, Object value, Date expiry) {176 177 return mcc.replace(key, value, expiry);178 179 }180 181 182 183 /**184 185 * 根据键取值186 187 *188 189 * @param key190 191 * @return192 193 */194 195 public Object get(String key) {196 197 return mcc.get(key);198 199 }200 201 202 203 public static void main(String[] args) {204 205 MemcachedUtil cache = MemcachedUtil.getInstance;206 207 cache.add(" hello ", 234);208 209 System.out.print(" get value : " + cache.get(" hello "));210 211 }212 213 }

(3)如果需要缓存自定义对象,则该类必须实现Serializable接口。

6.3 spring配置文件中进行配置

(1)引入java_memcached-release_2.0.1.jar

(2)编写memcache.properties文件

memcache.server=127.0.0.1:11211memcache.weights=1memcache.initConn=1memcache.minConn=1memcache.maxConn=50memcache.maintSleep=3000memcache.nagle=falsememcache.socketTO=3000

(3)修改spring配置文件

1 <!-- 数据库配置文件读取 --> 2 3 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 4 5 <property name="order" value="1"/> 6 7 <property name="ignoreUnresolvablePlaceholders" value="true"/> 8 9 <property name="locations"> 10 11 <list> 12 13 <value>classpath:com/cmcc/core/Config/database.properties</value>14 15 <value>classpath:com/cmcc/core/Log/memcache.properties</value>16 17 </list> 18 19 </property>20 21 </bean>
1 <!-- memecached配置 --> 2 3 <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" factory-method="getInstance" 4 5 init-method="initialize" destroy-method="shutDown"> 6 7 <constructor-arg><value>memCachedPool</value></constructor-arg> 8 9 <property name="servers"><list><value>${memcache.server}</value></list></property>10 11 <property name="weights"><list><value>${memcache.weights}</value></list></property>12 13 <property name="initConn"><value>${memcache.initConn}</value></property>14 15 <property name="minConn"><value>${memcache.minConn}</value></property>16 17 <property name="maxConn"><value>${memcache.maxConn}</value></property>18 19 <property name="maintSleep"><value>${memcache.maintSleep}</value></property>20 21 <property name="nagle"><value>${memcache.nagle}</value></property>22 23 <property name="socketTO"><value>${memcache.socketTO}</value></property>24 25 </bean>26 27 28 29 <bean id="memCacheClient" class="com.danga.MemCached.MemCachedClient">30 31 <constructor-arg><value>memCachedPool</value></constructor-arg>32 33 </bean>

(4)在业务逻辑中可以直接自动注入使用memCacheClient操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值