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. 哨兵模式:

java 使用redis高并发案例 redis队列实现高并发java_数据库

java 使用redis高并发案例 redis队列实现高并发java_数据库_02

修改sentinel.conf的配置

# 127.0.0.1表示哨兵观察的redis主节点的ip 
# 6379 表示哨兵观察的主节点的端口号
# 1 表示有多少个哨兵选取redis从节点后,该从节点可以当选为主节点。
sentinel monitor mymaster 127.0.0.1 7001 1
(为甚么只观察主节点,因为主节点拥有子节点小弟的所有信息)

java 使用redis高并发案例 redis队列实现高并发java_redis_03

启动哨兵(哨兵默认端口号为26379)

redis-sentinel  sentinel.conf

java 使用redis高并发案例 redis队列实现高并发java_缓存_04

主节点挂掉后,默认时间15秒后重新选举新的主节点,之后原有主节点再重新启动,新选举的主节点不会变,原来的主节点变为新选举的主节点的小弟!

**注意:**配置多个哨兵监视同一个主节点注意其配置中的名字要一致sentinel monitor mymaster 127.0.0.1 7001 1

4. 去中心化集群。

4.1哨兵的缺点

1. 没有解决单节点的问题。意思是因为主从模式(升级加哨兵模式)只有主节点可以进行写操作,从节点只能读操作;这样如果写入量大(八万以上次/s),主节点是承受不了
2. 持久化文件始终在一个服务器上。(还是文件大,主节点保存麻烦)

4.2去中心化原理图

java 使用redis高并发案例 redis队列实现高并发java_redis_05

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]

java 使用redis高并发案例 redis队列实现高并发java_redis_06

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中没有数据。

java 使用redis高并发案例 redis队列实现高并发java_缓存_07

4.5客户端访问:

redis-cli -c -h 127.0.0.1 -p 8001

java 使用redis高并发案例 redis队列实现高并发java_缓存_08

集群自带哨兵模式;无需再进行哨兵配置

java 使用redis高并发案例 redis队列实现高并发java_java 使用redis高并发案例_09

4.6主从模式转集群模式会出现如下错误;更改你的redis.conf配置文件?

java 使用redis高并发案例 redis队列实现高并发java_缓存_10

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连接即可