1. 接上篇
1. redis其他的数据类型 list set sort set 相应的命令也要知道
2. redis的持久化! RDB 和 AOF
RDB:以快照方式进行持久化,恢复快。 数据完整性比较差。
AOF:以追加日志的方式把写命名放入到日志的尾部,数据库完整性高。恢复慢。
3. redis的集群
主从模式: 新增了新节点,新节点回把之前的数据也获取。 主节点挂掉,从节点等待
2. 正文
1. redis的集群的其他模式
哨兵模式:
去中心化集群
2.Java连接redis.
3.springboot整合redis
4.redis的应用场景: 缓存。
3. 哨兵模式:
修改sentinel.conf的配置
# 127.0.0.1表示哨兵观察的redis主节点的ip
# 6379 表示哨兵观察的主节点的端口号
# 1 表示有多少个哨兵选取redis从节点后,该从节点可以当选为主节点。
sentinel monitor mymaster 127.0.0.1 7001 1
(为甚么只观察主节点,因为主节点拥有子节点小弟的所有信息)
启动哨兵(哨兵默认端口号为26379)
redis-sentinel sentinel.conf
主节点挂掉后,默认时间15秒后重新选举新的主节点,之后原有主节点再重新启动,新选举的主节点不会变,原来的主节点变为新选举的主节点的小弟!
**注意:**配置多个哨兵监视同一个主节点注意其配置中的名字要一致sentinel monitor mymaster 127.0.0.1 7001 1
4. 去中心化集群。
4.1哨兵的缺点
1. 没有解决单节点的问题。意思是因为主从模式(升级加哨兵模式)只有主节点可以进行写操作,从节点只能读操作;这样如果写入量大(八万以上次/s),主节点是承受不了
2. 持久化文件始终在一个服务器上。(还是文件大,主节点保存麻烦)
4.2去中心化原理图
4.3修改redis.conf配置文件内容进而启动建立集群模式
port 8001 //修改你设置的端口号
bind 0.0.0.0//绑定IP
daemonize yes//后台运行
appendonly yes//一定要开启aof否则会运行错误
# 开启集群
cluster-enabled yes 833行
# 集群的配置文件名字保持一致,方便后期查找,该文件自动生成
cluster-config-file nodes-8001.conf 841行
# 集群的超时时间,某集群宕掉后会将其数据自动分摊给其它数据//默认15秒,修改可以视具体情况而定;
cluster-node-timeout 5000 847行
启动所有的redis,未集群不会产生[cluster]
4.4为主节点分配槽以及分配从节点
cluster-replica:每个主节点跟随的从节点的个数
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006
–cluster create:表示创建集群 --cluster-replicas 1:表示创建一个备份/从节点;从节点随机分配
127.0.0.1:8004 注意改成自己的 必须保证aof开启,保证redis中没有数据。
4.5客户端访问:
redis-cli -c -h 127.0.0.1 -p 8001
集群自带哨兵模式;无需再进行哨兵配置
4.6主从模式转集群模式会出现如下错误;更改你的redis.conf配置文件?
5.Java连接redis.—jedis
(1)依赖(maven工程)
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
(2)操作
package com.ykq.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import java.util.Set;
public class TestJedis {
public static void main(String[] args) {
Jedis jedis=new Jedis("192.168.213.xxx",6379);//必须运行远程连接 必须防火墙放行该端口号
//关于字符串
jedis.set("k1","v1");
jedis.set("k8","18");
jedis.mset("k2","v2","k3","v3","k4","v4");
jedis.setnx("k1","12");
jedis.decr("k8");
//操作key
Set<String> keys = jedis.keys("*");
System.out.println("所有的key:"+keys);
jedis.del("k1");
jedis.expire("k2",60);
jedis.ttl("k2");
jedis.close();//看你心情操作,如果是工作看扣不扣钱,你不心疼无所谓
}
}
使用jedis连接池====作用:用于频繁创建销毁对象
package com.ykq.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class TestPoolJedis {
public static void main(String[] args) {
//连接池的配置,本身就有默认配置,不妨碍我们继续配置
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(100);//设置连接池的最大连接数
config.setMaxIdle(10);//设置最大空闲的个数
config.setTestOnBorrow(true);//在从连接池这种获取连接对象前是否测试该对象可用。
//创建连接池对象
JedisPool jedisPool=new JedisPool(config,"192.168.213.xxx",6379);
//获取jedis对象
Jedis jedis = jedisPool.getResource();
System.out.println(jedis.get("k3"));
jedis.close();//释放资源
}
}
6. springboot整合redis
springboot为操作redis准备了两个工具类StringRedisTemplate和RedisTemplate。StringRedisTemplate是RedisTemplate的子类。StringRedisTemplate它的泛型key和value都是String类型。 RedisTemplate它的key value的泛型是Object。
步骤:
(1)引入依赖
<!--启动类-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(2) properties 配置
spring.redis.host=192.168.213.xxx
spring.redis.port=6379
spring.redis.jedis.pool.max-active=20 #最大活跃数
spring.redis.jedis.pool.max-idle=8 #最大空闲数
spring.redis.jedis.pool.min-idle=0 #最小空闲数
spring.redis.jedis.pool.max-wait=20000#等待时间
(3)测试
package com.ykq.springbootredis01;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class SpringbootRedis01ApplicationTests {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
void contextLoads() {
//操作key
Set<String> keys = redisTemplate.keys("*");
System.out.println(keys);
redisTemplate.delete("k8");
System.out.println(redisTemplate.getExpire("k3"));
redisTemplate.expire("k3", 60, TimeUnit.SECONDS);
System.out.println(redisTemplate.getExpire("k3"));
}
@Test
public void testString(){
ValueOperations<String, String> forValue = redisTemplate.opsForValue();//操作字符串类型
forValue.set("k1","v1");
System.out.println(forValue.get("k1"));
Map<String,String> map=new HashMap<>();
map.put("k9","v9");
map.put("k10","v10");
forValue.multiSet(map);
List<String> keys=new ArrayList<>();
keys.add("k1");
keys.add("k2");
keys.add("k4");
List<String> strings = forValue.multiGet(keys);
System.out.println(strings);
System.out.println(forValue.setIfAbsent("k2", "v2"));
}
}
7、对于阿里云服务器设置如何连接:
更改redis.conf配置中bind端口,然后使用阿里云公网IP连接即可