一、怎么连接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 |