当前位置: 首页 > news >正文

Redis第三讲

目录

三、Redis03

3.1 Redis持久化之RDB

3.1.1 什么是RDB

3.1.2 备份是如何执行的

3.1.3 Fork

3.1.4 RDB持久化流程

3.1.5 dump.rdb文件

3.1.6 配置rdb文件生成位置

3.1.7 如何触发RDB快照以及保持策略

3.2 Redis持久化之AOF

3.2.1 什么是AOF

3.2.2 AOF持久化流程

3.2.3 AOF默认不开启

3.2.4 AOF同步频率设置

3.2.5 AOF和RDB优先级

3.2.6 AOF启动/修复/恢复

3.2.7 Rewrite压缩

3.2.8 优势

3.2.9 劣势

3.2.10 AOF对比RDB

3.3 主从复制

3.3.1 什么是主从复制

3.3.2 主从复制的作用

3.3.3 主从复制(一台主机)

3.3.4 主从复制(三台主机)


三、Redis03

3.1 Redis持久化之RDB

Redis 提供了2个不同形式的持久化方式。

RDB(Redis DataBase)

AOF(Append Of File)

3.1.1 什么是RDB

指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里

3.1.2 备份是如何执行的

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件

整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。

RDB的缺点是最后一次持久化后的数据可能丢失

3.1.3 Fork

Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux中引入了“写时复制技术

一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

3.1.4 RDB持久化流程

 

3.1.5 dump.rdb文件

 在redis.conf中配置文件名称,默认为dump.rdb配置文件在软件安装目录bin下252 # The filename where to dump the DB253 dbfilename dump.rdb

3.1.6 配置rdb文件生成位置

rdb文件的保存路径,也可以修改。

默认为Redis启动时命令行所在的目录下,也就是软件安装的bin目录下

 #初始的默认安装目录262 # Note that you must specify a directory here, not a file name.263 dir ./
#修改后默认安装目录
# Note that you must specify a directory here, not a file name.
dir /myredis/

3.1.7 如何触发RDB快照以及保持策略

1、配置文件中默认的快照配置时间间隔

 198 # Save the DB on disk:199 #200 #   save <seconds> <changes>201 #202 #   Will save the DB if both the given number of seconds and the given203 #   number of write operations against the DB occurred.204 #205 #   In the example below the behaviour will be to save:206 #   after 900 sec (15 min) if at least 1 key changed207 #   after 300 sec (5 min) if at least 10 keys changed208 #   after 60 sec if at least 10000 keys changed209 #210 #   Note: you can disable saving completely by commenting out all "save" lines.211 #212 #   It is also possible to remove all the previously configured save213 #   points by adding a save directive with a single empty string argument214 #   like in the following example:215 #216 #   save ""217 218 save 900 1   #900秒中,至少有一个值发生更改,会将值存入快照219 save 300 10  #300秒中,至少有十个值发生更改,会将值存入快照220 save 60 10000格式:save   秒钟   写操作次数RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件,默认是1分钟内改了1万次,或5分钟内改了10次,或15分钟内改了1次。

注:如果想禁用RDB持久化的策略,只要不设置任何save指令,或者给save传入一个空字符串参数也可以

2、命令save和bgsave

 214 #   like in the following example:215 #216 #   save ""

save :save时只管保存,其它不管,全部阻塞。手动保存。不建议。

bgsave:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。

注:可以通过lastsave 命令获取最后一次成功执行快照的时间

 

3、flushall命令

 

执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义

4、rdb的备份过程

1、首先打开一个客户端(a),查询rdb文件的目录,本机目录是在/myredis目录下
[root@localhost myredis]# ls
​
2、再打开另外一个客户端(b)执行一个多次写入的命令mset  k1 v1 k2 v2 k3 v3 k4 v34 k5 v5 k6 v6 k7 v7 k8 v8 k9 v9 k10 v10 k11 v11
​
3、在save设置的时间内,再次查看rdb文件目录,看是否生成了rdb文件,
[root@localhost myredis]# ls
dump.rdb
​
4、生成了文件之后,复制一份文件(使用不同名字)
[root@localhost myredis]# cp dump.rdb dump.rdb1
​
5、使用客户端b,清空数据库,并关闭redis
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> 
[root@localhost bin]# systemctl stop redis
​
​
6、使用客户端a,删除rdb目录下已经为空的dump.rdb文件
再将dump.rdb1文件更名为dump.rdb文件
[root@localhost myredis]# rm -rf dump.rdb
[root@localhost myredis]# mv dump.rdb1 dump.rdb
​
7、再次开启redis,连接redis,发现之前存起来的数据还在
[root@localhost bin]# systemctl start redis
[root@localhost bin]# ./redis-cli -a lwl
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> keys *1) "k2"2) "k8"3) "k10"4) "k1"5) "k6"6) "k9"7) "k11"8) "k7"9) "k3"
10) "k5"
11) "k4"

5、stop-writes-on-bgsave-error

出现错误停止写231 # However if you have setup your proper monitoring of the Redis server232 # and persistence, you may want to disable this feature so that Redis will233 # continue to work as usual even if there are problems with disk,234 # permissions, and so forth.235 stop-writes-on-bgsave-error yes
​
当Redis无法写入磁盘的话(磁盘已满),直接关掉Redis的写操作。推荐yes.

6、rdbcompression 压缩文件

如果多个命令可以压缩的话,在快照中,会进行压缩237 # Compress string objects using LZF when dump .rdb databases?238 # For default that's set to 'yes' as it's almost always a win.239 # If you want to save some CPU in the saving child set it to 'no' but240 # the dataset will likely be bigger if you have compressible values or keys.241 rdbcompression yes
​
​
对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会进行压缩。
如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能。推荐yes.

7、 rdbchecksum 检查数据的完整性

如果是损坏的数据就不再添加到rdb文件中248 # RDB files created with checksum disabled have a checksum of zero that will249 # tell the loading code to skip the check.250 rdbchecksum yes
​
在存储快照后,还可以让redis来进行数据校验,如果数据已经损坏就不需要再进行持久化的操作,这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。推荐yes.

8、优势

1、适合大规模的数据恢复
2、对数据完整性和一致性要求不高更适合使用(可以丢失部分数据)
3、节省磁盘空间
4、恢复速度快

 

9、劣势

 Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。

3.2 Redis持久化之AOF

3.2.1 什么是AOF

AOF(Append Only File)以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,

换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

3.2.2 AOF持久化流程

(1)客户端的请求写命令会被append追加到AOF缓冲区内;
(2)AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中;
(3)AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量;
(4)Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的;

 

3.2.3 AOF默认不开启

修改之前
因为AOF的工作机制,决定了是比较消耗性能的,所以默认不开启693 # AOF and RDB persistence can be enabled at the same time without problems.694 # If the AOF is enabled on startup Redis will load the AOF, that is the file695 # with the better durability guarantees.696 #697 # Please check http://redis.io/topics/persistence for more information.698 699 appendonly no700 701 # The name of the append only file (default: "appendonly.aof")702 703 appendfilename "appendonly.aof"
​
可以在redis.conf中配置文件名称,默认为 appendonly.aof
AOF文件的保存路径,同RDB的路径一致。
修改后693 # AOF and RDB persistence can be enabled at the same time without problems.694 # If the AOF is enabled on startup Redis will load the AOF, that is the file695 # with the better durability guarantees.696 #697 # Please check http://redis.io/topics/persistence for more information.698 699 appendonly yes700 701 # The name of the append only file (default: "appendonly.aof")702 703 appendfilename "appendonly.aof"因为aof文件默认路径是和rdb文件一致的,这里即使不修改文件,文件也会存到/myredis下面

3.2.4 AOF同步频率设置

appendfsync always    始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好
appendfsync everysec  每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。
appendfsync no        redis不主动进行同步,把同步时机交给操作系统。

3.2.5 AOF和RDB优先级

AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)

3.2.6 AOF启动/修复/恢复

AOF的备份机制和性能虽然和RDB不同, 但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载。
​
正常恢复①修改默认的appendonly no,改为yes②将有数据的aof文件复制一份保存到对应目录③恢复:重启redis然后重新加载异常恢复①修改默认的appendonly no,改为yes②如遇到AOF文件损坏,通过命令安装redis的目录/redis-check-aof  --fix  文件的位置/appendonly.aof对于本机,命令如下:/usr/lwl/soft/redis/bin/redis-check-aof --fix /myredis/appendonly.aof③备份被写坏的AOF文件④恢复:重启redis,然后重新加载异常恢复案例:修改默认的appendonly no,改为yes执行两条写命令,等待写入aof中之后,手动破坏appendonly.aof文件,可以随便加上两行关闭redis执行修复命令./redis-check-aof --fix /myredis/appendonly.aof开启redis,查看数据

3.2.7 Rewrite压缩

1、什么是Rewrite

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制, 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩, 只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof

2、如何实现重写

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),redis4.0版本后的重写,是指上就是把rdb 的快照,以二级制的形式附在新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。

对于 no-appendfsync-on-rewrite:
​如果 no-appendfsync-on-rewrite=yes ,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)如果 no-appendfsync-on-rewrite=no,  还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)

3、重写的触发机制

重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定Redis要满足一定条件才会进行重写。

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
​
auto-aof-rewrite-percentage:设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的2倍时触发)
auto-aof-rewrite-min-size:设置重写的基准值,最小文件64MB。达到这个值开始重写。
​
在配置文件中也可以进行配置:第770和771行770 auto-aof-rewrite-percentage 100771 auto-aof-rewrite-min-size 64mb

举例:

例如:文件达到70MB开始重写,降到50MB,下次什么时候开始重写?100MB
​系统载入时或者上次重写完毕时,Redis会记录此时AOF大小,设为base_size,如果Redis的AOF当前大小>= base_size + base_size*100% (默认)且当前大小>=64mb(默认)的情况下,Redis会对AOF进行重写。 

4、重写流程

(1)bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。

(2)主进程fork出子进程执行重写操作,保证主进程不会阻塞。

(3)子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。

(4)1).子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。2).主进程把aof_rewrite_buf中的数据写入到新的AOF文件。

(5)使用新的AOF文件覆盖旧的AOF文件,完成AOF重写。

 

3.2.8 优势

备份机制更稳健,丢失数据概率更低。

可读的日志文本,通过操作AOF稳健,可以处理误操作。

 

3.2.9 劣势

  • 比起RDB占用更多的磁盘空间。

  • 恢复备份速度要慢。

  • 每次读写都同步的话,有一定的性能压力。

  • 存在个别Bug,造成恢复不能。

3.2.10 AOF对比RDB

1、AOF和RDB用哪个好?

官方推荐两个都启用。
如果对数据不敏感,可以选单独用RDB。
不建议单独用 AOF,因为可能会出现Bug。
如果只是做纯内存缓存,可以都不用。

2、官方建议

•   RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
•   AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾. 
•  Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
同时开启两种持久化方式
•   在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据, 因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
•   RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢? 
•   建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份), 快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。
•   性能建议
推荐使用:
因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。如果使用AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。
代价,一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。
只要硬盘许可,应该尽量减少AOF  rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。
默认超过原大小100%大小时重写可以改到适当的数值。

3.3 主从复制

3.3.1 什么是主从复制

主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

3.3.2 主从复制的作用

读写分离,性能扩展(主机主要负责写操作,从机负责读操作)

容灾快速恢复(主机坏掉,从机可以变成主机)

 

3.3.3 主从复制(一台主机)

1、在一台电脑上配置主从复制

配置第一个文件(主机6379的配置文件)
注意:不能设置密码
① Appendonly 改为no
② 开启daemonize       yes
③ Pid文件名字pidfile  /var/run/redis_6379.pid
④指定端口port
⑤Log文件名字
⑥dump.rdb名字dbfilename
​
注如果要在多台电脑上配置主从复制,那么还有两个配置一定要配置
protected-mode  改为no
bind            0.0.0.0
​
​
修改前66 # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES67 # JUST COMMENT THE FOLLOWING LINE.68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~69 # bind 127.0.0.1
​84 # By default protected mode is enabled. You should disable it only if85 # you are sure you want clients from other hosts to connect to Redis86 # even if no authentication is configured, nor a specific set of interfaces87 # are explicitly listed using the "bind" directive.88 protected-mode yes
配置从机6380的配置文件
include      /usr/lwl/soft/redis/bin/redis6379.conf  #提取的公共文件
pidfile      /var/run/redis_6380.pid  #设置pidfile
port         6380          #设置端口号
dbfilename   dump6380.rdb    #设置dbfilename
配置从机6381的配置文件
include      /usr/lwl/soft/redis/bin/redis6379.conf  #提取的公共文件
pidfile      /var/run/redis_6381.pid  #设置pidfile
port         6381        #设置端口号
dbfilename   dump6381.rdb    #设置dbfilename

2、启动三台redis服务器

开启6379:/usr/lwl/soft/redis/bin/redis-server /usr/lwl/soft/redis/bin/redis6379.conf
开启6380:/usr/lwl/soft/redis/bin/redis-server /usr/lwl/soft/redis/bin/redis6380.conf 
开启6381:/usr/lwl/soft/redis/bin/redis-server /usr/lwl/soft/redis/bin/redis6381.conf

因为当前处于/usr/lwl/soft/redis/bin

所以可以直接执行

[root@localhost bin]# ./redis-server ./redis6379.conf
7505:C 16 Feb 2023 21:12:25.333 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7505:C 16 Feb 2023 21:12:25.333 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=7505, just started
7505:C 16 Feb 2023 21:12:25.333 # Configuration loaded
[root@localhost bin]# ./redis-server ./redis6380.conf
7510:C 16 Feb 2023 21:12:32.324 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7510:C 16 Feb 2023 21:12:32.324 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=7510, just started
7510:C 16 Feb 2023 21:12:32.324 # Configuration loaded
[root@localhost bin]# ./redis-server ./redis6381.conf
7515:C 16 Feb 2023 21:12:37.860 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7515:C 16 Feb 2023 21:12:37.860 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=7515, just started
7515:C 16 Feb 2023 21:12:37.860 # Configuration loaded
[root@localhost bin]# ps -ef|grep redis
root       7506      1  0 21:12 ?        00:00:00 ./redis-server *:6379
root       7511      1  0 21:12 ?        00:00:00 ./redis-server *:6380
root       7516      1  0 21:12 ?        00:00:00 ./redis-server *:6381
root       7522   7046  0 21:12 pts/0    00:00:00 grep --color=auto redis

3、查看运行状态

[root@localhost bin]# ./redis-cli -p 6379  #连接端口号为6379的redis
127.0.0.1:6379> info replication  #查看运行状态
# Replication
role:master          #代表主机
connected_slaves:0   #连接的从机数
master_replid:714f8d4a5145aa3363c7abde64c643a47863847a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
​
​
[root@localhost bin]# ./redis-cli -p 6380 #连接端口号为6381的redis
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_replid:f7076668ac261799ef9c836b752c964d94c5a15a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
​
​
[root@localhost bin]# ./redis-cli -p 6381  #连接端口号为6381的redis
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_replid:86ecc02f0bcff05c1cd0233ff369088ea75751fe
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

目前三台机器都是主机

4、配置从机

配置从机需要在要当从机的连接时中执行命令
slaveof  <ip>  <port>  成为某个实例的从服务器
​
比如:6380要作为6379的从机
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave      #从机
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:4170da4a1e6e9c098a641d94689da65e7fa63fd6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
​
将6381设置为从机也是相同的操作
2.在主机上写,在从机上可以读取数据
127.0.0.1:6379> set name lwl
OK
127.0.0.1:6380> get name
"lwl"
127.0.0.1:6381> get name
"lwl"
​
3.主机挂掉(shutdown),重启就行,一切如初
主从关系不变
​
4.从机如果重启需要重新配置为从机:slaveof 127.0.0.1 6379

5、复制原理

•  Slave启动成功连接到master后会发送一个sync命令
•  Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
•  全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
•   增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
•  但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

 

6、薪火相传 从这里开始就是使用的三台主机

上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。

用 slaveof  <ip><port>
中途变更转向:会清除之前的数据,重新建立拷贝最新的
风险是一旦某个slave宕机,后面的slave都没法备份
主机挂了,从机还是从机,无法写数据了

 

ip地址为192.168.111.127的主机:
127.0.0.1:6379> info replication
# Replication
role:master                #主机
connected_slaves:1         #连接的从机数
slave0:ip=192.168.111.128,port=6379,state=online,offset=2548,lag=0 #从机信息
master_replid:4f3e1b8c80f9af3fe58d4549eaea778d0e68ad0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2548
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2548
​
ip地址为192.168.111.128的主机:
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.111.127       #主机的ip地址
master_port:6379
master_link_status:up              #主机状态,up代表正在运行
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:2632
slave_priority:100
slave_read_only:1
connected_slaves:1                  #从机连接数
slave0:ip=192.168.111.129,port=6379,state=online,offset=2632,lag=1
master_replid:4f3e1b8c80f9af3fe58d4549eaea778d0e68ad0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2632
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2632
​
ip地址为192.168.111.129的主机:
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.111.128         #主机ip地址
master_port:6379
master_link_status:up               #主机连接状态
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:2506
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:4f3e1b8c80f9af3fe58d4549eaea778d0e68ad0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2506
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2493
repl_backlog_histlen:14

7、反客为主(手动版选择主机)

当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。
用 slaveof  no one  将从机变为主机。

 

8、哨兵模式(自动版选择主机)

反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

 

配置哨兵文件

1.创建文件在/usr/lwl/soft/redis/bin/myredis目录下创建这个文件
​
2、配置文件内容sentinel monitor mymaster 127.0.0.1 6379 1其中mymaster为监控对象起的服务器名称,127.0.0.1 代表监视的ip地址1 为至少有多少个哨兵同意迁移的数量。[root@localhost ~]# cd /myredis/
[root@localhost myredis]# ls
appendonly.aof  dump6380.rdb  dump6381.rdb  dump.rdb
[root@localhost myredis]# touch sentinel.conf
[root@localhost myredis]# vim sentinel.conf
​
3、执行哨兵文件
[root@localhost myredis]# cd /usr/lwl/soft/redis/bin
[root@localhost bin]# ls
redis6379.conf  redis6380.conf  redis6381.conf  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis.conf  redis-sentinel  redis-server
[root@localhost bin]# ./redis-sentinel /myredis/sentinel.conf 
7171:X 17 Feb 2023 16:17:04.583 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7171:X 17 Feb 2023 16:17:04.583 # Redis version=5.0.14, bits=64, commit=00000000, modified=0, pid=7171, just started
7171:X 17 Feb 2023 16:17:04.583 # Configuration loaded
7171:X 17 Feb 2023 16:17:04.584 * Increased maximum number of open files to 10032 (it was originally set to 1024)._._                                                  _.-``__ ''-._                                             _.-``    `.  `_.  ''-._           Redis 5.0.14 (00000000/0) 64 bit.-`` .-```.  ```\/    _.,_ ''-._                                   (    '      ,       .-`  | `,    )     Running in sentinel mode|`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379|    `-._   `._    /     _.-'    |     PID: 7171`-._    `-._  `-./  _.-'    _.-'                                   |`-._`-._    `-.__.-'    _.-'_.-'|                                  |    `-._`-._        _.-'_.-'    |           http://redis.io        `-._    `-._`-.__.-'_.-'    _.-'                                   |`-._`-._    `-.__.-'    _.-'_.-'|                                  |    `-._`-._        _.-'_.-'    |                                  `-._    `-._`-.__.-'_.-'    _.-'                                   `-._    `-.__.-'    _.-'                                       `-._        _.-'                                           `-.__.-'                                               
​
7171:X 17 Feb 2023 16:17:04.585 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
7171:X 17 Feb 2023 16:17:04.586 # Sentinel ID is 0b54be235fccf50143826a827059ff0fd775db96
7171:X 17 Feb 2023 16:17:04.586 # +monitor master mymaster 127.0.0.1 6379 quorum 1
7171:X 17 Feb 2023 16:17:04.587 * +slave slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:17:04.587 * +slave slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
​
让主机127shutdown之后
稍等一会
7171:X 17 Feb 2023 16:17:04.586 # +monitor master mymaster 127.0.0.1 6379 quorum 1
7171:X 17 Feb 2023 16:17:04.587 * +slave slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:17:04.587 * +slave slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.204 # +sdown master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.204 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
7171:X 17 Feb 2023 16:18:41.204 # +new-epoch 1
7171:X 17 Feb 2023 16:18:41.204 # +try-failover master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.204 # +vote-for-leader 0b54be235fccf50143826a827059ff0fd775db96 1
7171:X 17 Feb 2023 16:18:41.204 # +elected-leader master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.204 # +failover-state-select-slave master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.308 # +selected-slave slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.308 * +failover-state-send-slaveof-noone slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:41.408 * +failover-state-wait-promotion slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:42.086 # +promoted-slave slave 192.168.111.129:6379 192.168.111.129 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:42.086 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:42.152 * +slave-reconf-sent slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:43.122 * +slave-reconf-inprog slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:43.122 * +slave-reconf-done slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:43.176 # +failover-end master mymaster 127.0.0.1 6379
7171:X 17 Feb 2023 16:18:43.176 # +switch-master mymaster 127.0.0.1 6379 192.168.111.129 6379
7171:X 17 Feb 2023 16:18:43.177 * +slave slave 192.168.111.128:6379 192.168.111.128 6379 @ mymaster 192.168.111.129 6379
7171:X 17 Feb 2023 16:18:43.177 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 192.168.111.129 6379
7171:X 17 Feb 2023 16:19:13.239 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 192.168.111.129 6379
最后选举出来129为主机

可以让主机6379 shutdown,然后观察哨兵选举

当主机挂掉,从机选举中产生新的主机
(大概10秒左右可以看到哨兵窗口日志,切换了新的主机)
哪个从机会被选举为主机呢?根据优先级别:replica-priority 
原主机重启后会变为从机。
​
选举主机时,考虑的因素有以下几个
优先级在redis.conf中默认:replica-priority  100,值越小优先级越高
偏移量是指获得原主机数据最全的
每个redis实例启动后都会随机生成一个40位的runid

 

3.3.4 主从复制(三台主机)

先使用VMware进行克隆三台虚拟机

ip地址192.168.111.127192.168.111.128192.168.111.129
​
2、配置对应redis.conf文件
① requirepass要注释掉,不能设置密码
② Appendonly=no
③ daemonize=yes
④ pidfile  /var/run/redis_6379.pid  #指定Pid文件名字
⑤ 指定端口port
⑥ Log文件名字
⑦ dump.rdb名字dbfilename
​
注如果要在多台电脑上配置主从复制,那么还有两个配置一定要配置
⑧ protected-mode  no
⑨ bind 0.0.0.0
​
​
修改前66 # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES67 # JUST COMMENT THE FOLLOWING LINE.68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~69 # bind 127.0.0.1
​84 # By default protected mode is enabled. You should disable it only if85 # you are sure you want clients from other hosts to connect to Redis86 # even if no authentication is configured, nor a specific set of interfaces87 # are explicitly listed using the "bind" directive.88 protected-mode yes
​
3、三台主机都启动redis,并进行连接,可以是同一个端口号
[root@localhost bin]# ./redis-cli 
127.0.0.1:6379> ping
PONG
​
4、让128和129都成为127的从机
127.0.0.1:6379> slaveof 192.168.111.127 6379
OK
​
5、查看127的运行状态信息
127.0.0.1:6379> info replication
# Replication
role:master                     #主机
connected_slaves:2              #两台从机
slave0:ip=192.168.111.128,port=6379,state=online,offset=1078,lag=0
slave1:ip=192.168.111.129,port=6379,state=online,offset=1078,lag=0
master_replid:4f3e1b8c80f9af3fe58d4549eaea778d0e68ad0c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1078
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1078

相关文章:

Redis第三讲

目录 三、Redis03 3.1 Redis持久化之RDB 3.1.1 什么是RDB 3.1.2 备份是如何执行的 3.1.3 Fork 3.1.4 RDB持久化流程 3.1.5 dump.rdb文件 3.1.6 配置rdb文件生成位置 3.1.7 如何触发RDB快照以及保持策略 3.2 Redis持久化之AOF 3.2.1 什么是AOF 3.2.2 AOF持久化流程 …...

JAVA线程池的使用

一、池化思想和JAVA线程池 池化是很重要的思想&#xff1b;池化的好处是提供缓冲和统一的管理。这个笔者在本人的数据库连接池的博客中已经提到过了&#xff08;JAVA常用数据库连接池_王者之路001的博客-CSDN博客 &#xff09;。 线程池是另一种池化思想的运用&#xff0c;把…...

力扣56.合并区间

文章目录力扣56.合并区间题目描述排序合并力扣56.合并区间 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…...

代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||

24.两两交换链表中的节点 文章链接&#xff1a;代码随想录 (programmercarl.com) 思路&#xff1a; &#xff08;1&#xff09;首先如果要处理相邻两个节点的话&#xff0c;一定需要操作两个节点的前一个节点才可以&#xff0c;因此&#xff0c;本题需要设定一个虚拟头节点 …...

我应该在我的博客上写什么? 介绍如何撰写初学者容易担心的文章

我想有很多人开了博客&#xff0c;但想不起来写作&#xff0c;无法取得进展。 博客的主题和文章的内容不会仅仅通过写你想做的事情来工作。 重要的是要了解用户想要阅读的内容以及人们可能收集的内容&#xff0c;并将其与您想要编写的内容很好地匹配。 这一次&#xff0c;我…...

嵌入式C语言设计模式 --- 外观模式

1 - 什么是外观模式? 外观模式(Facade Pattern),是一种比较简单的结构型模式,它存在的目的,也是为了简单。 外观模式隐藏了一系列接口的复杂性,旨在为外部客户端提供一个更高层次且统一简单的接口,简化了客户端调用某些模块的一系列操作。 外观模式应该是软件工程师…...

若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】

昨天情人节一(&#xffe3;︶&#xffe3;*)) 送给赛利亚一((*&#xffe3;3&#xffe3;)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 修改后的页面&#xff1a; 干干净净贼舒服一Ψ(&#xffe3;∀&#xffe3;)Ψ——Ψ(&#xffe3;∀&#x…...

SCI论文写作神器集合 —— 超级实用

特此声明&#xff1a; 本文拷贝多处别人的内容&#xff0c;并给出具体的链接 本文所提到的软件都为博主在文章撰写过程中发掘的比较实用的工具&#xff0c;旨在帮助小伙伴们更快更有效率的完成文章发表&#xff0c;如果其他好用的工具&#xff0c;欢迎各位交流~~ 一、文献搜索神…...

MAC 系统安装多版本 JDK 并任意切换

1、背景 在进行 Java 开发的过程中&#xff0c;我们可能需要使用不同版本的 JDK。例如&#xff1a;一些旧的 Java 应用程序只能在旧版本的 JDK 上运行&#xff0c;而一些新的 Java 应用程序需要较新的 JDK 才能运行。 在 MAC 系统上&#xff0c;如何安装多个版本的 JDK 并配置…...

配置 Smart Link 接口时需注意的互斥命令

配置 Smart Link 接口时需注意的互斥命令 一、接口加入Smart Link组功能与以下功能互斥一、接口加入Smart Link组功能与以下功能互斥 注&#xff1a;当接口已经加入Smart Link组&#xff0c;则不能再配置以下功能&#xff1b;反之&#xff0c;当接口已经配置以下功能&#xff…...

QT的下载和安装

这里介绍的是QT官方方式下载&#xff0c;每次都让我很糊涂&#xff0c;就记载一下。先是下载QT online installerhttps://www.qt.io/download 在下方有Go Open Sourcehttps://www.qt.io/download-open-source 在下方有Download the Qt Online installerhttps://www.qt.io/downl…...

nacos配置中心与服务注册中心

文章目录 目录 文章目录 前言 一、服务注册与发现中心 二、配置中心 总结 前言 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring Cloud Alibaba 组件之一&#xff0c;负责服务注册发现和服务配置. [服务治理的作用和微服务配置管理] Na…...

UE4 手把手教你做插件(1) 从代码引用插件

0&#xff0c;前言 我看的是 技术宅阿棍儿 的视频&#xff0c;B站有。 系列视频&#xff1a;从代码引用插件_哔哩哔哩_bilibili 看不懂&#xff0c;只能边查资料边看&#xff0c;讲的顺序有点乱 1&#xff0c;根据视频提示创建第三方插件 注意&#xff1a;如果只有空白插件的情…...

【Mybatis源码解析】一级缓存和二级缓存源码解析

文章目录缓存使用缓存源码测试代码上一篇《【Mybatis源码解析】mapper实例化及执行流程源码分析》&#xff0c;主要讲解了Mybatis的基本原理一级执行的流程&#xff0c;这一章来讲一下Mybatis的两个缓存&#xff1a;一级缓存和二级缓存。 因为网上大部分都是使用xml配置的方式…...

你知道MES实施的要点吗?

随着国家行动纲领&#xff1a;中国制造2025&#xff08;智能制造&#xff09;的发布&#xff0c;MES系统在制造业的工厂中所占比重越来越大&#xff0c;越来越多的工厂选择使用MES完成工厂的信息化、数字化、智能化生产。伴随着企业对MES的需求不断增大&#xff0c;生产MES的厂…...

告诉你为什么为什么 SELECT COUNT(*) FROM table 在 InnoDB 引擎中比 MyISAM引擎中的速度慢

统计一张表的总数量&#xff0c;是我们开发中常有的业务需求&#xff0c;通常情况下&#xff0c;我们都是使用 select count(*) from table SQL 语句来完成。随着业务数据的增加&#xff0c;你会发现这条语句执行的速度越来越慢&#xff0c;为什么它会变慢呢&#xff1f; 为什…...

Redis 命令和Redis key键

Redis 命令 Redis 命令用于在 Redis 服务器上执行一些操作&#xff0c;而命令运行的方式是通过客户端命令行来执行的&#xff0c;这种方式也被称为“命令行模式”。因此想要在 Redis 服务器上运行命令&#xff0c;您首先需要开启一个 Redis 客户端。操作方法如下&#xff1a; …...

如何入侵服务器

根据中华人民共和国刑法&#xff1a; 第二百八十六条违反国家规定&#xff0c;对计算机信息系统功能进行删除、修改、增加、干扰&#xff0c;造成计算机信息系统不能正常运行&#xff0c;后果严重的&#xff0c;处五年以下有期徒刑或者拘役&#xff1b;后果特别严重的&#xff…...

在Windows10上安装虚拟机---VMware 17 Pro下载与安装

在Windows10上安装虚拟机---VMware下载与安装0 前言1 下载VMware 17 pro2 安装VMware 17 Pro3. 打开Vmware0 前言 电脑原生系统&#xff1a;Windows10虚拟机软件&#xff1a;VMware 17 pro准备好安装虚拟机的文件夹路径 1 下载VMware 17 pro 下载网址&#xff1a;VMware 官网…...

生命周期函数、组件

1. 生命周期函数 beforeCreate &#xff1a; 无法通过 vm 访问data 中的数据、methods 中的方法created &#xff1a;可以访问 vm 中的 data 的数据&#xff0c; methods 中的方法beforeMount&#xff1a;为经 Vue 编译的 dommounted&#xff1a;经过 vue 编译的 dom &#x…...

蓝桥杯 stm32 PWM 测量频率

本文代码使用 HAL 库。 文章目录 前言一、PWM 原理图:二、CubeMX 创建工程:三、PWM 单路测频:四、详细代码:1. 获取 CNT函数。2. 设置CNT为 0 函数3. 开启TIM2_CH1的输入捕获中断函数4. TIM 回调函数5. 在 LCD 上显示 R40 和 R39 的频率。总结前言 一、PWM 原理图: 参考…...

Docker CPU 资源控制

01-本章背景知识 在生产环境里运行服务的一个主要问题是如何公平有效的进行资源分配。 1、Docker 容器使用核心操作系统的 Cgroups 管理容器的 CPU资源分配。 2、Docker 容器资源竞争时&#xff0c;默认使用简单均分&#xff08;CFS&#xff09;算法。 3、Docker 容器也可以根…...

小红书数据平台:笔记爆文率提升的三大秘诀公式!

导语 对于小红书商家 / 博主来说&#xff0c;写出爆文就像买彩票&#xff0c;根本不能预知哪一篇会爆。2023年&#xff0c;小红书哪些内容会脱颖而出呢&#xff1f;我们又该如何把握热点趋势&#xff0c;实现优质内容转化出爆文~ 美妆作为小红书的长红赛道&#xff0c;本文我…...

Spring MVC 之Tomcat启动流程

从web.xml说起在开始 Spring MVC 的分析之前&#xff0c;先来聊一聊 Java 初学者接触的最多的 Java Web 基础。还记得我的第一个 Web 工程是由 Servlet、Velocity 和 Filter 来完成的&#xff0c;那时几乎所有人都是根据 Servlet、JSP 和 Filter 来编写自己的第一个 Hello Worl…...

大疆车载更新产品矩阵,覆盖从主动安全到城区领航的全场景

新年智驾供应商的攻势&#xff0c;也像车企一样猛烈。大疆车载近期趁着官网更新&#xff0c;对外公布了梳理后的智驾方案序列&#xff0c;覆盖8大功能产品&#xff1a;主动安全、行车辅助、泊车辅助、记忆泊车、记忆行车、跨层记忆泊车、领航高速、领航城区。需要关注的是&…...

总结Anisble中的任务执行控制并练习

文章目录一、循环1.简单循环2.循环散列或字典列表二、条件三、触发器四、处理失败任务1.ignore_errors2.force_handlers3.changed_when4.failed_when5.block五、 练习建立大小为1500M名为/dev/sdb1的设备利用ansible循环安装且开启vsftpd&#xff0c;apache&#xff0c;dns&…...

PMP好考吗,有多大的价值?

关于PMP考试题型及考试内容&#xff0c;PMP考试共200道单选题&#xff0c;其中25道题不计分&#xff0c;会被随机抽查&#xff0c;答对106道题以上通过考试&#xff0c;参考比例106/175&#xff0c;60.57%估计答对&#xff08;10625&#xff09;道题及上即可通过&#xff0c;参…...

http常用状态码(204,304, 404, 504,502)含义

网络状态码含义&#xff0c;常用&#xff08;204&#xff0c;304, 404, 504&#xff0c;502&#xff09; 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务不可用 常见HTTP状态码大全 1xx&#xff08;临时响应&#xff09; 表示临时响应并需要请求者继…...

记录锁,间隙锁,插入意向锁,临键锁兼容关系

插入意向锁是什么&#xff1f; 注意&#xff01;插入意向锁名字里虽然有意向锁这三个字&#xff0c;但是它并不是意向锁&#xff0c;它属于行级锁&#xff0c;是一种特殊的间隙锁。 在MySQL的官方文档中有以下重要描述&#xff1a; An Insert intention lock is a type of gap…...

map相关接口(map接口、HashMap、LinkedHashMap、TreeMap)

Java知识点总结&#xff1a;想看的可以从这里进入 目录8.3、map结构8.3.1、 map接口8.3.2、HashMap8.3.3、LinkedHashMap8.3.4、TreeMap8.3、map结构 8.3.1、 map接口 map的集合是以键值对的形式存在的 (key-value)&#xff0c;每个键只能对应一个值&#xff0c;通常通过键去…...

WordPress网站被恶意登录/百度引流免费推广怎么做

ThinkPHP的模板主题机制&#xff0c;如果只是在PC&#xff0c;只要需修改 DEFAULT_THEME &#xff08;新版模板主题默认是空&#xff0c;表示不启用模板主题功能&#xff09;配置项就可以方便的实现多模板主题切换。但对于移动端和PC端&#xff0c;也许你会设计完全不同的主题风…...

做苗木网站哪家做得好/长春做网站推荐选吉网传媒好

洛谷P3018 [USACO11MAR]树装饰Tree Decoration树形DP 因为要求最小&#xff0c;我们就贪心地用每个子树中的最小cost来支付就行了 1 #include <bits/stdc.h>2 #define For(i, j, k) for(int ij; i<k; i)3 #define Dow(i, j, k) for(int ij; i>k; i--)4 #define LL…...

西安公司网站设计费用/百度站长工具验证

其实&#xff0c;Redis定义了丰富的原语命令&#xff0c;可以直接与Redis服务器交互。 但是&#xff0c;实际应用中&#xff0c;我们不太会直接使用这些原语命令&#xff0c;Redis提供了很多客户端&#xff0c;大多情况下我们是通过各式各样的客户端来操作Redis。 但是&#…...

店铺推广引流/长沙seo推广

主要有6步&#xff1a; 第 1 步 计算出各活动所需的成本&#xff08;包括应急储备&#xff09;&#xff1b; 第 2 步 汇总得出工作包的成本&#xff08;包括应急储备&#xff09;&#xff1b; 第 3 步 汇总各个工作包&#xff0c;得到控制账户的成本&#xff08;包括应急储备&a…...

郑州优化网站公司/百度快照关键词推广

HashSet的特征是&#xff0c;集合中的元素无重复&#xff0c;且无序排列。 package com.atguigu.java1;import java.util.Collection; import java.util.HashSet; import java.util.Iterator;/*** hashSet是set的常用接口&#xff0c;* 不能存放重复的元素&#xff0c;且其中多…...

请人做网站需要多少钱/百度链接提交入口

如果在控制台程序启动类末尾写了: Console.ReadLine(); 则在linux后台运行会抛出异常: at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)at Interop.CheckIo(Int64 result, String path, Boolean isDire…...