zoukankan      html  css  js  c++  java
  • redis相关笔记(二.集群配置及使用)

    1. redis笔记一
    2. redis笔记二
    3. redis笔记三

    1.配置:在原redis-sentinel文件夹中添加{8337,8338,8339,8340}文件夹,且复制原8333中的配置

    在上述8333配置文件上添加集群相关配置

                #============================================自定义配置开始========================================
                #Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
                daemonize yes
                #当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
                Pidfile /var/run/redis_8340.pid
                #指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
                port 8340
                #绑定的主机地址
                bind 192.168.37.134
                #日志记录方式,默认为标准输出,日志输出至指定日志文件
                logfile "./redis-8340.log"
                #指定本地数据库存放目录
                dir "/usr/local/redis-sentinel/8340"
                #当master服务设置了密码保护时,slave服务连接master的密码
                masterauth admin.1231
                #设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
                requirepass admin.1231
                #指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段
                时间内的数据丢失。
                #因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no(开启AOF持>久化)
                appendonly yes
                ##集群开关,默认是不开启集群模式。
                cluster-enabled yes
                #集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置>文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突
                cluster-config-file nodes_8340.conf
                #节点互连超时的阀值。集群节点超时毫秒数
                cluster-node-timeout 10100
                #============================================自定义配置结束========================================

    2.全部启动

                [root@localhost redis-sentinel]# redis-server 8337/redis-8337.conf 
                [root@localhost redis-sentinel]# redis-server 8338/redis-8338.conf 
                [root@localhost redis-sentinel]# redis-server 8339/redis-8339.conf 
                [root@localhost redis-sentinel]# redis-server 8340/redis-8340.conf 

    查看结果

                [root@localhost redis-sentinel]# ps -ef | grep redis
                root      44355      1  0 10:10 ?        00:00:00 redis-server 192.168.37.134:8337 [cluster]
                root      44368      1  0 10:11 ?        00:00:00 redis-server 192.168.37.134:8338 [cluster]
                root      44372      1  0 10:11 ?        00:00:00 redis-server 192.168.37.134:8339 [cluster]
                root      44376      1  0 10:11 ?        00:00:00 redis-server 192.168.37.134:8340 [cluster]

    3.连接且并指派槽(16484个)

    (可以使用redis官方工具redis-trib.rb 来实现(集群加从服务器:Redis Cluster requires at least 3 master nodes,At least 6 nodes are required.This is not possible with 4 nodes and 1 replicas per node.))

    1.连接组成集群

    [root@localhost redis-sentinel]# redis-cli -c -h 192.168.37.134 -p 8337 -a admin.1231

    #现在只有一个

    192.168.37.134:8337> cluster nodes
    1cc4d5687c9f75cfe6cda8a0f22120b9ef652ca5 :8337 myself,master - 0 0 0 connected

    #和8338端口的连接起来

    192.168.37.134:8337> cluster meet 192.168.37.134 8338
    OK

    同样依次连接8339,8340
    此时redis集群时下线状态无法使用, CLUSTERDOWN Hash slot not served,槽未指派

    2.指派槽

    写个shell脚本,内容如下,内容是指将端口为8337的节点指派(0-4999)的槽,其他节点也以此分配,总共16484个分配至四个节点中

                    #! /bin/bash
                    for((i=0; i<5000; i++))
                    do
                      redis-cli -c -h 192.168.37.134 -p 8337 -a admin.1231 cluster addslots $i
                      echo $i" 次添加完毕"
                    done

    3.连接后查询可以看出cluster_slot16384个已全部ok

                    192.168.37.134:8337> cluster info
                    cluster_state:ok
                    cluster_slots_assigned:16384
                    cluster_slots_ok:16384
                    cluster_slots_pfail:0
                    cluster_slots_fail:0
                    cluster_known_nodes:4
                    cluster_size:4
                    cluster_current_epoch:3
                    cluster_my_epoch:1
                    cluster_stats_messages_sent:9053
                    cluster_stats_messages_received:9053
                    #设置值时可以看到此值是放入8340节点的15495槽中
                    192.168.37.134:8337> set a b
                    -> Redirected to slot [15495] located at 192.168.37.134:8340
                    OK

    redis的使用

        public static void main(String [] args) throws IOException {
            //建立连接
            Socket socket = new Socket("192.168.37.134", 6379);
            OutputStream outputStream = socket.getOutputStream();
            InputStream inputStream = socket.getInputStream();
            
            /**
            *    resp协议:https://redis.io/topics/protocol
            *    单行回复:回复的第一个字节是 "+",如表示成功 +OK
            *    错误信息:回复的第一个字节是 "-",如表示错误 -ERR unknown command 'xxx'
            *    整形数字:回复的第一个字节是 ":"
            *    多行字符串:回复的第一个字节是 "$"
            *    数组:回复的第一个字节是 "*"
            */
            
            
            /*     遵循resp协议发送消息:
                *3   数组包含3个元素,分别是SET、eat、I want to eat
                $3   是一个字符串,且字符串长度为3
                SET  字符串的内容
                $3   是一个字符串,且字符串长度为3
                aaa  字符串的内容
                $6  是一个字符串,且字符串长度为13
                bbbbbb 字符串的内容
            * */
            outputStream.write("*3".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("$3".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("SET".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("$3".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("aaa".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("$6".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.write("bbbbbb".getBytes());
            outputStream.write("
    ".getBytes());
            
            outputStream.flush();
    
            //接收消息
            byte [] result = new byte[2048];
            inputStream.read(result);
            System.out.println("接收到响应:"+new String(result));
        }

    结果===>接收到响应:+OK

  • 相关阅读:
    经验总结
    C#小技巧收集总结
    随笔
    看盘做短线的10种方法(转)
    dvbbs 7.1版块图标感应渐变效果 From www.jfeng.cn
    动网的个人文集、个人精华
    dvbbs 文件Dv_News.asp 的外部调用
    动网论坛多系统整合Api接口程序 PDO通行接口开发人员参考规范1.0
    动网首页登陆入口调用
    ASP 有关整合动网论坛的问题
  • 原文地址:https://www.cnblogs.com/lantuanqing/p/11577169.html
Copyright © 2011-2022 走看看