发表于: 2017-11-27 23:21:04

1 644


今日完成的事情:

今天将小课堂:

今天讲的小课堂内容是任务六,memcache的使用:

1)背景介绍

Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。

这些数据可以是数据库调用、API调用或者是页面渲染的结果。

Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。

本质上,它是一个简洁的key-value存储系统。

一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

2)知识剖析

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

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

memcached运行:启动选项:

d是启动一个守护进程

m是分配给Memcache使用的内存数量,单位是MB<

u是运行Memcache的用户

l是监听的服务器IP地址,可以有多个地址

p是设置Memcache监听的端口,,最好是1024以上的端口

c是最大运行的并发连接数,默认是1024

P是设置保存Memcache的pid文件

java客户端的实现:XMemcached

XMemcached是一个新java memcached client。

XMemcached是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和

资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而nio仅需要一

个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。

XMemcached的使用:

1)导入xmemcached依赖

2)创建MemcachedClientBuilder,然后builder一个MemcachedClient 

Memcached 存储命令:

Memcached set 命令:用于将 value(数据值) 存储在指定的 key(键) 中。

如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。

Memcached add 命令:Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中。

如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同。

Memcached replace 命令:用于替换已存在的 key(键) 的 value(数据值)。

如果 key 不存在,则替换失败

Memcached append 命令:用于向已存在 key(键) 的 value(数据值) 后面追加数据 。

Memcached prepend 命令:用于向已存在 key(键) 的 value(数据值) 前面追加数据 。

Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作

它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。

检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。

Memcached 查找命令:

Memcached get 命令:获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。

Memcached gets 命令:获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。

Memcached delete 命令:用于删除已存在的 key(键)。

Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作。

incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。

Memcached 统计命令:

Memcached stats 命令:用于返回统计信息例如 PID(进程号)、版本号、连接数等。

Memcached stats items 命令:用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。

Memcached stats slabs 命令:用于显示各个slab的信息,包括chunk的大小、数目、使用情况等。

Memcached stats sizes 命令用于显示所有item的大小和个数。

该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。

Memcached flushAll 命令:用于用于清理缓存中的所有 key=>value(键=>值) 对。

3)常见问题

Memcached本身并没有提供迭代所有key的方法,如何查看memcache中所有的key?

4)解决方案

想迭代所有的key,你只需要获取一个KeyIterator,然后遍历KeyIterator即可。

KeyIterator it=memcachedClient.getKeyIterator(AddrUtil.getOneAddress("mumengyang.top:11211"));
while(it.hasNext())
{
String key=it.next();
   System.out.println(key);
}

5)编码实战

6)扩展思考

为什么使用cas协议?

当我们的应用是分布式的,无状态的应用服务器通过负载均衡,部署到了多台。

如果不采用CAS,则有如下的情景: 

第一步,A取出数据对象X; 

第二步,B取出数据对象X; 

第三步,B修改数据对象X,并将其放入缓存; 

第四步,A修改数据对象X,并将其放入缓存。 

最后第四步和第三步操作就冲突了。

所以需要cas操作命令:

cas操作必须先要通过,gets名利获得cas令牌,然后把令牌带入cas命令才可以修改数据:

GetsResponse<Object> value=memcachedClient.gets("key");
System.err.println(value);
memcachedClient.cas("key",0,"ssssss",9);
String m=memcachedClient.get("key");
System.out.println(m);

明日计划的时期:

继续任务七,任务七的在jsp页面直接上传图片还不会,要学习一波。

遇到的问题:

收获:

通过今天的小课堂,对memecach的cas操作命令,还有遍历所有key值得知识掌握了。

任务开始时间:2017/11/23

预计完成时间:2017/12/1

延期:无

禅道:http://task.ptteng.com/zentao/my-task.html



返回列表 返回列表
评论

    分享到