发表于: 2017-11-21 21:04:26

1 632


今日完成的事情:


;学习memcache基本知识

 

1;昨天安装好了,简单测试没有问题,今天详细说一下常用的功能步骤

 

下载解压之后,通命令memcached.exe -d install安装,这里就是注意一下版本问题,也就低版本的可以用该命令作为一个服务安装;

 

然后是启动;关闭服务;

memcached.exe -d start     memcached.exe -d stop

 

这个时候再说一下Telnet,大概就是一直远程登陆服务的标准协议和主要方式。功能就是可以在完成远程主机工作;首先是在终端使用者的电脑上使用telnet程序,用它连接到服务器;然后终端可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。

 

而为什么要用telnet来链接……我也没搞懂……师兄也说memcache是非关系型数据库那也算是数据库吧,mysql是关系型数据库,就可直接再命令行里通过账户密码链接,总之先这样用吧;步骤就是;

 

先打开win的面板,勾选自己的telnet;然后进入命令行;利用telnet命令链接memcache……telnet 127.0.0.1 11211也就是本机ip以及memcache的端口号

 

这个时候是比较坑的…….进入直接是黑屏输入什么也不显示……

 

两种方案;先输入CTRL+]………实际上这个时候进入的是telnet客户端的命令行……输入memcache的命令无效……只能输入telnet的命令……

 

 

试了大半天……原来根本就不用输入ctrl+]……输入ip和端口号进入的就是memcache….直接输入命令第一次的命令显示不出来最好是直接输入enter….然后输入正常命令….

 

 

还有一点值得说的就是,memecache的删除命令是空格….移动光标是删除键

 

;这个时候就可以愉快的学习memcacha的常用命令了

 

1;首先是与储存相关的命令以及参数Set add delete replace get方法;

 

语法; command <key> <flags> <expiration time> <bytes>    <value>

 

参数没什么好说的,就一个flags不太好理解,简单来说就是客户端用来标识数据格式的数值,如json,xml,压缩等;百度一查,涉及到php什么压缩,还有反序列化的样子,这个先mark,等学到这一块再看,先默认为0使用吧;

 

A;Memcached set 命令用于将 value(数据值) 存储在指定的 key() 中。如果setkey已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。

 

 

B; Memcached add 命令用于将 value(数据值) 存储在指定的 key() 中。如果 add key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED

 

 

C: Memcached replace 命令用于替换已存在的 key() value(数据值)。如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED

 

 

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

 

 

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

 

 

F;最后一个CAS感觉用处不大,好像是多人操作才会用,也简单操作一下……意义;Memcached CASCheck-And-Set)命令用于执行一个"检查并设置"的操作它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下,才能够将值写入。而检查是通过cas_token参数进行的,这个参数是Memcach指定给已经存在的元素的一个唯一的64位值,可以通过gets方法获取………….

 

 

2;Memcached 查找的相关命令

 

A;第一个get上面用了多次了;再说一点就是多个key可以通过空格来一次性获取

 

 

B;gets命令,也可以多次获取,只是会返回信息更多一些,,也就是多了一个令牌token

 

 

C; Memcached delete 命令用于删除已存在的 key();一次只能删除一个..

 

 

D; Memcached incr decr 命令用于对已存在的 key() 的数字值进行自增或自减操作。incr decr 命令操作的数据必须是十进制的32位无符号整数。还有就是不会有负数……最少是0….

 

而且不是数字的自动提醒报错

 

 

3;是统计的相关命令

A;第一个是stats用于返回统计信息例如 PID(进程号)、版本号、连接数等。具体含义就不多了,大都能看懂

 

还有三个暂时不看了……都是缓存相关的

 

最后再说一个; Memcached flush_all 命令用于用于清理缓存中的所有 key=>value(=>) 对。该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作;这个比较好理解,类似于mysql的缓存机制,里面也有一个flush功能;就是清理缓存

 

 

,学完基础命令,大概了解了memcache这个玩意,缓存区下面操作一下实例,通过Java 连接 Memcached 服务

1;通过java来链接,下载jar;写代码调用

 

try {
   
//本地连接 Memcached 服务
   
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1",11211));
   
System.out.println("连接成功了");
   
//关闭连接
   
mcc.shutdown();
} catch (IOException e) {
   
//e.printStackTrace();catch还可以这样用...
   
System.out.println(e.getMessage());

 

验证,结论

 

 

2; set 操作实例;

用到了java.util.concurrent.Future 这个类来存储数据,暂时也不了解,直接用了….

try {
   
// 本地连接 Memcached 服务
   
MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1",11211));
   
System.out.println("连接成功了");
   
// 存储数据
   
Future info = mcc.set("name" ,1000,"haha");
   
// 查看存储状态
   
System.out.println("set status:" + info.get());
   
// 输出值
   
System.out.println("name value of cache : " + mcc.get("name"));
   
// 关闭连接
   
mcc.shutdown();
} catch (Exception e) {
   
//e.printStackTrace();catch还可以这样用...
   
System.out.println(e.getMessage());
}

 

测试结果

 

 

3; add 操作实例

 

Future info = mcc.set("name", 1000, "haha");
// 查看存储状态
System.out.println("set status:" + info.get());
// 输出值
System.out.println("name value of cache : " + mcc.get("name"));
// 添加
Future info2 = mcc.add("name", 1000, "heihei");
// 打印状态
System.out.println("add status: " + info2.get());
// 输出
System.out.println("name value of cache : " + mcc.get("name"));
// 添加新key
Future info3 = mcc.add("sex", 1000, "boy");
// 打印状态
System.out.println("add status: " + info3.get());
// 输出
System.out.println("sex value of cache : " + mcc.get("sex"));

 

测试结果与命令行一致,key可以直接加;为失效的key添加失败

 

 

4; replace 操作实例

// 存储数据
Future info = mcc.set("name", 180, "haha");
// 查看存储状态
System.out.println("set status:" + info.get());
// 输出值
System.out.println("name value of cache : " + mcc.get("name"));
// 替换
info = mcc.replace("name", 200, "heihei");
// 打印状态
System.out.println("replace status: " + info.get());
// 输出
System.out.println("name value of cache : " + mcc.get("name"));
// 关闭连接

 

测试结果一致,key就可以替换成功,没有的话失败

 

 

5; prepend的实例 && append的实例

info = mcc.append("name","heihei");

 

info = mcc.prepend("name","heihei");

测试结果一致,有一点要说明,就是Java程序里不可以添加时间……只能是键值对

 

 

6,也操作一下cas的实例吧

// 通过 gets 方法获取 CAS token(令牌)
CASValue casValue = mcc.gets("name");
// 输出 CAS token(令牌) 值
//System.out.println("token:" + casValue.getCas()+casValue.getValue());
System.out.println("token:" + casValue);
// 尝试使用cas方法来更新数据
CASResponse casResponse = mcc.cas("name" ,casValue.getCas(),"heihei");
// 输出 CAS 响应信息
System.out.println("Response:"+casResponse);

测试结果

 

 

7;删除也没什么好说的了

info = mcc.delete("name");

 

8;还有最后一个增减的实例Incr/Decr也简单说一下

// 自增并输出
System.out.println("value in cache after increment - " + mcc.incr("number", 1));
// 自减并输出
System.out.println("value in cache after decrement - " + mcc.decr("number", 2));

测试结果

 

;学习Redis

1;学完memcache再学一下redis;简单说一下概念

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。也可以看作像是一个HashMap,不过不是在JVM中运行,而是以一个独立进程的形式运行。

首先找资源,因为是开源项目,直接区下载win的版本会跳到GitHub…然后要想用,还需要用Visual Studio什么鬼的编译成exe…这里就暂时跳过去了,直接下载别人编译好的….服务端….客服端…..

 

2;然后是启动

redis-server.exe服务端


redis-cli.exe客户端

 

3;简单set以及get一下感觉比memcache好用多了……毕竟win的命令行..

 

 

4;上面的memcache已经很详细了……这里也就简单操作一下….

 Redis目前有5种数据类型,分别是:String(字符串);List(列表);Hash(字典); Set(集合);Sorted Set(有序集合)不同的数据类型,有不同的命令方式;

String

 

List 列表

 

 

Hash 字典,哈希表

 

 

Set 集合

 

 

Sorted Set 有序集合

 

 

4;最后一步,memcacheJava实例,同样redis也少不了;虽然可以使用各种带客户端的命令行方式访问Redis服务。但是在实际工作中用的都是Java代码,仍然需要第三方jar;Jedis

A;先简单试试set以及get

//建立连接
Jedis jedis = new Jedis("localhost");
//set
jedis.set("name", "haha");
//get
String value = jedis.get("name");
//输出
System.out.println("name of value:" + value);

 

 

B;;接下来的命令就不单独说了,直接写到一块了…..利用junit来写很方便

CRUD

Jedis jedis;
JedisPool pool;
@Before
public void setUp()
{
   
jedis = new Jedis("localhost");
}
@Test
public void testString()
{
   
//-----添加数据----------
   
jedis.set("name", "haha");
   
System.out.println("name of value:" + jedis.get("name"));
   
//-----修改数据-----------
    //1
、在原来基础上修改
   
jedis.append("name", "heihei");
   
System.out.println("name of value:" + jedis.get("name"));
   
// 2、直接覆盖原来的数据
   
jedis.set("name", "heihei");
   
System.out.println("name of value:" + jedis.get("name"));
   
// 删除key对应的记录
   
jedis.del("name");
   
System.out.println(jedis.get("name"));
   
//mset相当于多次set...
   
jedis.mset("name", "haha", "sex", "boy");
   
System.out.println(jedis.mget("name", "sex"));
}

 


 

Map

Map<String, String> user = new HashMap<>();
user.put("name", "atom");
user.put("sex", "boy");
user.put("age", "20");
jedis.hmset("user", user);
//取出user中的name,执行结果:[atom]-->注意结果是一个泛型的List
//
第一个参数是存入redismap对象的key,后面跟的是放入map中的对象的key,
//
后面的key可以跟多个,是可变参数
List<String> rsmap = jedis.hmget("user", "name","sex");
System.out.println(rsmap);
//删除map中的某个键值
jedis.hdel("user", "age");
//因为删除了,所以返回的是null
System.out.println(jedis.hmget("user", "age"));
//返回keyuser的键中存放的值的个数
System.out.println(jedis.hlen("user"));
//是否存在keyuser的记录返回true
System.out.println(jedis.exists("user"));
//返回map对象中的所有key
System.out.println(jedis.hkeys("user"));
//返回map对象中的所有value
System.out.println(jedis.hvals("user"));
//遍历迭代
/*Iterator<String> iterator = jedis.hkeys("user").iterator();
while (iterator.hasNext()){
    String key = iterator.next();*/
for (String key : jedis.hkeys("user")) {
   
System.out.println(key + ":" + jedis.hmget("user",key));



List

//开始前,先移除所有的内容
jedis.del("java framework");
//jedis.llen获取长度
System.out.println(jedis.llen("java framework"));
//先向key "java framework"中存放四条数据
jedis.lpush("java framework", "spring");
jedis.lpush("java framework", "struts");
jedis.lpush("java framework", "hibernate");
jedis.lpush("java framework", "mybatis");
System.out.println(jedis.llen("java framework"));
//再取出所有数据jedis.lrange是按范围取出,
//第一个是key,第二个是起始位置,第三个是结束位置,-1表示取得所有
System.out.println(jedis.lrange("java framework", 0, -1));


 

Set

 

//添加
jedis.sadd("love","star");
jedis.sadd("love","moon");
jedis.sadd("love","sun");
jedis.sadd("love","sky");
//移除
jedis.srem("love","sky");
//获取所有加入的value
System.out.println(jedis.smembers("love"));
//判断 sun 是否是love集合的元素
System.out.println(jedis.sismember("love", "sun"));
//从集合里面随机获取一个元素
System.out.println(jedis.srandmember("love"));
//返回集合的元素个数
System.out.println(jedis.scard("love"));

 

C;这里基本操作也就完了,再操作几个很好用的方法比如key的通配符

//keys中传入的可以用通配符
System.out.println(jedis.keys("*"));
System.out.println(jedis.keys("*s"));
//删除keyxx的对象  删除成功返回1 删除失败(或者不存在)返回 0 
System.out.println(jedis.del("xx"));
//返回给定key的有效时间,如果是-2则表示永远有效
System.out.println(jedis.ttl("moon"));
//通过此方法,可以指定key的存活(有效时间)时间为秒 
jedis.setex("live", 10, "milk");
//睡眠5秒后,剩余时间将为<=5 
Thread.sleep(5000);
//输出结果为5
System.out.println("休眠5s还剩下5s: "+jedis.ttl("live")+"s");
//设为1后,下面再看剩余时间就是1 
jedis.setex("live", 1, "milk");
//输出结果为1 
System.out.println(jedis.ttl("live"));
//检查key是否存在
System.out.println(jedis.exists("key")); 
System.out.println(jedis.rename("live","haha"));
//因为移除,返回为null
System.out.println(jedis.get("live"));
//因为将live 重命名为time 所以可以取得值 min
System.out.println(jedis.get("haha"));

 

 

模糊查询,很厉害把之前命令行的都查出来了

 

 

 

;简单了解一下关系型数据库以及非关系型数据库


首先要知道几个概念然后上表…..

1:数据库事务必须具备的四个特性,也叫ACID: Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性。

2:数据的持久存储,尤其是海量数据的持久存储,还是需要一种关系数据库。

 

关系型

 

 

非关系型

 

 

3;结论,非关系型数据库是一种数据结构化存储方法的集合,严格来说不是一种数据库;但是解决的问题就是传统数据库存在可扩展性上的缺陷,可以适应数据量的增加以及数据结构的变化;但是数据的持久存储,尤其是海量数据的持久存储,还是需要一种关系数据库。

 

 

明日计划的事情:


1;学习Jason


2;完成压测


3;复习学习nginx,刚好听听师兄小课堂


 

遇到的问题及解决方法:

 

1;memcache命令行好难用 同样的东西….什么空格删除都不能要,只能一次打出来正确的……

 

 

 

2;下载memcachejar第一次下错了挣扎了大半天……发现

 

 

下成源码包了…..

 

 


jar 就是一堆.class文件, 源代码编译出来的包, 可以直接运行的


javadoc就是这个源文件中的doc 文档注释, 包括字段, 方法等注释


sources 就是源代码包

 

3;关键字… Java….连包名直接被禁止….

 

 

4;这个添加需要注意与命令行的添加有点区别,不能添加时间


 

 

收获:


1;学习了基础的memcache以及redis命令行操作


2;学习了上述两者的javad代码操作


3;简单了解了数据库的区分

 



返回列表 返回列表
评论

    分享到