깊이 Jedis(소스 코드)
https://blog.huachao.me/2016/2/%E6%B7%B1%E5%85%A5Jedis/?utm_source=tuicool&utm_medium=referral
Redis 클라이언트와 서버 측의 통신 프로토콜은 이렇게 간단하다
RESP 프로토콜
RESP(Redis Serialization Protocol)는 redis 서버와 redis client의 통신 프로토콜입니다.
\r
(CRLF)는 끝 문자"+OK\r
"
-WRONGTYPE Operation against a key holding the wrong kind of value
":1000\r
"
"$6\r
foobar\r
"
6은 뒤에 6개의byte 길이가 있음을 나타낸다"$-1\r
"
"*2\r
$3\r
foo\r
$3\r
bar\r
"
2는 2개의 원소가 있음을 나타낸다."*0\r
"
공수조llen mylist
-> *2\r
$4\r
llen\r
$6\r
mylist\r
:48293\r
RESP 프로토콜에 대한 Jedis의 추상
sendCommand(final RedisOutputStream os, final byte[] command, final byte[]... args)
프로토콜 연결 문자열에 따라 redis 서버에 보내는 방법, Object read(final RedisInputStream is)
어떻게 redis 서버의 반환을 받고 Java Object로 변환하는지 볼 수 있습니다.BinaryXxxCommands <- BinaryJedis, XxxCommands <- Jedis
바이너리 흐름을 통해 보내는 모든 Redis 명령을 추상화하는 데 사용XxxCommands <- Jedis
ClusterCommands와 유사한 명령을 추상적으로 추상적으로 사용하는 것은 결국 모두 2진 흐름이다. Binary를 없애면 작가가 싫증을 내는 것으로 추정된다.잘못된 점은 가르침을 주십시오.Commands, Connection <- BinaryClient <- Client
는 네트워크 송신 명령과 수신 회답을 추상화하였으며, 그 중에서 클라이언트는 매개 변수인encode를byte[]로 하고 BinaryClient를 호출하는 방법을 사용한다.BinaryClient에서 Connection#sendCommand 호출;sendCommand는 connect()를 호출하여 RedisInputStream과 RedisOutputStream을 프로토콜로 구성합니다.sendCommand에서 명령 보내기;client.getXxxReply () 는 먼저 outputstream의 내용flush를 내보낸 다음 Protocol을 호출합니다.read는 수신된 반환 값을 처리합니다./* Connection.java */
protected Connection sendCommand(final ProtocolCommand cmd, final byte[]... args) {
try {
connect();
Protocol.sendCommand(outputStream, cmd, args);
pipelinedCommands++;
return this;
} catch (JedisConnectionException ex) {
// Any other exceptions related to connection?
broken = true;
throw ex;
}
}
public void connect() {
if (!isConnected()) {
try {
socket = new Socket();
// ->@wjw_add
socket.setReuseAddress(true);
socket.setKeepAlive(true); // Will monitor the TCP connection is
// valid
socket.setTcpNoDelay(true); // Socket buffer Whetherclosed, to
// ensure timely delivery of data
socket.setSoLinger(true, 0); // Control calls close () method,
// the underlying socket is closed
// immediately
// <-@wjw_add
socket.connect(new InetSocketAddress(host, port), connectionTimeout);
socket.setSoTimeout(soTimeout);
outputStream = new RedisOutputStream(socket.getOutputStream());
inputStream = new RedisInputStream(socket.getInputStream());
} catch (IOException ex) {
broken = true;
throw new JedisConnectionException(ex);
}
}
}
/* */
public String getBulkReply() {
final byte[] result = getBinaryBulkReply();
if (null != result) {
return SafeEncoder.encode(result);
} else {
return null;
}
}
public byte[] getBinaryBulkReply() {
flush();
pipelinedCommands--;
return (byte[]) readProtocolWithCheckingBroken();
}
protected Object readProtocolWithCheckingBroken() {
try {
return Protocol.read(inputStream);
} catch (JedisConnectionException exc) {
broken = true;
throw exc;
}
}
jedis.pipelined()
Pipeline 실례를 되돌려준다. 그리고 이 Pipeline 실례의client는 현재 jedis 실례의client이다.pipeline.a_redis_command()
를 호출할 때 하나responseList
가 있습니다. 각각command가 대응하는response를 기록하는 데 사용됩니다.pipeline.syncAndReturnAll()
는 client.getAll()
모든command를 한 번flush()
내보내고 List 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.