3分钟-精通-Redis master/slave/sentinel (主从,哨兵)

场景分析:

公司原来的项目单war包对应单个redis,

如下图:

3分钟-精通-Redis master/slave/sentinel (主从,哨兵)_第1张图片

随着war包的增多,redis数量也增多。

我们知道redis采用多路复用其性能非常好,考虑到我们单点压力不大和可用性(若redis挂了,项目不能正常运行)。

用如下的方式。

3分钟-精通-Redis master/slave/sentinel (主从,哨兵)_第2张图片

正文:

  目录:

1 master slave 哨兵配置

2.检验

1 master slave 哨兵配置
1.1master slave 配置

假设有:

    192.168.35.128 (目标设为master)

# bind 127.0.0.1 master-slave 这个要注释掉
protected-mode no # 保护模式关了之后,不同服务器上的 redis才能通信
port 6379 # redis运行端口,不能冲突
daemonize yes # 以守护进程的方式运行

    192.168.35.129

# bind 127.0.0.1 master-slave 这个要注释掉
protected-mode no # 保护模式关了之后,不同服务器上的 redis才能通信
port 6379 # redis运行端口,不能冲突
daemonize yes # 以守护进程的方式运行
slaveof 192.168.35.128 6379 #slave配置 。主不需要多余配置

    192.168.35.130

# bind 127.0.0.1 master-slave 这个要注释掉
protected-mode no # 保护模式关了之后,不同服务器上的 redis才能通信
port 6379 # redis运行端口,不能冲突
daemonize yes # 以守护进程的方式运行
slaveof 192.168.35.128 6379 #slave配置 。主不需要多余配置

配置好之后用 ./redis-server ../redis.conf 启动三台上的redis

验证一下,128机上role:master 有 slave0,slave1 

success!!

3分钟-精通-Redis master/slave/sentinel (主从,哨兵)_第3张图片

1.2sentinel (哨兵 )配置

192.168.35.128  上修改 sentinel.conf 文件

protected-mode no # 保护模式关了之后,不同服务器上的 redis才能通信
port 26379 # redis运行端口,不能冲突
daemonize yes # 以守护进程的方式运行
sentinel monitor mymaster 192.168.35.128 6379 1 #这里的 1 代表最小投票数,当master shutdown的时候需要重新选举的最小票数

配置好了之后用 ./redis-sentinel    ../sentinel.conf 启动

到目前为止 master slave0 slave0 sentinel0 就配置好了。

2.检验

建立一个redis项目选择,redis & web的依赖

3分钟-精通-Redis master/slave/sentinel (主从,哨兵)_第4张图片

建立一个如下的类 (redis 接口的封装) 记得启动的时候要扫描一下

@Component
public class RedisClusterCache {

    @Autowired
    private RedisTemplate redisTemplate;


    public boolean exists(String key) {
        return redisTemplate.hasKey(key);
    }


    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }


    public void set(String key, String value) {
        set(key, value, 0);
    }


    public void set(String key, String value, int expireSec) {
        redisTemplate.opsForValue().set(key, value);
        if (expireSec != 0) {
            expire(key, expireSec);
        }
    }


    public void del(String key) {
        redisTemplate.delete(key);
    }


    public void lmset(String key, List values) {
        lmset(key, values, 0);
    }


    public void lmset(String key, List values, int expireSec) {
        redisTemplate.opsForList().leftPushAll(key, values);
        if (expireSec != 0) {
            expire(key, expireSec);
        }
    }


    public void lpush(String key, String value) {
        redisTemplate.opsForList().leftPush(key, value);
    }


    public String lpop(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }


    public long llen(String key) {
        return redisTemplate.opsForList().size(key);
    }


    public List lget(String key) {
        return redisTemplate.opsForList().range(key, 0, llen(key));
    }


    public void hmset(String key, Map values) {
        hmset(key, values, 0);
    }


    public void hmset(String key, Map values, int expireSec) {
        values.entrySet().forEach(item -> hset(key, item.getKey(), item.getValue()));
        if (expireSec != 0) {
            expire(key, expireSec);
        }
    }


    public void hset(String key, String field, String value) {
        redisTemplate.opsForHash().put(key, field, value);
    }


    public String hget(String key, String field) {
        return (String) redisTemplate.opsForHash().get(key, field);
    }


    public boolean hexists(String key, String field) {
        return redisTemplate.opsForHash().hasKey(key, field);
    }


    public Map hgetAll(String key) {
        return redisTemplate.opsForHash().entries(key)
                .entrySet().stream().collect(
                        Collectors.toMap(i -> (String) (i.getKey()), i -> (String) (i.getValue())));
    }


    public void hdel(String key, String field) {
        redisTemplate.opsForHash().delete(key, field);
    }


    public long incrBy(String key, long incrValue) {
        return redisTemplate.opsForValue().increment(key, incrValue);
    }


    public long decrBy(String key, long decrValue) {
        return redisTemplate.opsForValue().increment(key, -decrValue);
    }


    public void expire(String key, int expire) {
        redisTemplate.expire(key, expire, TimeUnit.SECONDS);
    }


    public void flushdb() {
        redisTemplate.execute((RedisCallback) connection -> {
            connection.flushDb();
            return null;
        });
    }
}
 
  

application.yml

spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 192.168.35.128:26379
    database: 0
server:
  port: 8889


测试类

/**
 * @author Joeg
 * @email [email protected]
 * @date 2018/4/11
 */

@RestController
@RequestMapping("demo")
public class DemoController {


    @Autowired
    RedisClusterCache redisClusterCache;

    @RequestMapping("/{key}")
    public String demo(@PathVariable String key) {
        String aa = redisClusterCache.get(key);
        return aa;
    }
}

success

3分钟-精通-Redis master/slave/sentinel (主从,哨兵)_第5张图片

2.总结

如果生产环境要使用还另外需要配置 密码。

一些具体配置见redis官方文档


第一次写谢谢大家的支持!

工作邮箱:[email protected] 看到肯定会回复

你可能感兴趣的:(redis,spring,boot)