发表于: 2017-04-28 22:03:09
1 1352
一、今天完成的事情:
学到这感觉今天学不动了,脑子涨的厉害,就今早总结一下吧。
1、 什么是redis?
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
2、redis的安装
直接官网到最新的redis包,(注意在linux下安装服务包需要提前安装了gcc编译器),也可以一键安装:
sudo apt-get install redis-server
等待安装完成就行了
使用自动安装后redis是自动启动的这时候我们可以查看redis服务进程
ps -aux|grep redis
得到
root@iZwz9dtqxw8jzcn3fo6iayZ:~# ps -aux|grep redis
redis 28216 0.0 0.3 40136 6744 ? Ssl Apr27 1:18 /usr/bin/redis-server *:6379
root 29419 0.0 0.0 14224 912 pts/0 S+ 21:33 0:00 grep --color=auto redis
root@iZwz9dtqxw8jzcn3fo6iayZ:~#
通过命令我们可以查看redis进程
netstat -nlt|grep 6379
root@iZwz9dtqxw8jzcn3fo6iayZ:~# netstat -nlt|grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp6 0 0 :::6379 :::* LISTEN
root@iZwz9dtqxw8jzcn3fo6iayZ:~#
然后接下来是一些简单的redis设置
vi /etc/redis/redis.conf
设置为任何ip都可以访问:
去掉bind 127.0.0.1注释掉(加#)
设置密码:
打开#repassword(即去掉#)
重启redis
sudo /etc/init.d/redis-server restart
使用redis-cli登陆(如果设置密码需要加-a),没输入密码是不能进行操作的
然后我们查看redis的进程就可以知道redis设置为全局访问了
netstat -nlt|grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
(ip一致只是因为我已经改过了。所以都是0.0.0.0)
redis的安装就讲到这里了,应该已经够详细了。主要是自己懒写了,以后有时间在补上来吧︿( ̄︶ ̄)︿
3、redis在java中简单的操作:
需要用到的包:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
<!--Redis end -->
一看包我们就知道jedis是用来干什么的肯定是操作redis的一些常用命令,然后记住我们为什么要使用序列化:因为template只提供String的操作(这个我还没写完几个功能)
然后我们和redis进行一波简单的互相操作。代码如下:
package cn.li.redis.main;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by lizenan on 2017/4/28.
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//连接redis服务
Jedis jedis = new Jedis("ip",开放端口);
//密码验证-如果你没有设置redis密码可不验证即可使用相关命令
jedis.auth("*****");
//简单的key-value 存储
jedis.set("redis", "lizenan");
System.out.println(jedis.get("redis"));
//在原有值得基础上添加,如若之前没有该key,则导入该key
//之前已经设定了redis对应"myredis",此句执行便会使redis对应"myredisyourredis"
jedis.append("redis", "zeishuai");
jedis.append("content", "rabbit");
//mset 是设置多个key-value值 参数(key1,value1,key2,value2,...,keyn,valuen)
//mget 是获取多个key所对应的value值 参数(key1,key2,key3,...,keyn) 返回的是个list
jedis.mset("name1","wuzhiyong","name2","shixing","name3","lmy");
System.out.println(jedis.mget("name1","name2","name3"));
//map
Map<String,String> user = new HashMap<String,String>();
user.put("name", "施星");
user.put("password", "123456");
//map存入redis
jedis.hmset("user", user);
//mapkey个数
System.out.println(String.format("len:%d", jedis.hlen("user")));
//map中的所有键值
System.out.println(String.format("keys: %s", jedis.hkeys("user") ));
//map中的所有value
System.out.println(String.format("values: %s", jedis.hvals("user") ));
//取出map中的name字段值
List<String> rsmap = jedis.hmget("user", "name","password");
System.out.println(rsmap);
//删除map中的某一个键值 password
jedis.hdel("user", "password");
System.out.println(jedis.hmget("user", "name", "password"));
//list
jedis.del("listDemo");
System.out.println(jedis.lrange("listDemo", 0, -1));
jedis.lpush("listDemo", "A");
jedis.lpush("listDemo", "B");
jedis.lpush("listDemo", "C");
System.out.println(jedis.lrange("listDemo", 0, -1));
System.out.println(jedis.lrange("listDemo", 0, 1));
//set
jedis.sadd("sname", "123");
jedis.sadd("sname", "kings");
jedis.sadd("sname", "demon");
System.out.println(String.format("set num: %d", jedis.scard("sname")));
System.out.println(String.format("all members: %s", jedis.smembers("sname")));
System.out.println(String.format("is member: %B", jedis.sismember("sname", "wobby")));
System.out.println(String.format("rand member: %s", jedis.srandmember("sname")));
//删除一个对象
jedis.srem("sname", "demon");
System.out.println(String.format("all members: %s", jedis.smembers("sname")));
}
}
结果如下:
后面改为李泽南贼帅,实现了自动序列化存储,就是\xe6...

spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷。sdr提供了4种内置的serializer:
- JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储
- StringRedisSerializer:字符串编码,数据以string存储
- JacksonJsonRedisSerializer:json格式存储
- OxmSerializer:xml格式存储
其中JdkSerializationRedisSerializer和StringRedisSerializer是最基础的序列化策略,其中“JacksonJsonRedisSerializer”与“OxmSerializer”都是基于stirng存储,因此它们是较为“高级”的序列化(最终还是使用string解析以及构建Java对象)。
RedisTemplate中需要声明4种serializer,默认为“JdkSerializationRedisSerializer”:
1) keySerializer :对于普通K-V操作时,key采取的序列化策略
2) valueSerializer:value采取的序列化策略
3) hashKeySerializer: 在hash数据结构中,hash-key的序列化策略
4) hashValueSerializer:hash-value的序列化策略
无论如何,建议key/hashKey采用StringRedisSerializer。
二、遇到问题:
还是在整合redis+spring是有问题,具体问题现在还不知道
三、明天计划的事情;
继续整合一下redis,然后开始task7
四、收获:
今天对redis和memcache有了好多的认识,认识了缓存中存储数据可以加快其多线程的时候TPS提高
评论