|
1. 下载memcached客户端文件
把下载文件放在文件目录下
2. 安装 memcached
命令: c:/memcached/memcached.exe -d install
3. 启动 memcached
c:/memcached/memcached.exe -d start
4. 连接到 memcached
telnet localhost 11211
5:客户端使用的基本命令
启动/结束
memcached -d -m 10 -u root -l 127.0.0.1 -p 11200 -c 256 -P /tmp/memcached.pid
-d 选项是启动一个守护进程
-m 是分配给Memcache使用的内存数量,单位是MB,这里是10MB
-u 是运行Memcache的用户,这里是root
-l 是监听的服务器IP地址,如果有多个地址的话,这里指定了服务器的IP地址127.0.0.1
-p 是设置Memcache监听的端口,这里设置了12000,最好是1024以上的端口
-c 选项是最大运行的并发连接数,默认是1024,这里设置了256,按照你服务器的负载量来设定
-P 是设置保存Memcache的pid文件
kill `cat /tmp/memcached.pid` 关闭memcached
6:在项目中使用(与Spring集成)
获取Memcached API 地址 :
创建接口MemcachedClient
1 import java.util.Collection;
2 import java.util.Map;
3 import java.util.concurrent.TimeoutException;
4
5 /**
6 * 提供通用的memcached访问接口
7 */
8 public interface MemcachedClient {
9 /**
10 * 不管数据存在不存在都会将目前设置的数据存储的memcached
11 *
12 * @param key
13 * 不要超过250字节
14 * @param exp
15 * 以秒为单位,如果超过30天的值,将会用unix timestamp来制定截止有效时间
16 * @param value
17 * @return
18 * @throws TimeoutException
19 * @throws InterruptedException
20 * @throws MemcachedClientException
21 */
22 boolean set(String key, int exp, Object value) throws TimeoutException,
23 InterruptedException, MemcachedClientException;
24
25 /**
26 * 不管数据存在不存在都会将目前设置的数据存储的memcached,自行制定超时时间
27 *
28 * @see #set(String, int, Object)
29 * @param key
30 * @param exp
31 * @param value
32 * @param timeout
33 * @return
34 * @throws TimeoutException
35 * @throws InterruptedException
36 * @throws MemcachedClientException
37 */
38 boolean set(String key, int exp, Object value, long timeout)
39 throws TimeoutException, InterruptedException,
40 MemcachedClientException;
41
42 /**
43 * 不管数据存在不存在都会将目前设置的数据存储的memcached,但不等待返回确认
44 *
45 * @see #set(String, int, Object)
46 * @param key
47 * @param exp
48 * @param value
49 * @throws InterruptedException
50 * @throws MemcachedClientException
51 */
52 void setWithNoReply(String key, int exp, Object value)
53 throws InterruptedException, MemcachedClientException;
54
55 /**
56 * 只有数据不存在时进行添加
57 *
58 * @param key
59 * 不要超过250字节
60 * @param exp
61 * 以秒为单位,如果超过30天的值,将会用unix timestamp来制定截止有效时间
62 * @param value
63 * @return
64 * @throws TimeoutException
65 * @throws InterruptedException
66 * @throws MemcachedClientException
67 */
68 boolean add(String key, int exp, Object value) throws TimeoutException,
69 InterruptedException, MemcachedClientException;
70
71 /**
72 * 只有数据不存在时进行添加
73 *
74 * @param key
75 * @param exp
76 * 以秒为单位,如果超过30天的值,将会用unix timestamp来制定截止有效时间
77 * @param value
78 * @param timeout
79 * 1/1000秒为单位,在制定的时间段内没有响应就抛出TimeoutException
80 * @return
81 * @throws TimeoutException
82 * @throws InterruptedException
83 * @throws MemcachedClientException
84 */
85 boolean add(String key, int exp, Object value, long timeout)
86 throws TimeoutException, InterruptedException,
87 MemcachedClientException;
88
89 /**
90 * 只有数据不存在时进行添加,不需要返回具体的确认信息,大多数情况下可以用此方法来提升效率,毕竟我们对Memcached的理解是假设数据不是持久的
91 *
92 * @param key
93 * @param exp
94 * @param value
95 * @throws InterruptedException
96 * @throws MemcachedClientException
97 */
98 void addWithNoReply(String key, int exp, Object value)
99 throws InterruptedException, MemcachedClientException;
100
101 /**
102 * 只有数据存在才进行覆盖
103 *
104 * @param key
105 * @param exp
106 * @param value
107 * @return
108 * @throws TimeoutException
109 * @throws InterruptedException
110 * @throws MemcachedClientException
111 */
112 boolean replace(String key, int exp, Object value) throws TimeoutException,
113 InterruptedException, MemcachedClientException;
114
115 /**
116 * 只有数据存在才进行覆盖
117 *
118 * @param key
119 * @param exp
120 * @param value
121 * @param timeout
122 * @return
123 * @throws TimeoutException
124 * @throws InterruptedException
125 * @throws MemcachedClientException
126 */
127 boolean replace(String key, int exp, Object value, long timeout)
128 throws TimeoutException, InterruptedException,
129 MemcachedClientException;
130
131 /**
132 * 只有数据存在才进行覆盖,不等返回确认
133 *
134 * @param key
135 * @param exp
136 * @param value
137 * @throws InterruptedException
138 * @throws MemcachedClientException
139 */
140 void replaceWithNoReply(String key, int exp, Object value)
141 throws InterruptedException, MemcachedClientException;
142
143 /**
144 * 追加到当前数据的后面
145 *
146 * @param key
147 * @param value
148 * @return
149 * @throws TimeoutException
150 * @throws InterruptedException
151 * @throws MemcachedClientException
152 */
153 boolean append(String key, Object value) throws TimeoutException,
154 InterruptedException, MemcachedClientException;
155
156 /**
157 * 追加到当前数据的后面
158 *
159 * @param key
160 * @param value
161 * @param timeout
162 * @return
163 * @throws TimeoutException
164 * @throws InterruptedException
165 * @throws MemcachedClientException
166 */
167 boolean append(String key, Object value, long timeout)
168 throws TimeoutException, InterruptedException,
169 MemcachedClientException;
170
171 /**
172 * 追加到当前数据的后面,不等待响应
173 *
174 * @param key
175 * @param value
176 * @throws InterruptedException
177 * @throws MemcachedClientException
178 */
179 void appendWithNoReply(String key, Object value)
180 throws InterruptedException, MemcachedClientException;
181
182 /**
183 * 追加到当前数据的前面
184 *
185 * @param key
186 * @param value
187 * @return
188 * @throws TimeoutException
189 * @throws InterruptedException
190 * @throws MemcachedClientException
191 */
192 boolean prepend(String key, Object value) throws TimeoutException,
193 InterruptedException, MemcachedClientException;
194
195 /**
196 * 追加到当前数据的前面
197 *
198 * @param key
199 * @param value
200 * @param timeout
201 * @return
202 * @throws TimeoutException
203 * @throws InterruptedException
204 * @throws MemcachedClientException
205 */
206 boolean prepend(String key, Object value, long timeout)
207 throws TimeoutException, InterruptedException,
208 MemcachedClientException;
209
210 /**
211 * 追加到当前数据的前面,不等待返回
212 *
213 * @param key
214 * @param value
215 * @throws InterruptedException
216 * @throws MemcachedClientException
217 */
218 void prependWithNoReply(String key, Object value)
219 throws InterruptedException, MemcachedClientException;
220
221 long incr(String key, long delta, long initValue) throws TimeoutException,
222 InterruptedException, MemcachedClientException;
223
224 long incr(String key, long delta, long initValue, long timeout)
225 throws TimeoutException, InterruptedException,
226 MemcachedClientException;
227
228 void incrWithNoReply(String key, long delta) throws InterruptedException,
229 MemcachedClientException;
230
231 long decr(String key, long delta, long initValue) throws TimeoutException,
232 InterruptedException, MemcachedClientException;
233
234 long decr(String key, long delta, long initValue, long timeout)
235 throws TimeoutException, InterruptedException,
236 MemcachedClientException;
237
238 void decrWithNoReply(String key, long delta) throws InterruptedException,
239 MemcachedClientException;
240
241 boolean delete(String key) throws TimeoutException, InterruptedException,
242 MemcachedClientException;
243
244 boolean delete(String key, long opTimeout) throws TimeoutException,
245 InterruptedException, MemcachedClientException;
246
247 boolean delete(String key, long cas, long opTimeout)
248 throws TimeoutException, InterruptedException,
249 MemcachedClientException;
250
251 void deleteWithNoReply(String key) throws InterruptedException,
252 MemcachedClientException;
253
254 <T> T get(String key) throws TimeoutException, InterruptedException,
255 MemcachedClientException;
256
257 <T> T get(String key, long timeout) throws TimeoutException,
258 InterruptedException, MemcachedClientException;
259
260 <T> Map<String, T> get(Collection<String> keyCollections)
261 throws TimeoutException, InterruptedException,
262 MemcachedClientException;
263
264 <T> Map<String, T> get(Collection<String> keyCollections, long timeout)
265 throws TimeoutException, InterruptedException,
266 MemcachedClientException;
267
268 <T> GetsResponse<T> gets(String key) throws TimeoutException,
269 InterruptedException, MemcachedClientException;
270
271 <T> GetsResponse<T> gets(String key, long timeout) throws TimeoutException,
272 InterruptedException, MemcachedClientException;
273
274 <T> Map<String, GetsResponse<T>> gets(Collection<String> keyCollections)
275 throws TimeoutException, InterruptedException,
276 MemcachedClientException;
277
278 <T> Map<String, GetsResponse<T>> gets(Collection<String> keyCollections,
279 long timeout) throws TimeoutException, InterruptedException,
280 MemcachedClientException;
281
282
283
284 boolean isEnabled();
285 }
创建接口实现类MemcachedClientWrapper
1 package cn.edu.jszg.cache;
2
3 import java.util.Collection;
4 import java.util.HashMap;
5 import java.util.Map;
6 import java.util.Set;
7 import java.util.concurrent.TimeoutException;
8
9 import net.rubyeye.xmemcached.exception.MemcachedException;
10
11 public class MemcachedClientWrapper implements MemcachedClient {
12 private net.rubyeye.xmemcached.MemcachedClient client;
13 private boolean enabled = false;
14
15 public MemcachedClientWrapper() {
16 super();
17 }
18
19 public void setMemcachedClient(net.rubyeye.xmemcached.MemcachedClient client) {
20 this.client = client;
21 }
22
23 public net.rubyeye.xmemcached.MemcachedClient getXMemcachedClient() {
24 return client;
25 }
26
27 @Override
28 public boolean set(String key, int exp, Object value) throws TimeoutException, InterruptedException,
29 MemcachedClientException {
30 try {
31 return client.set(key, exp, value);
32 } catch (MemcachedException e) {
33 throw new MemcachedClientException(e);
34 }
35 }
36
37 @Override
38 public boolean set(String key, int exp, Object value, long timeout) throws TimeoutException,
39 InterruptedException, MemcachedClientException {
40 try {
41 return client.set(key, exp, value, timeout);
42 } catch (MemcachedException e) {
43 throw new MemcachedClientException(e);
44 }
45 }
46
47 @Override
48 public void setWithNoReply(String key, int exp, Object value) throws InterruptedException,
49 MemcachedClientException {
50 try {
51 client.setWithNoReply(key, exp, value);
52 } catch (MemcachedException e) {
53 throw new MemcachedClientException(e);
54 }
55 }
56
57 @Override
58 public boolean add(String key, int exp, Object value) throws TimeoutException, InterruptedException,
59 MemcachedClientException {
60 try {
61 return client.add(key, exp, value);
62 } catch (MemcachedException e) {
63 throw new MemcachedClientException(e);
64 }
65 }
66
67 @Override
68 public boolean add(String key, int exp, Object value, long timeout) throws TimeoutException,
69 InterruptedException, MemcachedClientException {
70 try {
71 return client.add(key, exp, value, timeout);
72 } catch (MemcachedException e) {
73 throw new MemcachedClientException(e);
74 }
75 }
76
77 @Override
78 public void addWithNoReply(String key, int exp, Object value) throws InterruptedException,
79 MemcachedClientException {
80 try {
81 client.addWithNoReply(key, exp, value);
82 } catch (MemcachedException e) {
83 throw new MemcachedClientException(e);
84 }
85 }
86
87 @Override
88 public boolean replace(String key, int exp, Object value) throws TimeoutException, InterruptedException,
89 MemcachedClientException {
90 try {
91 return client.replace(key, exp, value);
92 } catch (MemcachedException e) {
93 throw new MemcachedClientException(e);
94 }
95 }
96
97 @Override
98 public boolean replace(String key, int exp, Object value, long timeout) throws TimeoutException,
99 InterruptedException, MemcachedClientException {
100 try {
101 return client.replace(key, exp, value, timeout);
102 } catch (MemcachedException e) {
103 throw new MemcachedClientException(e);
104 }
105 }
106
107 @Override
108 public void replaceWithNoReply(String key, int exp, Object value) throws InterruptedException,
109 MemcachedClientException {
110 try {
111 client.replaceWithNoReply(key, exp, value);
112 } catch (MemcachedException e) {
113 throw new MemcachedClientException(e);
114 }
115 }
116
117 @Override
118 public boolean append(String key, Object value) throws TimeoutException, InterruptedException,
119 MemcachedClientException {
120 try {
121 return client.append(key, value);
122 } catch (MemcachedException e) {
123 throw new MemcachedClientException(e);
124 }
125 }
126
127 @Override
128 public boolean append(String key, Object value, long timeout) throws TimeoutException, InterruptedException,
129 MemcachedClientException {
130 try {
131 return client.append(key, value, timeout);
132 } catch (MemcachedException e) {
133 throw new MemcachedClientException(e);
134 }
135 }
136
137 @Override
138 public void appendWithNoReply(String key, Object value) throws InterruptedException, MemcachedClientException {
139 try {
140 client.appendWithNoReply(key, value);
141 } catch (MemcachedException e) {
142 throw new MemcachedClientException(e);
143 }
144 }
145
146 @Override
147 public boolean prepend(String key, Object value) throws TimeoutException, InterruptedException,
148 MemcachedClientException {
149 try {
150 return client.prepend(key, value);
151 } catch (MemcachedException e) {
152 throw new MemcachedClientException(e);
153 }
154 }
155
156 @Override
157 public boolean prepend(String key, Object value, long timeout) throws TimeoutException, InterruptedException,
158 MemcachedClientException {
159 try {
160 return client.prepend(key, value, timeout);
161 } catch (MemcachedException e) {
162 throw new MemcachedClientException(e);
163 }
164 }
165
166 @Override
167 public void prependWithNoReply(String key, Object value) throws InterruptedException, MemcachedClientException {
168 try {
169 client.prependWithNoReply(key, value);
170 } catch (MemcachedException e) {
171 throw new MemcachedClientException(e);
172 }
173 }
174
175 @Override
176 public long incr(String key, long delta, long initValue) throws TimeoutException, InterruptedException,
177 MemcachedClientException {
178 try {
179 return client.incr(key, delta, initValue);
180 } catch (MemcachedException e) {
181 throw new MemcachedClientException(e);
182 }
183 }
184
185 @Override
186 public long incr(String key, long delta, long initValue, long timeout) throws TimeoutException,
187 InterruptedException, MemcachedClientException {
188 try {
189 return client.incr(key, delta, initValue, timeout);
190 } catch (MemcachedException e) {
191 throw new MemcachedClientException(e);
192 }
193 }
194
195 @Override
196 public void incrWithNoReply(String key, long delta) throws InterruptedException, MemcachedClientException {
197 try {
198 client.incrWithNoReply(key, delta);
199 } catch (MemcachedException e) {
200 throw new MemcachedClientException(e);
201 }
202 }
203
204 @Override
205 public long decr(String key, long delta, long initValue) throws TimeoutException, InterruptedException,
206 MemcachedClientException {
207 try {
208 return client.decr(key, delta, initValue);
209 } catch (MemcachedException e) {
210 throw new MemcachedClientException(e);
211 }
212 }
213
214 @Override
215 public long decr(String key, long delta, long initValue, long timeout) throws TimeoutException,
216 InterruptedException, MemcachedClientException {
217 try {
218 return client.decr(key, delta, initValue, timeout);
219 } catch (MemcachedException e) {
220 throw new MemcachedClientException(e);
221 }
222 }
223
224 @Override
225 public void decrWithNoReply(String key, long delta) throws InterruptedException, MemcachedClientException {
226 try {
227 client.decrWithNoReply(key, delta);
228 } catch (MemcachedException e) {
229 throw new MemcachedClientException(e);
230 }
231 }
232
233 @Override
234 public boolean delete(String key) throws TimeoutException, InterruptedException, MemcachedClientException {
235 try {
236 return client.delete(key);
237 } catch (MemcachedException e) {
238 throw new MemcachedClientException(e);
239 }
240 }
241
242 @Override
243 public boolean delete(String key, long opTimeout) throws TimeoutException, InterruptedException,
244 MemcachedClientException {
245 try {
246 return client.delete(key, opTimeout);
247 } catch (MemcachedException e) {
248 throw new MemcachedClientException(e);
249 }
250 }
251
252 @Override
253 public boolean delete(String key, long cas, long opTimeout) throws TimeoutException, InterruptedException,
254 MemcachedClientException {
255 try {
256 return client.delete(key, cas, opTimeout);
257 } catch (MemcachedException e) {
258 throw new MemcachedClientException(e);
259 }
260 }
261
262 @Override
263 public void deleteWithNoReply(String key) throws InterruptedException, MemcachedClientException {
264 try {
265 client.deleteWithNoReply(key);
266 } catch (MemcachedException e) {
267 throw new MemcachedClientException(e);
268 }
269 }
270
271 @SuppressWarnings("unchecked")
272 @Override
273 public <T> T get(String key) throws TimeoutException, InterruptedException, MemcachedClientException {
274 try {
275 return (T)client.get(key);
276 } catch (MemcachedException e) {
277 throw new MemcachedClientException(e);
278 }
279 }
280
281 @SuppressWarnings("unchecked")
282 @Override
283 public <T> T get(String key, long timeout) throws TimeoutException, InterruptedException,
284 MemcachedClientException {
285 try {
286 return (T)client.get(key, timeout);
287 } catch (MemcachedException e) {
288 throw new MemcachedClientException(e);
289 }
290 }
291
292 @Override
293 public <T> Map<String, T> get(Collection<String> keyCollections) throws TimeoutException,
294 InterruptedException, MemcachedClientException {
295 try {
296 return client.get(keyCollections);
297 } catch (MemcachedException e) {
298 throw new MemcachedClientException(e);
299 }
300 }
301
302 @Override
303 public <T> Map<String, T> get(Collection<String> keyCollections, long timeout) throws TimeoutException,
304 InterruptedException, MemcachedClientException {
305 try {
306 return client.get(keyCollections, timeout);
307 } catch (MemcachedException e) {
308 throw new MemcachedClientException(e);
309 }
310 }
311
312 @SuppressWarnings("unchecked")
313 @Override
314 public <T> GetsResponse<T> gets(String key) throws TimeoutException, InterruptedException,
315 MemcachedClientException {
316 try {
317 return new GetsResponse<T>((net.rubyeye.xmemcached.GetsResponse<T>) client.gets(key));
318 } catch (MemcachedException e) {
319 throw new MemcachedClientException(e);
320 }
321 }
322
323 @SuppressWarnings("unchecked")
324 @Override
325 public <T> GetsResponse<T> gets(String key, long timeout) throws TimeoutException, InterruptedException,
326 MemcachedClientException {
327 try {
328 return new GetsResponse<T>((net.rubyeye.xmemcached.GetsResponse<T>) client.gets(key, timeout));
329 } catch (MemcachedException e) {
330 throw new MemcachedClientException(e);
331 }
332 }
333
334 @Override
335 public <T> Map<String, GetsResponse<T>> gets(Collection<String> keyCollections) throws TimeoutException,
336 InterruptedException, MemcachedClientException {
337 try {
338 Map<String, GetsResponse<T>> results = new HashMap<String, GetsResponse<T>>();
339 Map<String, net.rubyeye.xmemcached.GetsResponse<T>> tmps = client.gets(keyCollections);
340 if (tmps != null) {
341 Set<String> keys = tmps.keySet();
342 for (String key : keys) {
343 results.put(key, new GetsResponse<T>((net.rubyeye.xmemcached.GetsResponse<T>) tmps.get(key)));
344 }
345 }
346 return results;
347 } catch (MemcachedException e) {
348 throw new MemcachedClientException(e);
349 }
350 }
351
352 @Override
353 public <T> Map<String, GetsResponse<T>> gets(Collection<String> keyCollections, long timeout)
354 throws TimeoutException, InterruptedException, MemcachedClientException {
355 try {
356 Map<String, GetsResponse<T>> results = new HashMap<String, GetsResponse<T>>();
357 Map<String, net.rubyeye.xmemcached.GetsResponse<T>> tmps = client.gets(keyCollections, timeout);
358 if (tmps != null) {
359 Set<String> keys = tmps.keySet();
360 for (String key : keys) {
361 results.put(key, new GetsResponse<T>((net.rubyeye.xmemcached.GetsResponse<T>) tmps.get(key)));
362 }
363 }
364 return results;
365 } catch (MemcachedException e) {
366 throw new MemcachedClientException(e);
367 }
368 }
369
370 @Override
371 public boolean isEnabled() {
372 return enabled;
373 }
374
375 public void setEnabled(boolean enabled) {
376 this.enabled = enabled;
377 }
378
379 }
经验总结:
缓存数据的一致性问题
缓存数据尽量只读,因此缓存本身是不适合大量写和更新操作的数据场景的。对于读的情况下,如果存在数据变化,一种是同时更新缓存和数据库。一种是直接对缓存数据进行失效处理。敲命令行的时候换行的时候要跟空格.
另附:memcached的常用命令
参考:http://www.cnblogs.com/jeffwongishandsome/archive/2011/11/06/2238265.html
|
|