一、怎麼連接redis的客戶端
- 首先來看看redis是否已經啓動 ps aux | grep redis ,沒啓動./redis-server ../redis.conf 後端啓動.sh腳本nohup ./run.sh &
- 進入redis的安裝目錄下的src目錄,找到redis-cli 文件,使用 ./redis-cli -h 指定的IP -p 指定端口號
- 如果是設置了密碼則 輸入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的常見命令
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 |