@@ -112,7 +112,7 @@ AOF(Append Only File)持久化是把每次写的命令追加写入日志中
112
112
** AOF同步策略**
113
113
> - always:每次写入缓冲区都需要同步到AOF文件中,硬盘的操作比较慢,限制了Redis高并发;
114
114
> - no:每次写入缓存区,不进行同步,同步到AOF文件的操作丢给操作系统负责,每次同步AOF文件周期不可控;
115
- > - eversec:每次写入缓存区都 ,由专门的线程每秒钟同步一次,做到了性能与数据安全的兼并;
115
+ > - eversec:每次写入缓存区 ,由专门的线程每秒钟同步一次,做到了性能与数据安全的兼并;
116
116
117
117
------------
118
118
@@ -143,7 +143,7 @@ gossip算法如其名,灵感来自办公室的八卦,在有限的时间内
143
143
144
144
gossip协议包含多种消息,包括:ping、pong、meet、fail等:
145
145
146
- > - meet:当某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始茰其他节点进行通信 ;
146
+ > - meet:当某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始跟其他节点进行通信 ;
147
147
> - ping:每个节点都会频繁的给其他节点发ping,其中包含自己的状态还有自己维护的redis集群元数据信息,相互通过ping交换元数据;
148
148
> - pong:返回ping和meet,包含自己的状态和其他信息,也可以用于信息广播和更新;
149
149
> - fail:某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点指定的节点宕机了;
@@ -199,7 +199,7 @@ ZipList和LinkedList的优缺点:
199
199
200
200
** Redis3.2后使用QuickList作为List存储结构:**
201
201
202
- 可以认为QuickList是ziplist和linkedList的结合。quicklist是一个ziplist组成的双向链表,每个节点使用ziplist来保存数据。本上上说 ,quicklist里保存了一个一个的ziplist;
202
+ 可以认为QuickList是ziplist和linkedList的结合。quicklist是一个ziplist组成的双向链表,每个节点使用ziplist来保存数据。本质上说 ,quicklist里保存了一个一个的ziplist;
203
203
204
204
QuickList是ZipList的一次封装,使用小块的zipList保证内存使用,也保证了性能:
205
205
@@ -221,7 +221,7 @@ Zset的两种实现方式,ZipList和SkipList(跳表)
221
221
222
222
> - hashtable用来存储member到score的映射,这样就可以在O(1)时间找到member对应的分数;
223
223
> - skiplist按从小到大的顺序存储分数;
224
- > - skip每个元素的值都是 【score、value】对应;
224
+ > - skiplist每个元素的值都是 【score、value】对应;
225
225
226
226
** SkipList的优势:**
227
227
@@ -255,6 +255,7 @@ Redis为每一个key维护了一个24位的时钟,同时也维护了一个全
255
255
** Redis中的LFU实现 :**
256
256
257
257
LRU是Redis4.0后出现的淘汰算法,LRU的最近最少使用实际上是不精确的,因为使用距离时间较最久的key,不代表是使用频率最少的key;
258
+
258
259
如下图,按照LRU会淘汰A,因为B的访问时间比A更近,但是A的使用频率远超于B,理应淘汰B;
259
260
``` asp
260
261
A~~A~~A~~A~~A~~A~~A~~A~~A~~A~~~|
@@ -268,7 +269,10 @@ LFU把原先的key对象内部的24位时钟分为了两个部分,前16位还
268
269
### Jedis原理介绍
269
270
270
271
##### Redis信协议
271
- Jedis Client是Redis官网推荐的一个面向Java的客户端,库文件实现了对Redis各类API进行封装调用。Redis-Cli与Server端使用一种专门为Redis设计的协议RESP(Redis Serialization Protocol)交互,RESP本身没有指定TCP,但是Redis的上下文只能使用TCP连接。
272
+ Jedis Client是Redis官网推荐的一个面向Java的客户端,库文件实现了对Redis各类API进行封装调用。
273
+
274
+ Redis-Cli与Server端使用一种专门为Redis设计的协议RESP(Redis Serialization Protocol)交互,RESP本身没有指定TCP,但是Redis的上下文只能使用TCP连接。
275
+
272
276
Jedis通过RESP协议实现了与Redis服务端的通信,Jedis客户端本质上是通过Socket按照RESP协议与Redis通性。
273
277
274
278
> - 用\r\n做间隔
@@ -334,10 +338,13 @@ mget name1 name2
334
338
335
339
##### Jedis连接池
336
340
虽然基于内存的Redis数据库有着超高的性能,但是底层的网络通信却占用了一次数据请求的大量时间,因为每次数据交互需要先建立连接。
341
+
337
342
在Jedis中每次new Jedis()都会创建新的TCP连接,使用后再断开连接,对于频繁访问Redis的场景显然不是高效的方式。
343
+
338
344
Jedis连接池则可以实现在客户端建立多个连接并不释放,当需要使用连接的时候通过一定的算法获取已建立的连接,使用完了以后则还给连接池,这样可以减少Redis每次操作时创建新连接带来的IO消耗。
339
345
340
346
客户端连接Redis使用的是TCP连接,直连的方式每次都要建立新的TCP连接,而连接池的方式是可以预先初始化好jedis连接,每次只需要从jedis连接池借用即可,借用和归还操作是在本地进行的,只有少量的并发同步开销,远远小于新建TCP连接的开销。
347
+
341
348
此外,连接池的方式可以有效保护和控制资源的使用,而直连的方式无法限制jedis对象的个数,并且可能存在连接泄漏的情况。
342
349
343
350
##### SpringBoot集成Jedis-实现Redis调用实战
0 commit comments