发表于: 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(键) 中。如果set的key已经存在,该命令可以更新该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 CAS(Check-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;最后一步,memcache有Java实例,同样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
//第一个参数是存入redis中map对象的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"));
//返回key为user的键中存放的值的个数
System.out.println(jedis.hlen("user"));
//是否存在key为user的记录返回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"));
//删除key为xx的对象 删除成功返回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;下载memcache的jar包…第一次下错了…挣扎了大半天……发现…
…下成源码包了…..
jar 就是一堆.class文件, 源代码编译出来的包, 可以直接运行的
javadoc就是这个源文件中的doc 文档注释, 包括字段, 方法等注释
sources 就是源代码包
3;关键字… Java….连包名直接被禁止….
4;这个添加需要注意…与命令行的添加有点区别,不能添加时间
收获:
1;学习了基础的memcache以及redis命令行操作
2;学习了上述两者的javad代码操作
3;简单了解了数据库的区分
评论