客户端
RESP(redis 序列化协议)
- 发送命令
*< 参数数量 > CRLF$< 参数 1 的字节数量 > CRLF< 参数 1> CRLF...$< 参数 N 的字节数量 > CRLF< 参数 N> CRLF
- 返回结果
状态回复:在RESP中第一个字节为"+"。
错误回复:在RESP中第一个字节为"-"。
整数回复:在RESP中第一个字节为":"。
字符串回复:在RESP中第一个字节为"$"。
多条字符串回复:在RESP中第一个字节为"*"。
java 客户端 Jedis
基本使用
Jedis jedis = new Jedis("127.0.0.1");jedis.set("name","my");System.out.println(jedis.get("name"));jedis.close();
连接池
JedisPoolConfig config = new JedisPoolConfig();config.setMaxIdle(15);config.setMaxTotal(30);JedisPool pool = new JedisPool(config);Jedis resource = pool.getResource();System.out.println(resource.ping());resource.close();pool.close();
Spring Data Redis
RedisTemplate基本操作
- redisTemplate.opsForValue() :操作字符串
- redisTemplate.opsForHash() :操作hash
- redisTemplate.opsForList():操作list
- redisTemplate.opsForSet():操作set
- redisTemplate.opsForZSet():操作zset
StringRedisTemplate是K,V均为String的RedisTemplate
使用
template.opsForValue().set("name","hello,bitch");
事务
multi # 开启事务set name helloset hello worldexec # 提交事务# discard 停止事务执行
命令语法错误导致的错误整个事务会回滚
set key javawatch keymultiset key cxkexec # 如果key在这个事务过程中别其他客户端修改 这个事务就不会执行
// 开启事务支持template.setEnableTransactionSupport(true);try{ // begin template.multi(); // 事务中的多个命令被一次性发送给服务器 template.opsForValue().set("java","langeuage"); template.opsForValue().set("python","langeuage"); // commit template.exec(); }catch (Exception e){ template.discard();}
客户端管理
client list
id=10733 addr=127.0.0.1:42158 fd=9 name= age=84021 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client user=default
序号 | 参数 | 含义 |
---|---|---|
1 | id | 客户端连接id |
2 | addr | 客户端连接P和端口 |
3 | fd | socket的文件描述符 |
4 | name | 客户端连接名 |
5 | age | 客户端连接存活时间 |
6 | idle | 客户端连接空闲时间 |
7 | flags | 客户端类型标识 |
8 | db | 当前客户端正在使用的数据库索引下标 |
9 | sub/psub | 当前客户端订阅的频道或者模式数 |
10 | multi | 当前事务中已执行命令个数 |
11 | gbuf | 输入缓冲区总容量 |
12 | gbuf-free | 输入缓冲区剩余容量 |
13 | obl | 固定缓冲区的长度 |
14 | oll | 动态缓冲区列表的长度 |
15 | omem | 固定缓冲区和动态缓冲区使用的容量 |
16 | events | 文件描述符事件(r/w):r和w分别代表客户端套接字可读和可写 |
17 | cmd | 当前客户端最后一次执行的命令,不包含参数 |
标识:
- id
- addr
- fd
- name
输入缓冲区:
Redis为每个客户端分配了输入缓冲区,它的作用是将客户端发送的命令临时保存,同时Redis从会输入缓冲区拉取命令并执行
- qbuf 缓冲区的总容量
- qbuf-free 剩余容量
如果Redis的处理速度跟不上输入缓冲区的输入速度 机会造成缓冲区十分大
输出缓冲区:
Redis为每个客户端分配了输出缓冲区,它的作用是保存命令执行的结果返回给客户端
输出缓冲区由两部分组成:固定缓冲区(16KB)和动态缓冲区,其中固定缓冲区返回比较小的执行结果,而动态缓冲区返回比较大的结果。 固定缓冲区使用的是字节数组,动态缓冲区使用的是列表
- obl 固定缓冲区的长度
- oll 动态缓冲区列表的长度
- omem 代表使用的字节数
客户端存活状态:
单位为秒
- age 客户端已经连接的时间
- idle 最近一次的空闲时间
客户端类型:
- flag
序号 | 客户端类型 | 说明 |
---|---|---|
1 | N | 普通客户端 |
2 | M | 当前客户端是master节点 |
3 | S | 当前客户端是slave节点 |
4 | O | 当前客户端正在执行monitor命令 |
5 | X | 当前客户端正在执行事务 |
6 | b | 当前客户端正在等待阻塞事件 |
7 | i | 当前客户端正在等待VM I/O,但是此状态目前已经废弃不用 |
8 | d | 一个受监视的键已被修改,EXEC命令将失败 |
9 | u | 客户端未被阻塞 |
10 | c | 回复完整输出后,关闭连接 |
11 | A | 尽可能快地关闭连接 |
setName getName
设置名称方便管理
client setName cxkclient getName
杀掉客户
client kill ip:port
阻塞客户
client pause timeout # 阻塞当前客户端指定毫秒数
监控客户端命令执行
monitor
客户端相关配置
- timeout 检测客户端空闲连接的超时时间,一旦idle时间达到了timeout,客户端将会被关闭,如果设置为0就不进行检测
- maxclients 客户端最大连接数
- tcp-keepalive 检测TCP连接活性的周期
- tcp-backlog TCP三次握手后,会将接受的连接放入队列中,tcp-backlog就是队列的大小
客户端统计
info clients
- connected_clients:代表当前Redis节点的客户端连接数
- client_recent_max_input_buffer:当前所有输出缓冲区中队列对象个数的最大值
- client_recent_max_output_buffer: 前所有输入缓冲区中占用的最大容量
- locked_clients:正在执行阻塞命令(例如blpop、brpop、brpoplpush)的客户端个数