一、redis的数据类型
1.字符串类型Map<String,String>
字符串类型是编程语言和应用程序中最常见和最有用的数据类型,也是Redis的基本数据类型之一,事实上,Redis中所有键都必须是字符串。
2、list数据类型Map<String,List<Object>>
列表是应用我只是应该程序开发中非常有用的数据类型之一,列表能存在一组对象,因此它也可以被用于栈或者队列,在Redis中,与键相关的联的值可以是字符串组成的列表,Redis中的列表更像是数据结构中的双向链表。
3、hash数据类型Map<String,Map<Object,Object>>
哈希表示字段和值之间的映射关系,与JAVA中的Map类似,Redis数据集本身就可以看做一个哈希,其中字符串类型的键关联到如字符串和列表之类的数据对象,而Reidis的数据对象也可以再次使用哈希,其字段和值必须 是字符串。
4,set数据类型Map<String,Set<Object,Object>>
集合类型是由唯一,无序对象组成的集合(collection).它经常用于测试某个成员是集合中,重复项删除和集合运算(求并,交,差集),Redis的值对象可以是字符串集合。
6,zset(sortset)数据类型
有序集合是一个类似于set但是更复杂的数据类型,单词sorted意为着这种集合中的每个元素都有一个可用于排序的权重,并且我们可以按顺序从集合中得到元素在某些需要一个保持数据有序的场景中,使用这种原生的序的特性是很方便的。
二、Redis的常用命令
keys * 获取所有的key
select0选择第一个库
movemyString1将当前的数据库key移动到某个数据库,目标库有,则不能移动
flushdb清除指定库
randomkey 从当前数据库中随机返回
typekey类型
delkey1删除key
existskey判断是否存在key
expirekey10 过期
pexpirekey1000毫秒
persistkey删除过期时间
ttlkey查看还有多少秒过期,-1表示永不过期,-2表示已过期
三、Redis的复制(Master/Slave)
1,什么是复制
Redis 的读并发量太大怎么办?
单机版的Redis 挂掉怎么办?
需要写并发又要安全 在redis 3.0 后,官方发布了集群方案
1.1,官网说明
1.2,行话
行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,
自动同步到备机的master/slave机制,Master以写为主,Slave以读为从
2,有什么作用
读写分离
容灾恢复
3,怎么使用
3.1,配从不配主
3.2,配置命令 【SLAVEOF 主库IP 主库端口】
每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
Info replication可以查看
**3.3,详细操作 **
①拷贝多个redis.conf文件
②开启daemonize yes
③Pid文件名字
④指定端口
⑤Log文件名字
⑥Dump.rdb名字
3.4,薪火相传
上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力
中途变更转向:会清除之前的数据,重新建立拷贝最新的
Slaveof 新主库IP 新主库端口
3.6,反客为主
SLAVEOF no one
使当前数据库停止与其他数据库的同步,转成主数据库
4,复制的原理
Slave启动成功连接到master后会发送一个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
5,哨兵模式
5.1,什么是哨兵模式
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
5.2,一组sentinel能同时监控多个Master
6,复制的缺点
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
四、高可用高并发集群配置
高可用 24小时对外提供服务
高并发 同一时间段能处理的请求数
1,中心化和去中心化
1.1,中心化
意思是所有的节点都要有一个主节点
缺点:中心挂了,服务就挂了
中心处理数据的能力有限,不能把节点性能发挥到最大
特点:就是一个路由作用
1.2,去中心化
特点:去掉路由,我自己来路由
五、java连接redis
1,Jedis所需要的jar包依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
2,Jedis常用操作
publicclassTestRedisPing{
publicstaticvoidmain(String[]args) {
//创建连接
Jedisjedis=newJedis("192.168.120.129",6379);
//设置密码 如果没有密码可以不设置
jedis.auth("123456");
//调用 ping方法
Stringping=jedis.ping();
//输出PONG
System.out.println(ping);
jedis.close();
}
}
2.1,常规操作
publicclassTestReidsCommon{
publicstaticvoidmain(String[]args) {
// 创建连接
Jedisjedis=newJedis("192.168.120.129",6379);
// 设置密码 如果没有密码可以不设置
jedis.auth("123456");
// key
Set<String>keys=jedis.keys("*");
for(Iterator<String>iterator=keys.iterator();iterator.hasNext();) {
Stringkey=(String)iterator.next();
System.out.println(key);
}
System.out.println("jedis.exists====>"+jedis.exists("k2"));
System.out.println(jedis.ttl("k1"));
// String
// jedis.append("k1","myreids");
System.out.println(jedis.get("k1"));
jedis.set("k4","k4_redis");
System.out.println("----------------------------------------");
jedis.mset("str1","v1","str2","v2","str3","v3");
System.out.println(jedis.mget("str1","str2","str3"));
// list
System.out.println("----------------------------------------");
// jedis.lpush("mylist","v1","v2","v3","v4","v5");
List<String>list=jedis.lrange("mylist",0,-1);
for(Stringelement:list) {
System.out.println(element);
}
// set
jedis.sadd("orders","jd001");
jedis.sadd("orders","jd002");
jedis.sadd("orders","jd003");
Set<String>set1=jedis.smembers("orders");
for(Iterator<String>iterator=set1.iterator();iterator.hasNext();) {
Stringstring=(String)iterator.next();
System.out.println(string);
}
jedis.srem("orders","jd002");
System.out.println(jedis.smembers("orders").size());
// hash
jedis.hset("hash1","userName","lisi");
System.out.println(jedis.hget("hash1","userName"));
Map<String,String>map=newHashMap<String,String>();
map.put("telphone","15902738715");
map.put("address","whsxt");
map.put("email","leijharvin@163.com");
jedis.hmset("hash2",map);
List<String>result=jedis.hmget("hash2","telphone","email");
for(Stringelement:result) {
System.out.println(element);
}
// zset
jedis.zadd("zset01",60d,"v1");
jedis.zadd("zset01",70d,"v2");
jedis.zadd("zset01",80d,"v3");
jedis.zadd("zset01",90d,"v4");
Set<String>s1=jedis.zrange("zset01",0,-1);
for(Iterator<String>iterator=s1.iterator();iterator.hasNext();) {
Stringstring=(String)iterator.next();
System.out.println(string);
}
jedis.close();
}
}