<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: testted123456</title>
    <description>The latest articles on DEV Community by testted123456 (@testted123456).</description>
    <link>https://dev.to/testted123456</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F918767%2Fbbe15430-a097-42ff-b60f-61a1a0398e65.png</url>
      <title>DEV Community: testted123456</title>
      <link>https://dev.to/testted123456</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/testted123456"/>
    <language>en</language>
    <item>
      <title>kafka consumer</title>
      <dc:creator>testted123456</dc:creator>
      <pubDate>Wed, 28 Sep 2022 14:44:11 +0000</pubDate>
      <link>https://dev.to/testted123456/kafka-consumer-1lhn</link>
      <guid>https://dev.to/testted123456/kafka-consumer-1lhn</guid>
      <description>&lt;h2&gt;
  
  
  分配策略
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;range&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;8个partition，3个consumer：&lt;br&gt;
&lt;code&gt;consumer 1: partition 1、partition 2、partition 3&lt;br&gt;
consumer 2: partition 4、partition 5、partition 6&lt;br&gt;
consumer 3: partition 7、partition 8&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;round robin&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;consumer 1: partition 1、partition 4、partition 7&lt;br&gt;
consumer 2: partition 2、partition 5、partition 8&lt;br&gt;
consumer 3: partition 3、partition 6&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
sticky&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>kafka-producer</title>
      <dc:creator>testted123456</dc:creator>
      <pubDate>Tue, 13 Sep 2022 16:36:17 +0000</pubDate>
      <link>https://dev.to/testted123456/kafka-producer-406n</link>
      <guid>https://dev.to/testted123456/kafka-producer-406n</guid>
      <description>&lt;p&gt;一、分区策略&lt;/p&gt;

&lt;p&gt;二、ISR（in-sync replica set)：与leader同步的follower&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;每个partition收到消息，需要给producer发送ack。producer收到ack会继续发送下一条，否则重复发送&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;partition发送ack时机&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;leader同步follower后发送ack，这样leader挂了数据不会丢失&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;全部follower同步后再给producer发送ack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;follower从leader同步完成后发送ack给leader，如果超时(replica.lag.time.max.ms)不发送，则被踢出ISR&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;leader故障，会从ISR选出leader&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;三、ack机制&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
ack参数配置（request-required-acks）：&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;request-required-acks:-1， follower全部同步完后leader在返回acks给producer；数据不丢失，延迟性差&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;request-required-acks:1， leader成功收到数据就返回acks；leader没有持久化就挂了，会丢数据&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;request-required-acks:0， producer不等leader返回acks就继续发送消息&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
幂等
enable.idempotence=true，producer初始化时会分配一个pid，发往partition的数据会带上sequence number，broker会对进行缓存，相同的数据broker只会缓存一条&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;四、数据一致性&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e0zjvykq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1m6vnmo2pm4729sozj7g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e0zjvykq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1m6vnmo2pm4729sozj7g.png" alt="Image description" width="821" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>kafka文件存储</title>
      <dc:creator>testted123456</dc:creator>
      <pubDate>Sun, 11 Sep 2022 15:11:38 +0000</pubDate>
      <link>https://dev.to/testted123456/kafka-1g5d</link>
      <guid>https://dev.to/testted123456/kafka-1g5d</guid>
      <description>&lt;h2&gt;
  
  
  一、kafka架构
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sXXLt-5F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l2700fga229aqxemm3gv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sXXLt-5F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l2700fga229aqxemm3gv.png" alt="Image description" width="772" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;producer：生产者。producer产生的数据追加到partition的log文件中，每条数据有自己的offset&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;consumer：消费者&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;consumer group：消费者组；对应一个partition，一个消费组中只能有一个consumer来消费&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;broker：一个kafka服务就是一个broker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;topic：逻辑概念；代表一类消息&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;partition：分区。partition是物理上的概念，每个partition对应一个log文件。&lt;br&gt;
一个topic可以分到多个partition上，每个partition是有序的队列，但不能保证topic全局有序&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;replica：副本。一个topic在一个partition有一个leader replica和多个follower replica&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tP522svJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9e1zxy08t7mikkzt3fz5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tP522svJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9e1zxy08t7mikkzt3fz5.png" alt="Image description" width="880" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  二、工作流
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aOCcvCLW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m0gb0z7r9m5wdty04w5r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aOCcvCLW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m0gb0z7r9m5wdty04w5r.png" alt="Image description" width="815" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;三、文件存储&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--743iVPjN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a6mmefjar9q8lvmnx52v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--743iVPjN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a6mmefjar9q8lvmnx52v.png" alt="Image description" width="692" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WYKanpw4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qu8uiltsmbda2tsoifnj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WYKanpw4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qu8uiltsmbda2tsoifnj.png" alt="Image description" width="880" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rYiO1t5c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4dge16zlrmmg7xrktv72.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rYiO1t5c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4dge16zlrmmg7xrktv72.png" alt="Image description" width="744" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l-Hvpimi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t26j17w7bhnj5gsvbef9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l-Hvpimi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t26j17w7bhnj5gsvbef9.png" alt="Image description" width="880" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;log文件已1G为临界点，超过1G就会创建新文件&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;一个segement包含一个log文件、一个index文件；文件结尾是文件中第一条消息的offset-1&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;根据offset (1560140921)定位数据：&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;定位到00000000001560140916.log、00000000001560140916.index文件&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1560140921 - 1560140916 + 1 = 5&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;根据上一步的5找到index文件中序号为5对应的地址456&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;根据456找到log文件中对应的消息&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;参考：&lt;br&gt;
&lt;a href="https://blog.csdn.net/godlovedaniel/article/details/120113667"&gt;https://blog.csdn.net/godlovedaniel/article/details/120113667&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.csdn.net/cao1315020626/article/details/112590786"&gt;https://blog.csdn.net/cao1315020626/article/details/112590786&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>zookeeper安装</title>
      <dc:creator>testted123456</dc:creator>
      <pubDate>Sun, 11 Sep 2022 14:40:45 +0000</pubDate>
      <link>https://dev.to/testted123456/zookeeperan-zhuang-1ml7</link>
      <guid>https://dev.to/testted123456/zookeeperan-zhuang-1ml7</guid>
      <description>&lt;p&gt;一、安装&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# tar -zxvf zookeeper-3.*.*.tar.gz
# cd zookeeper-3.*.*
# cd conf
# cp zoo_sample.cfg zoo.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;二、修改配置: zoo.cfg&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tickTime=2000
initLimit=10
syncLimit=5
# 数据保存地址
dataDir=/Users/ted/software/apache-zookeeper-3.7.1-bin/data
# 端口
clientPort=2181
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;三、启动&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# cd zookeeper-3.*.*
# cd bin
# 启动zookeeper
# sh zkServer.sh start
# 启动zookeeper client
# sh zkCli.sh
[zk: localhost:2181(CONNECTED) 10]ls /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>kafka安装</title>
      <dc:creator>testted123456</dc:creator>
      <pubDate>Thu, 08 Sep 2022 16:40:05 +0000</pubDate>
      <link>https://dev.to/testted123456/kafkaan-zhuang-7f2</link>
      <guid>https://dev.to/testted123456/kafkaan-zhuang-7f2</guid>
      <description>&lt;p&gt;一、安装&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ tar -xzvf kafka_2.13-3.2.1.tgz
$ cd kafka_2.13-3.2.1
$ cd config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;二、修改配置: server.properties&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;broker.id=0
advertised.listeners=PLAINTEXT://127.0.0.1:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
# 日志存储地址
log.dirs=/Users/ted/software/kafka_2.13-3.2.1/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
# zookeeper地址
zookeeper.connect=127.0.0.1:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;三、命令&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 启动
$ kafka-server-start.sh -daemon ./server.properties
# 创建topic
$ kafka-topics.sh --create --bootstrap-server localhost:9092 --topic first-topic --partitions 1 --replication-factor 1
# 查看topic list
$ kafka-topics.sh --bootstrap-server localhost:9092 --list
# 查看topic具体信息
$ kafka-topics.sh --bootstrap-server localhost:9092 --topic first-topic --describe
# 修改topic的partitions
$ kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic first-topic --partitions 2
# 删除topic
$ kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic first-topic
# produce 
$ kafka-console-producer.sh --topic first-topic --broker-list localhost:9092
# consume
$ kafka-console-consumer.sh --topic first-topic --bootstrap-server localhost:9092
$ kafka-console-consumer.sh --topic first-topic --bootstrap-server localhost:9092 --from-beginning

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Redis-穿透、击穿、雪崩</title>
      <dc:creator>testted123456</dc:creator>
      <pubDate>Tue, 06 Sep 2022 15:27:58 +0000</pubDate>
      <link>https://dev.to/testted123456/chuan-tou-ji-chuan-xue-beng-3oie</link>
      <guid>https://dev.to/testted123456/chuan-tou-ji-chuan-xue-beng-3oie</guid>
      <description>&lt;p&gt;一、穿透&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;查询的key不在redis中，请求就会打到数据库。低频穿透不要紧，要防止高频穿透。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;解决方案一：短暂缓存空对象&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;只能保证db和redis弱一致性&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;如果缓存大量空对象，会占用大量内存；同时redis有LRU/LFU内存淘汰策略，会将有价值的数据淘汰&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
解决方案二：Bloom Filter&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
bloom filter认为这条数据存在，不一定存在于redis中；但bloom filter认为这条数据不存在于redis中，则一定不存在于redis中&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;二、穿透&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;“穿透”是“击穿”的特殊表现形式，热点key被击穿；比如微博的热点事件导致微博瘫痪&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;解决方案一：热点key不过期&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
可能导致db和redis不一致&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
解决方案二：分布式锁&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
热点key在redis查不到，只允许一个request打到db&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;三、雪崩&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;“雪崩”是“穿透”的特殊表现形式，多个热点key失效&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;原因：&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;过期时间比较一致，某个时间同时失效，可以将失效时间设为随机数&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;redis挂了，可以使用集群&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
解决方案一：数据预热，缓存时间随机&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
项目启动时将db的数据同步到redis，并设置随机值为过期时间&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
解决方案二：redis集群&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>redis-持久化</title>
      <dc:creator>testted123456</dc:creator>
      <pubDate>Sun, 04 Sep 2022 08:19:41 +0000</pubDate>
      <link>https://dev.to/testted123456/redischi-jiu-hua-35gf</link>
      <guid>https://dev.to/testted123456/redischi-jiu-hua-35gf</guid>
      <description>&lt;h2&gt;
  
  
  一、RDB快照持久化
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;在指定时间间隔将内存数据写入磁盘，默认持久化方式&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;触发方式&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. 执行save和bgsave命令
2. 配置文件设置save &amp;lt;seconds&amp;gt; &amp;lt;changes&amp;gt;规则，自动间隔性执行bgsave命令
3. 主从复制时，从库全量复制同步主库数据，主库会执行bgsave
4. 执行flushall命令清空服务器数据
5. 执行shutdown命令关闭Redis时，会执行save命令
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;save命令&lt;br&gt;
save会阻塞redis进程，再快照创建完之前不能出来其他请求&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;bgsave命令&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;bgsave不会阻塞redis进程，会fork出一个进程把全量数据写入临时rdb文件，再替换正式rdb文件&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;配置文件自动触发bgsave&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 900秒内有1次key改变则触发
save 900 1
# 300秒内有10次key改变则触发
save 300 10
# 60秒内有10000次key改变则触发
save 60 10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
优点：&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;RDB快照是一个压缩过的非常紧凑的文件，保存着某个时间点的数据集，适合做数据的备份，灾难恢复&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;可以最大化Redis的性能，在保存RDB文件，服务器进程只需fork一个子进程来完成RDB文件的创建，父进程不需要做IO操作&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;与AOF相比，恢复大数据集的时候会更快&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
缺点：&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;RDB的数据安全性是不如AOF的，保存整个数据集的过程是比繁重的，根据配置可能要几分钟才快照一次，如果服务器宕机，那么就可能丢失几分钟的数据&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Redis数据集较大时，fork的子进程要完成快照会比较耗CPU、耗时&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  二、AOF持久化
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# appendonly参数开启AOF持久化
appendonly no

# AOF持久化的文件名，默认是appendonly.aof
appendfilename "appendonly.aof"

# AOF文件的保存位置和RDB文件的位置相同，都是通过dir参数设置的
dir ./

# 同步策略(always/everysec/no)
appendfsync everysec

# aof重写期间是否同步
no-appendfsync-on-rewrite no

# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 加载aof出错如何处理
aof-load-truncated yes

# 文件重写策略
aof-rewrite-incremental-fsync yes

# 同时开启rdb、aof
aof-use-rdb-preamble yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
append命令&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;开启aof，每个执行一个命令，都会把该命令以协议格式先追加到aof_buf缓存区的末尾，而不是直接写入文件，避免每次有命令都直接写入硬盘，减少硬盘IO次数&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aof_buf写入aof策略：&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;appendfsync always：
将aof_buf缓冲区的所有内容写入并同步到AOF文件，每个写命令同步写入磁盘

appendfsync everysec：
将aof_buf缓存区的内容写入AOF文件，每秒同步一次，该操作由一个线程专门负责

appendfsync no：
将aof_buf缓存区的内容写入AOF文件，什么时候同步由操作系统来决定
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
rewrite命令&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;随着时间推移，aof文件会越来越大，rewrite就是为了缩小aof文件的大小&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rewrite不是读取aof文件，而是读redis生成新的aof文件替换老的aof文件&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;redis-7会把数据保存到aof目录下的rdb中，同时清空aof文件&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;命令触发&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# fork出一个进程来执行，服务器继续执行命令，且最加到aof_buf、
# aof_rewrite_buf
127.0.0.1:6379&amp;gt; bgrewriteaof
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
自动触发
配置文件：
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 当AOF文件的体积大于64MB，且AOF文件的体积比上一次重写后的体积大了一倍（100%）时，会执行`bgrewriteaof`命令
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
优点：&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;数据更完整，安全性更高，秒级数据丢失（取决fsync策略，如果是everysec，最多丢失1秒的数据）&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AOF文件是一个只进行追加的日志文件，且写入操作是以Redis协议的格式保存的，内容是可读的，适合误删紧急恢复&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
缺点：&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;对于相同的数据集，AOF文件的体积要大于RDB文件，数据恢复也会比较慢&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;根据所使用的 fsync 策略，AOF 的速度可能会慢于 RDB。 不过在一般情况下， 每秒 fsync 的性能依然非常高&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>redis-数据类型</title>
      <dc:creator>testted123456</dc:creator>
      <pubDate>Sat, 03 Sep 2022 16:58:43 +0000</pubDate>
      <link>https://dev.to/testted123456/redis-shu-ju-lei-xing-2kpi</link>
      <guid>https://dev.to/testted123456/redis-shu-ju-lei-xing-2kpi</guid>
      <description>&lt;h2&gt;
  
  
  string
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis 127.0.0.1:6379&amp;gt; SET key1 value1
redis 127.0.0.1:6379&amp;gt; GET key1
value1
redis 127.0.0.1:6379&amp;gt; DEL key1
# 设置key1过期时间（秒），可重复设置
redis 127.0.0.1:6379&amp;gt; expire key1 10
# 查询key1过期时间
redis 127.0.0.1:6379&amp;gt; ttl key1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  hash
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis 127.0.0.1:6379&amp;gt; HMSET hash1 field1 'v1' field2 'v2'
redis 127.0.0.1:6379&amp;gt; HGET hash1 field1
v1
redis 127.0.0.1:6379&amp;gt; HDEL hash1 field1
redis 127.0.0.1:6379&amp;gt; HEXISTS hash1 field1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  list
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis 127.0.0.1:6379&amp;gt; lpush list1 value1 value2
redis 127.0.0.1:6379&amp;gt; lrange list1 0 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  set
&lt;/h3&gt;

&lt;p&gt;set是string的无序集合&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis 127.0.0.1:6379&amp;gt; sadd set1 a
redis 127.0.0.1:6379&amp;gt; sadd set1 b
redis 127.0.0.1:6379&amp;gt; smembers set1
a
b
redis 127.0.0.1:6379&amp;gt; sdiff set1 set2 set3 *返回set的差集*
redis 127.0.0.1:6379&amp;gt;  sinter set1 set2 *返回set的交集*
redis 127.0.0.1:6379&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  sorted set
&lt;/h2&gt;

&lt;p&gt;stirng有序集合&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis 127.0.0.1:6379&amp;gt; zadd zset1 1 value1 
redis 127.0.0.1:6379&amp;gt; zadd zset1 2 value2
redis 127.0.0.1:6379&amp;gt; zadd zset1 3 value3
redis 127.0.0.1:6379&amp;gt; zrange zset1 1 3 withscores
1) "value1"
2) "value2"
3) "value3"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>redis-高可用</title>
      <dc:creator>testted123456</dc:creator>
      <pubDate>Wed, 31 Aug 2022 17:45:37 +0000</pubDate>
      <link>https://dev.to/testted123456/redis-gao-ke-yong-57ea</link>
      <guid>https://dev.to/testted123456/redis-gao-ke-yong-57ea</guid>
      <description>&lt;h2&gt;
  
  
  一、主从
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5JpnVzv2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pub6d4ok0ym7zd68w330.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5JpnVzv2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pub6d4ok0ym7zd68w330.png" alt="Image description" width="595" height="817"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. salve连接master，发送SYNC命令
2. master接收到SYNC命令后，可以执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
3. master执行BGSAVE后，向所有salve发送快照文件，并在发送期间继续记录被执行的写命令
4. salve收到快照文件后丢弃所有旧数据，载入收到的快照
5. master快照发送完毕后开始向salve发送缓冲区中的写命令
6. salve完成对快照的载入，开始接受命令请求，并执行来自master缓冲区的写命令，salve初始化完成
7. master每执行一个写命令就会向salve发送相同的写命令，salve接收并执行收到的写命令(salve初始化完成后的操作)
8. 出现断开重连后，2.8之后的版本会将断线期间的命令传给从数据库，增量复制。
9. 主从刚刚连接的时候，进行全量同步;
10. 全同步结束后，进行增量同步。
11. slave在任何时候都可以发起全量同步。Redis 的策略是，无论如何，首先会尝试进行增量同步，如不成功，要求从机进行全量同步。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;slave配置：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;slaveof 127.0.0.1 6379
#slave只读
slave-read-only yes slave只读
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#查看主从信息
redis 127.0.0.1:6379&amp;gt;info replication
#关闭master
redis 127.0.0.1:6379&amp;gt;shutdown
#把slave1变成master
redis 127.0.0.1:16379&amp;gt;slaveof no one
#把slave2变成变成slave1的slave
redis 127.0.0.1:26379&amp;gt;slaveof 127.0.0.1 16379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  二、哨兵
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wi9Muxxf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f1w6w4figbdujww4nq2o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wi9Muxxf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f1w6w4figbdujww4nq2o.png" alt="Image description" width="880" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;sentinel配置&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 禁止保护模式
protected-mode no
# 配置监听的主服务器，这里sentinel monitor代表监控，mymaster代表服务器的名称，可以自定义，
# 监控127.0.0.1:6379，2代表只有两个或两个以上的哨兵认为主服务器不可用的时候，才会进行failover操作。
sentinel monitor mymaster 127.0.0.1 6379 2
# sentinel author-pass定义服务的密码，mymaster是服务名称，123456是# # redis服务器密码
# sentinel auth-pass mymaster 123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
sentinel每秒ping集群中的master/salve/other sentinel&lt;/li&gt;
&lt;li&gt;
response时间大于down-after-milliseconds，sentinel则认为对方主观下线（SDOWN）&lt;/li&gt;
&lt;li&gt;
master被标记为主观下线（SDOWN），则所有sentinel每1秒确认master状态&lt;/li&gt;
&lt;li&gt;
足够数量sentinel认定master下线，则master被标记为客观下线（ODOWN）&lt;/li&gt;
&lt;li&gt;
sentinel每10秒向集群中master/salve发送info命令&lt;/li&gt;
&lt;li&gt;
当master客观下线（ODOWN），sentinel则每1秒向集群中salve发送info命令&lt;/li&gt;
&lt;li&gt;&lt;p&gt;若没有足够数量的sentinel同意master主观下线，就不会变成客观下线。若 master重新向sentinel发送ping返回有效回复，master主观下线状态就会被移除。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;优点&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
主从自动切换&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
缺点&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;内存使用率低&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;难以扩容&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  三、集群
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0D9U1kYd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oqatxaza7s8dujvvrlcw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0D9U1kYd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oqatxaza7s8dujvvrlcw.png" alt="Image description" width="880" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;cluster配置&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 开启redis的集群模式
cluster-enabled yes
# 配置集群模式下的配置文件名称和位置,redis-cluster.conf这个文件是集群启# 动后自动生成的，不需要手动配置。
# cluster-config-file redis-cluster.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;每个节点都会通过集群总线(cluster bus)，与其他的节点进行通信。通讯时使用特殊的端口号，即对外服务端口号加 10000。例如如果某个 node 的端口号是 6379，那么它与其它 nodes 通信的端口号是 16379。nodes 之间的通信采用特殊的二进制协议。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;机器规划&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1 2637(master)
127.0.0.1 2638(salve)
127.0.0.1 3637(master)
127.0.0.1 3638(salve)
127.0.0.1 4637(master)
127.0.0.1 4638(salve)
扩容：
127.0.0.1 5637(master)
127.0.0.1 5638(salve)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
命令&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;启动cluster&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis-cli --cluster create 127.0.0.1:2379 127.0.0.1:2378 127.0.0.1:3379 127.0.0.1:3378 127.0.0.1:4379 127.0.0.1:4378 --cluster-replicas 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;登录cluster&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis-cli -c -h 127.0.0.1 -p 2379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;查看cluster信息&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1:2378&amp;gt;cluster info
127.0.0.1:2378&amp;gt;cluster nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;扩容，作为master加入cluster，但不检测是否已有数据，且没有分配slot&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1:2378&amp;gt;cluster meet 127.0.0.1 5379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;扩容，把new加入到cluster，old是已存在cluster中的，但没分配slot&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis-cli --cluster add-node &amp;lt;new_ip&amp;gt;:&amp;lt;new_port&amp;gt; &amp;lt;old_ip&amp;gt;:&amp;lt;old_port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;分配slot，随便cluster中的一个node&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis-cli --cluster reshard 127.0.0.1:2379
#根据提示指定要被分配的node
#根据提示知道要分配的slot数
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;master分配了slot，添加salve&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. 通过slave登录cluster
2. 通过master node id复制数据
#redis-cli -c -h 127.0.0.1 -p 5378
127.0.0.1:5378&amp;gt;cluster replicate &amp;lt;master_node_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;下线&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis-cli --cluster reshard 127.0.0.1:2379
# 指定要重新分配的slot数量
# 指定接受slot的node id
# 指定source node id
# 输入done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;删除node&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1:2378&amp;gt;cluster forget &amp;lt;node_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
插槽（slot）
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. 插槽范围0～16383，会平均分配在master上
2. redis把key通过crc16算法计算出结果，然后和16384求余，找到对应的节点
如果超过1/2的master认为一个master宕机，此master就被下线
3. 如果master和对应salve都宕机，整个集群就挂掉
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;优点：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;可扩展：可扩展到1000多个节点
高可用：
master挂了，可以自动failover，用投票完成salve到master提升；
节点之间通过gossip协议完成交换信息
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;缺点：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gossip有消息的延迟和冗余，浪费一定到带宽
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
