redis 集群知识

Redis 一致性哈希算法(面试点)

Redis 分布式

jedis 分片

启动多个redis

docker run -d --name redis7000 -p 7000:6379 redis
docker run -d --name redis7001 -p 7001:6379 redis
docker run -d --name redis7002 -p 7002:6379 redis

客户端分片访问

package test;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

import java.util.ArrayList;
import java.util.List;

public class Test1 {
    public static void main(String[] args) {
        // 服务器地址列表
        List<JedisShardInfo> list = new ArrayList<JedisShardInfo>();
        list.add(new JedisShardInfo("192.168.64.181",7000));
        list.add(new JedisShardInfo("192.168.64.181",7001));
        list.add(new JedisShardInfo("192.168.64.181",7002));
        // 连接池配置对象
        GenericObjectPoolConfig config = new JedisPoolConfig();
        // 分片连接池
        ShardedJedisPool pool = new ShardedJedisPool(config, list);
        // 从连接池获取数据操作的工具对象
        ShardedJedis jedis = pool.getResource();
        for (int i = 0;i<100;i++){
            jedis.set("k"+i,"v"+i);
        }
        pool.close();

    }
}

Redis主从哨兵

启动主从服务

启动主服务器

docker run -d --name redis6379 --net host redis

启动从服务器
docker run -d \
--name redis6380 \
--net host redis \
redis-server --port 6380 \
--slaveof 192.168.64.181 6379

docker run -d \
--name redis6381 \
--net host redis \
redis-server --port 6381 \
--slaveof 192.168.64.181 6379

哨兵配置

mkdir /opt/sentinel/
cd /opt/sentinel/

# 配置文件中的 "sentinel monitor mymaster 192.168.64.150 6379 2"
# 末尾的 2 表示两个哨兵投票确认主服务器宕机,哨兵才会认为主服务器宕机
cat <<EOF >5000.conf
port 5000
sentinel monitor mymaster 192.168.64.181 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

cat <<EOF >5001.conf
port 5001
sentinel monitor mymaster 192.168.64.181 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

cat <<EOF >5002.conf
port 5002
sentinel monitor mymaster 192.168.64.181 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF

启动哨兵

docker run -d --name sentinel5000 \
--net host -v /opt/sentinel/5000.conf:/sentinel.conf \
redis redis-sentinel /sentinel.conf

docker run -d --name sentinel5000 --net host \
-v /opt/sentinel/5000.conf:/sentinel.conf redis \
redis-sentinel /sentinel.conf

docker run -d --name sentinel5000 --net host \
-v /opt/sentinel/5000.conf:/sentinel.conf redis \
redis-sentinel /sentinel.conf

服务端测试

package test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;

import java.util.HashSet;
import java.util.Set;

public class Test2 {
    public static void main(String[] args) {
        // 哨兵服务列表
        Set<String> set = new HashSet<String>();
        set.add("192.168.64.181:5000");
        set.add("192.168.64.181:5001");
        set.add("192.168.64.181:5002");
        // 哨兵连接池
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", set);
        // 获取连接池中数据操作工具
        Jedis resource = pool.getResource();
        // 添加数据
        resource.set("key", "value");
    }
}

Redis cluster集群

使用哈希槽算法

设置配置文件

mkdir /opt/redis
cd /opt/redis
mkdir 7000 7001 7002 7003 7004 7005

cat <<EOF >7000/redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7003/redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7004/redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat <<EOF >7005/redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

单独启动Redis

docker run -d --name redis7000 \
-v /opt/redis/7000/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7001 \
-v /opt/redis/7001/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7002 \
-v /opt/redis/7002/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7003 \
-v /opt/redis/7003/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7004 \
-v /opt/redis/7004/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf

docker run -d --name redis7005 \
-v /opt/redis/7005/redis.conf:/redis.conf \
--net=host \
--restart=always \
redis \
redis-server /redis.conf



组成集群

  1. 进入 一个容器
  2. 在容器中执行集群配置命令
# 进入容器执行集群配置命令

docker exec -it redis7000 \
redis-cli --cluster create \
192.168.64.181:7000 192.168.64.181:7001 \
192.168.64.181:7002 192.168.64.181:7003 \
192.168.64.181:7004 192.168.64.181:7005 \
--cluster-replicas 1

以集群形式进去容器

# -c 表示集群方式进入
docker exec -it redis7000 redis-cli -c -p 7000

spring访问集群

配置文件
spring:
  redis:
    cluster:
      nodes:
        - 192.168.64.181:7000
        - 192.168.64.181:7001
        - 192.168.64.181:7002
        - 192.168.64.181:7003
        - 192.168.64.181:7004
        - 192.168.64.181:7005
测试
package cu.tedu;

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.connection.RedisClusterConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;

@SpringBootTest
public class Test1 {
    @Autowired
    private RedisConnectionFactory factory;

    @Test
    public void test1() {
        RedisClusterConnection c = factory.getClusterConnection();
        for (int i = 0; i<100; i++){
            String k = "k"+i;
            String v = "v"+i;
            c.set(k.getBytes(), v.getBytes());
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值