【Redis十一】Redis的客戶端

一、怎麼連接redis的客戶端

  1. 首先來看看redis是否已經啓動 ps aux | grep redis   ,沒啓動./redis-server ../redis.conf 後端啓動.sh腳本nohup ./run.sh &   
  2. 進入redis的安裝目錄下的src目錄,找到redis-cli 文件,使用 ./redis-cli  -h 指定的IP -p 指定端口號
  3. 如果是設置了密碼則 輸入auth 密碼 密碼驗證

二、怎麼通過跳板機連接redis

      #首先要添加Maven依賴
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.53</version>
        </dependency>
//接着是使用Java 通過跳板機連接redis 使用Jsch包直接從Java打開隧道
public static void main(String[] args) throws Throwable {
        // 跳板機設置
        String host = "1XX.XX.XX.XX";
        String user = "your userName";
        String password = "your password";
        int port = 22;

        // redis服務器
        String tunnelRemoteHost = "1XX.XX.XX.XX";
        int tunnelRemotePort = XXXX;
        // Open the SSH session
        JSch jsch = new JSch();
        //獲取一個session連接
        Session session = jsch.getSession(user, host, port);
        session.setPassword(password);
        
        java.util.Properties config = new java.util.Properties();
        //增加StrictHostKeyChecking no配置,防止主機IP變動引起的ssh登陸異常
        config.put("StrictHostKeyChecking", "no");
        //保存快照的時候,是否壓縮
        config.put("Compression", "yes");
        //連接出現異常最大重試次數
        config.put("ConnectionAttempts","3");
        session.setConfig(config);
        session.connect();

        /**
         *
         設置從本地主機到Redis服務器的端口轉發
         本地端口是臨時的(由OS提供)
         Jedis使用本地端口連接到localhost
         */
        port = session.setPortForwardingL(0, tunnelRemoteHost, tunnelRemotePort);

        // 通過jedis操作redis
        Jedis jedis = new Jedis("127.0.0.1", port);
        jedis.auth("your redis password");
        String output;
        jedis.set("hello2", "world2");
        output = jedis.get("hello2");
        System.out.println(output);

        // 關閉session
        session.disconnect();
    }
//正確的關閉方式
public void disconnect() {
      jedis.disconnect();
      try {
        session.delPortForwardingL( port );
        session.disconnect();            
      } catch ( JSchException e ) {
        // Proper error handling omitted
        System.out.println(e);
      } 
    }

三、如何獲取連接池

//獲取遠程的redis的jedis連接池
          // 跳板機設置
            String host = "遠程服務器地址";
            String user = "用戶名";
            String password = "密碼";
            int port = 22;

            // redis服務器
            String tunnelRemoteHost = "redis的ip地址";
            int tunnelRemotePort = reds的端口號;
            // Open the SSH session
            JSch jsch = new JSch();
            session = jsch.getSession(user, host, port);
            session.setPassword(password);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            config.put("Compression", "yes");
            config.put("ConnectionAttempts","3");
            session.setConfig(config);
            session.connect();

            /**
             *
             設置從本地主機到Redis服務器的端口轉發
             本地端口是臨時的(由OS提供)
             Jedis使用本地端口連接到localhost
             */
            port = session.setPortForwardingL(0, tunnelRemoteHost, tunnelRemotePort);

            JedisPoolConfig cfg = new JedisPoolConfig();
            cfg.setMaxTotal(3000);
            cfg.setMaxIdle(300);
            cfg.setMinIdle(3);
            cfg.setMaxWaitMillis(3000);
            cfg.setTestOnBorrow(true);
            cfg.setTestOnReturn(true);
            cfg.setTestWhileIdle(true);

            jedisPool01 = new JedisPool(cfg,"127.0.0.1", port,5000,"本Redis密碼");

四、Redis的客戶端解析

redisServer大致文件

struct redisServer {
    ……
    //一個鏈表,保存了所有客戶端狀態
    list *clients;            
    ……
};

 redis.h/redisClient結構主要內容有:

typedef struct redisClient {
    #客戶端正在使用的套接字描述符
    int fd;

    robj *name; 

    #flags屬性的值可以是單個標誌:flags = <flag>,
    #也可以是多個標誌的二進制:flags = <flags1> | <flags2> | ……
    int flags;

    #客戶端狀態的輸入緩衝區用於保存客戶端發送的命令請求
    sds querybuf;

    /*在服務器將客戶端發送的命令請求保存到客戶端狀態的querybuf屬性之後,
     服務器將對命令請求的內容進行分析,
     並將得出的命令參數以及命令參數的個數分別保存到客戶端狀態的argv屬性和argc屬性*/
    int argc;
    robj **argv;
    
    #當程序在命令表中成功找到argv[0]所對應的redisCommand結構體時,
    #它會將客戶端狀態的cmd指針指向這個結構體
    struct redisCommand *cmd;
    
    #輸出緩衝區
    int bufpos;//buf是一個大小爲REDIS_REPLY_CHUNK_BYTES字節的字節數組

    char buf[REDIS_REPLY_CHUNK_BYTES];//bufpos屬性則記錄了buf數組目前已使用的字節數量

    #固定緩衝區不夠用,則啓用可變大小緩衝區,其由reply鏈表和一個或多個字符串對象組成
    list *reply;

     #用於記錄客戶端是否通過了身份驗證
     int authenticated;      /* when requirepass is non-NULL */

    #時間相關
    time_t ctime;         
    time_t lastinteraction;
    time_t obuf_soft_limit_reached_time;


} redisClient;

套接字描述符fd屬性:

輸出緩衝buf和bufpos屬性:

 時間屬性:

能讓客戶端關閉的情況:

六、redis的常見命令

Redis的常用命令
1.連接服務端/客戶端

./redis-server /etc/redis.conf(指定配置文件啓動服務)

./redis-cli  -h 指定的IP -p 指定端口號(客戶端)

2.查看Redis狀態 info /info memory/ info stats 等
3.查看記錄數 dbsize
4.查看所有的鍵

KEYS *

5.列出所有客戶端連接 CLIENT LIST
6.關閉ip:port的客戶端 CLIENT KILL 127.0.0.1:11902
7.清空所有數據庫的所有key FLUSHALL(需謹慎)
8.清空當前數據庫中所有key FLUSHDB(需謹慎)
9.返回最後一次成功保存數據到磁盤的時間,以UNIX時間戳格式表示 LASTSAVE
10.返回當前服務器時間,以UNIX時間戳格式表示 TIME
11.連接到其他數據庫(數據庫1)(默認數據庫是0) SELECT 1
12.將當前數據庫(數據庫1)的 key 移動到指定的數據庫(數據庫0) MOVE test1 0

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章