Redis(Remote dictionary server) 是一个开源的基于内存的数据存储系统,可以用作数据库、缓存、消息队列等经典场景,也是目前最热门的 NoSQL 数据库之一。传统的 SQL 数据库由于应用访问量越来越大和磁盘 IO 导致数据库瓶颈越来越明显,此时基于内存的数据存储系统应运而生。
Redis 支持五种基本数据类型,包括:
字符串 String、列表 list、集合 set、有序集合 sortedSet、哈希 hash
Redis 支持五种高级数据类型,包括:
消息队列 Stream、地理空间 Geospatial、HyperLogLog、位图 Bitmap、位域 Bitfield
Redis 有三种主要使用方式,包括:
cli 命令行、api 应用程序接口、gui 图形界面
Redis 的优势主要包括:
个人不太建议在 Windows 环境下使用 Redis,因为性能和消耗存在显著差异。若确实需要,以下是一些相关资料
redis/jedis: Redis Java client (github.com)
Jedis: Jedis 是 Redis 官方首选的 Java 客户端开发包 (gitee.com)
Redis 服务端名为 redis-server,Redis 客户端为 redis-cli
Redis GUI 图形化工具:another redis desktop manager
实际上,我们在使用 Redis 的过程中,通常是交由项目自行操作,一般情况下我们不进行手动操作,所以以下的介绍仅供了解。项目快速集成内容在一小时入门Redis(下)
Redis 中的数据是以键值对的形式存储的,所以我们在使用的时候需要为我们存储的数据指定一个键,而数据当作值,键和值使用空格分隔。
set key value
eg. set name admin
当我们按照 name 为键,admin 为值进行设置时,Redis 存储成功提示 OK,就为一次操作结束。
127.0.0.1:6379> set name admin
OK
127.0.0.1:6379> get name
admin
需要注意的是 Redis 的键区分大小写,若我们继续进行键值对的存储,就可以看到以下场景:
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> get Name
user
127.0.0.1:6379> get name
user
Redis 中默认都是使用二进制字符串来存储数据的,这就意味着我们可以将许多数据存储在 Redis 中,例如数字、布尔、序列化的对象等。
我们也可以使用命令来删除键值对:
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> del Name
1
127.0.0.1:6379> get Name
(nil)
在不清楚键值对是否存在的情况下,可以使用命令来进行查询:
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> exists Name
1
127.0.0.1:6379> exists name
1
我们可以使用命令来查看库中目前存储的所有键,keys * 命令后可以添加字符表示查找以某些字符结尾的键,但要注意,Redis 中的所有数据都以键值对进行存储,当存储内容过多时,使用该命令查询会显著的降低性能或导致数据库崩溃,请谨慎使用。
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
Name
age
127.0.0.1:6379> keys *me
Name
同样的 ,我们可以使用命令来一键删除所有的键,一键删除的命令都是非常危险的。
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> exists Name
0
在前文中提到,Redis 中的键值对都是以二进制字符串的形式进行存储的,所以默认情况不支持中文。但 Redis 存储的中文被转化为二进制后仍然可以读取,需要在 Redis 客户端启动时添加参数
redis-cli --raw
该参数含义为启动 Redis 时以原始的参数形式显示内容,在很多情况下 Redis 的工具都会默认的显示原始内容,但我们在学习时需要注意。
和 Linux 一样,我们可以使用命令来清理当前页面的内容。
127.0.0.1:6379> clear
-------------------------------- Redis 会清空页面显示,变为刚打开时的窗口
127.0.0.1:6379>
Redis 中可以使用命令来查看一个键的过期时间。
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> ttl Name
-1
当输出的参数值为 -1 时,代表该键没有设置过期时间(以秒为单位,下文中不再体现)。我们可以通过命令来演示该场景。
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> ttl Name
-1
127.0.0.1:6379> expire name 100
1
当我们使用 expire 给 Name 键设置 100 秒的过期时间时,这个时间即刻生效。我们再使用 ttl 命令查询 Name 键的过期时间,显示的内容就是该键的剩余过期时间。
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> ttl Name
-1
127.0.0.1:6379> expire name 100
1
127.0.0.1:6379> ttl Name
98
当时间抵达过期时间时,我们再进行查询
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> ttl Name
-1
127.0.0.1:6379> expire name 10
1
127.0.0.1:6379> ttl Name
8
..........
127.0.0.1:6379> ttl Name
1
127.0.0.1:6379> ttl Name
-2
当 ttl 查询结果为 -2 时,表示这个键已经过期,我们再使用 get 命令进行查询时则会显示空。
127.0.0.1:6379> set Name user
OK
127.0.0.1:6379> ttl Name
-1
127.0.0.1:6379> expire name 10
1
..........
127.0.0.1:6379> ttl Name
1
127.0.0.1:6379> ttl Name
-2
127.0.0.1:6379> get Name
(此处显示为空,没有输出)
我们可以在键值对创建时就给键设置过期时间,设置格式为 -> setex 键名称 过期时间 值。
127.0.0.1:6379> setex Name 5 user
OK
127.0.0.1:6379> ttl Name
4
我们在使用的过程中常常会出现同一个键被覆盖设置的问题,我们可以使用以下命令解决。
127.0.0.1:6379> setnx Name user
1
127.0.0.1:6379> setnx Name uuuuuser
0
127.0.0.1:6379> get Name
"user"
当使用 setnx 命令设置键值对时,提示信息为 1 则表示此时没有相同的键,Name 键被创建。当提示信息为 0 时,表示 Name 键已经被占用,这个时候不再进行任何操作.
list 一般用来存储和操作一组有顺序的数据,和数组的概念比较接近,可以使用命令在列表前后添加内容。
127.0.0.1:6379> lpush letter a
1
127.0.0.1:6379> rpush letter b
2
此时代表我们将 a 字符添加到了 letter 键的前面,使用 rpush 命令将 b 添加到了 letter 键的后面,显示的数字表示列表中存储元素的个数。可以将两个命令记为左 push(left push) 和右 push(right push),下文中还有相似参数不再进行赘述。
我们可以使用命令来查询列表中的内容。
127.0.0.1:6379> lpush letter a
1
127.0.0.1:6379> rpush letter b
2
127.0.0.1:6379> lrange letter 0 -1
a
b
lrange 命令的两个参数的含义为:第一个参数表示从哪一个下标开始查询,以 0 做开始。第二个参数表示查询结束的下标,-1 代表全部查询。
lpush 和 rpush 可以同时添加多个参数。
127.0.0.1:6379> lpush letter a
1
127.0.0.1:6379> rpush letter b
2
127.0.0.1:6379> lpush letter c d e f
6
127.0.0.1:6379> rpush letter g h
8
127.0.0.1:6379> lrange letter 0 -1
f
e
d
c
a
b
g
h
注意,lpush 命令的添加顺序是以顺序逐个进行插入,与数据结构中栈的结构相似,插入的结果如上文所示。
同样的,我们可以使用命令来从头或尾删除元素。
127.0.0.1:6379> lpush letter a
1
127.0.0.1:6379> rpush letter b
2
127.0.0.1:6379> lpush letter c d e f
6
127.0.0.1:6379> rpush letter g h
8
127.0.0.1:6379> lrange letter 0 -1
f
e
d
c
a
b
g
h
127.0.0.1:6379> rpop letter
h
127.0.0.1:6379> lrange letter 0 -1
f
e
d
c
a
b
g
127.0.0.1:6379> lpop letter
f
127.0.0.1:6379> lrange letter 0 -1
e
d
c
a
b
g
我们可以使用 lpop 命令从头开始删除元素,删除的元素会显示在页面中。同样的,使用 rpop 命令可以从尾开始删除元素。
我们依然可以使用这两个命令来进行多个元素的删除。
......
127.0.0.1:6379> lrange letter 0 -1
e
d
c
a
b
g
127.0.0.1:6379> lpop letter 2
e
d
127.0.0.1:6379> lrange letter 0 -1
c
a
b
g
127.0.0.1:6379> rpop letter 2
b
g
127.0.0.1:6379> lrange letter 0 -1
c
a
我们可以使用命令,再不查询列表内容时查询列表内元素的个数。
......
127.0.0.1:6379> lrange letter 0 -1
c
a
127.0.0.1:6379> llen letter
2
llen 命令会将列表内含有几个元素显示在页面上。
基于上述的几个列表命令,我们可以实现一个简单的消息队列。我们可以使用 lpush 命令在列表头插入一个元素,使用 rpop 命令从尾部删除一个元素,这样就实现了一个最简单的先进先出队列。
我们可以使用命令来决定我们只保留列表的哪一部分。
127.0.0.1:6379> lpush letter c d e f
4
127.0.0.1:6379> ltrim 1 2
OK
127.0.0.1:6379> lrange letter 0 -1
e
d
ltrim 命令可以指定我们只保留列表中某一段下标的内容。上述例子中,我们指定了保留下标为 1 到下标为 2 之间的内容。
Set 集合和 List 列表的区别主要在于:list 中的元素都是可以重复的,而 set 中的元素都是不可重复的,并且 set 的元素是无序的。我们可以使用命令向 set 集合中插入元素。
127.0.0.1:6379> sadd let a
1
127.0.0.1:6379> sadd let a
0
127.0.0.1:6379> sadd let b c
2
127.0.0.1:6379> smembers let
a
c
b
从上述的例子中我们可以发现,sadd 命令可以一次添加一个或多个元素进入集合,当添加重复元素时,集合不会发生改变。smembers 命令可以查看集合中的元素内容。
我们可以使用命令来查看键是否在集合中。
127.0.0.1:6379> sadd let a
1
127.0.0.1:6379> sismember let a
1
127.0.0.1:6379> sismember let b
0
sismember 命令可以通过键值来查看这个值是否存在在键的集合中,输出 1 表示该元素已经存在。
同样的,我们可以通过命令来删除集合中的元素。
127.0.0.1:6379> sadd let a b
2
127.0.0.1:6379> srem let a
1
127.0.0.1:6379> smembers let
b
我们可以通过 srem 命令来删除集合中的元素,输出 1 表示删除成功。
在集合中,也可以进行集合的运算,有关交集、并集等集合间的运算作为补充,留给各位自行查询探索。
SortedSet ,也叫做 zset。和集合的区别在于有序集合的每个元素都会关联一个浮点类型的分数,然后按照这个分数对列表中的元素进行从小到大的排序。
有序集合的元素是唯一的,但是分数是可以重复的。有序集合的相关命令以 Z 开头。
127.0.0.1:6379> zadd result 100 A 200 B
2
例如,向集合内添加元素的 zadd 命令,result 表示键,后续数字代表分数,数字后的元素代表添加至集合的元素,中间用空格隔开。例子中我们添加了 A 和 B 两个元素,输出为 2 表示我们成功添加了两个元素进入 result 集合。
127.0.0.1:6379> zrange result 0 -1
A
B
使用 zrange 命令可以根据所输入的下标查看对应的元素内容,下标输入格式和前文中相同。
127.0.0.1:6379> zrange result 0 -1
A
100
B
200
如果希望查看元素的同时也查看元素的分数,可以在命令后添加 withscores。
127.0.0.1:6379> zscore result A
100
想要查看某个元素的分数,可以使用 zscore 命令。
127.0.0.1:6379> zrank result B
1
如果想要查看某个元素的排名,可以使用 zrank 命令。需要注意的是,查看的结果是经过有序集合排序过后的顺序下标,而不是所查询元素在集合中的位置。
127.0.0.1:6379> zrevrank result B
0
如果希望从大到小进行查询,则可以使用 zrevrank 命令。
剩余命令,例如删除集合中的元素、删除集合等命令留给各位自行查询探索。
哈希是一个字符类型的字段和值的映射,简单来说就是一个键值对的集合,适合用来存储对象。
127.0.0.1:6379> hset hashresult A a
1
哈希的命令以 h 开头,我们可以使用 hset 命令来进行哈希的存储,hashresult 表示 key 值,A a 表示要存储的内容。
127.0.0.1:6379> hget hashresult A
a
127.0.0.1:6379> hgetall hashresult
A
a
我们可以使用 hget 命令来获取 hashresult 中 A 的属性,也可以使用 hgetall 命令来获取整个哈希中某个 key 的所有键值对。返回的内容以键值两两成对,示例中出现两行代表了一个键值对。
127.0.0.1:6379> hdel hashresult A
1
可以使用 hdel 命令来删除哈希中某个 key 的键值对,输出 1 表示删除成功。
127.0.0.1:6379> hset hashresult A a
1
127.0.0.1:6379> hexists hashresult A
1
127.0.0.1:6379> hexists hashresult B
0
可以使用 hexists 来查询哈希中某个 key 的键值对是否存在,输出 1 表示存在,输出 0 表示不存在。
127.0.0.1:6379> hkeys hashresult
A
127.0.0.1:6379> hlen hashresult
1
可以使用 hkeys 命令查询哈希中某个 key 的所有键,可以使用 hlen 命令来查询某个 key 内的键的数量。
剩余命令留给各位自行查询探索。
Stream 是 Redis 5.0 后引入的一个新的数据结构,是一个轻量级的消息队列,它可以解决消息无法持久化、无法保存历史消息等问题。
127.0.0.1:6379> xadd ldRedis * course redis
1714379633134-0
可以使用 xadd 命令向 Stream 中添加消息,星号表示自动生成一个消息 id,星号后的参数代表键值对。
127.0.0.1:6379> xadd ldRedis * course redis
1714379633134-0
127.0.0.1:6379> xadd ldRedis * course docker
1714380133655-0
127.0.0.1:6379> xadd ldRedis * course java
1714380137208-0
127.0.0.1:6379> xlen ldRedis
3
127.0.0.1:6379> xrange ldRedis - +
1714379633134-0
course
redis
1714380133655-0
course
docker
1714380137208-0
course
java
可以使用 xlen 命令查看消息队列中的消息数量,可以使用 xrange 命令查看消息队列中的详细信息,在这里减号和加号可以表示头和尾,不使用 0 和 -1。
127.0.0.1:6379> xdel ldRedis 1714379633134-0
1
127.0.0.1:6379> xrange ldRedis - +
1714380133655-0
course
docker
1714380137208-0
course
java
127.0.0.1:6379> xtrim ldRedis maxlen 0
2
可以使用 xdel 命令来删除消息队列中的消息,通过 id 进行删除。也可以通过 xtrim 命令来删除,在这里 maxlen 0 表示删除所有的消息。
当然,我们可以自行指定 id,id 由 X-Y 组成。X 表示时间戳,Y 表示序列号。如果使用 * 让 Redis 自动生成 id,则 Redis 会保证生成的 id 是递增的。
承接上文,我们使用消息队列来实现订阅模式。
127.0.0.1:6379> xread count 2 block 1000 streams ldRedis 0
在 xread 命令中,count 2 表示一次读取两条消息,block 1000 表示没有读到的情况下阻塞 1000 毫秒,0 表示从 0 下标开始读取。消息可以被重复读取。
我们也可以仅读取从现在开始之后的消息,演示采用双终端。
终端 A:
127.0.0.1:6379> xread count 2 block 10000 streams ldRedis $
当我们读取从现在开始的消息时,键后的参数改为 $ ,为了演示方便,将 block 的时间改为 10s。
当终端 A 执行该命令后,消息就进入读取状态,此时在终端 B:
127.0.0.1:6379> xadd ldRedis * course redis5
"1714381173344-0"
终端 A :
127.0.0.1:6379> xread count 2 block 10000 streams ldRedis $
---------- 之前执行的命令 ----------
ldRedis
1714381173344-0
course
redis5
当 id 生成时,检查终端 A ,发现终端 A 读取到了终端 B 的消息。
127.0.0.1:6379> xgroup create ldRedis group 0
OK
可以通过 xgroup 命令生成一个消费者组,消息的名称为 ldRedis,消费者组的名称为 group,0 表示 id。这样就创建了一个消费者组。
127.0.0.1:6379> xinfo groups ldRedis
name
group
consumers
0
pending
0
last-delivered-id
0-0
可以使用 xinfo 命令来查看组的信息,可以看到组的名称 name 为 group,内部消息的数量 consumers 为 0 等信息。
更多命令留给各位自行查询探索,注意 Redis 的版本问题。
Geospatial 是 Redis 3.2 版本中新加入的特性,它提供了一种用于存储地理位置信息的数据结构,同时支持各种计算操作。
127.0.0.1:6379> geoadd city 116 39 beijing
1
127.0.0.1:6379> geoadd city 121 31 shanghai 114 22 shenzhen
2
添加内容可以使用 geoadd 命令,city 表示 key,116、39 表示经纬度,beijing 表示名称。如果希望一次添加多个元素,则可以直接在名称后继续添加经纬度和位置信息。
127.0.0.1:6379> geopos city beijing
116.00000113248825073
38.99999918434559731
我们可以通过 geopos 命令来查询某个城市的经纬度,返回内容为一个数组形式。
127.0.0.1:6379> geodist city beijing shanghai
999207.7044
我们可以公国 geodist 命令来计算两个城市的距离,若输入经纬度精确,则计算结果就为实际结果,默认单位为米,需要转换单位时,在名称后跟单位名称,例如 ...... shanghai KM。
127.0.0.1:6379> geosearch city formmember shanghai byradius 300 km
该命令来自 Redis 7,用于查询某个城市半径为 300 km 以内的城市信息。当然可以使用其他命令来实现功能,留给各位自行查询。
基数:集合中的每个元素都是唯一且不重复的,那么这个集合的基数就是集合中元素的个数。
HyperLogLog 是一种用来做基数统计的算法,并不是 Redis 独有。Redis 中该算法的特点在于使用随机算法,实现了占用内存小,但降低了精确度,适用于数据量大,但精度需求不高的场景,例如统计某个网站的某个词的搜索次数等。
127.0.0.1:6379> pfadd course git docker redis
1
127.0.0.1:6379> pfcount course
3
我们可以使用 pfadd 命令来添加数据,例如我们向 course 课程 key 中添加了 git、docker、redis 三个内容,然后通过 pfcount 命令来进行查询,基数结果为 3。
127.0.0.1:6379> pfadd course2 git go java
1
127.0.0.1:6379> pfmerge result course course2
OK
我们可以通过 pfmerge 命令来对数据进行合并,可以看到我们将 course、course2 合并为 result。以上就是 HyperLogLog 的基本使用方法。
位图是字符串类型的扩展,可以用 String 类型来模拟 Bit 数组。数组的下标就是偏移量,值只有 0 和 1。位图支持与或非的位运算。
127.0.0.1:6379> setbit dianzan 0 1
0
127.0.0.1:6379> setbit dianzan 1 0
0
我们可以通过 setbit 命令来设置内容,示例中可以看到,我们将点赞的 0 位设置为 1,将 1 位设置为 0,这样我们就有了一个长度为 2 的位图。
127.0.0.1:6379> getbit dianzan 0
1
我们可以通过 getbit 命令来读取某一位的值,但是显然,一个一个的设置内容过于复杂。
前文我们说到,Bitmap 是 String 类型的扩展,本质上就是一个 String。
127.0.0.1:6379> set dianzan "\xF0"
OK
127.0.0.1:6379> getbit dianzan 0
1
127.0.0.1:6379> getbit dianzan 1
1
127.0.0.1:6379> getbit dianzan 2
1
我们可以通过 String 的 set 命令来设置内容,"\xF0" 表示 16 ,也就是二进制的 1111。从 getbit 命令可以看到,内容被成功读取。
127.0.0.1:6379> set dianzan "\xF0"
OK
127.0.0.1:6379> bitcount dianzan
4
127.0.0.1:6379> bitpos dianzan 1
0
我们可以通过 bitcount 命令来查看位图中有几个内容是 1,还可以通过 bitpos 命令来查询 0 或 1 首次出现的位置。
更多命令请自行查询探索。
位域能够将一些小的数据存储在位图中,可以更加高效的使用内存。
127.0.0.1:6379> bitfield player:1 set u8 #0 1
0
假设我们有一个游戏场景,你作为刚刚进入新手村的玩家,等级为 1 ,经验为 0 ,金币为 100,就可以使用 bitfield 命令来添加内容。player:1 表示 id,u8代表八位无符号整数,#0 表示第一个位置。
127.0.0.1:6379> get player:1
"\x01"
127.0.0.1:6379> bitfield player:1 get u8 #0
1
我们可以用 get 命令来查看内容,例如查看 id 返回 "\x01" 表示 1 级。我们将 bitfield 命令中的 set 更改为 get 就可以获取等级信息。
127.0.0.1:6379> bitfield player:1 get u32 #1 100
0
127.0.0.1:6379> bitfield player:1 incrby u32 #1 100
200
我们再为这个玩家添加金币,使用三十二位的无符号整数,在第二个位置设置金币为 100。我们可以将 get 替换为 incrby,含义为增加,再次查询我们可以看到金币从 100 更改为了 200。
为冒险家添加等级的操作就留给各位自行实现。
Redis 中的事务只要是通过 multi 和 exec 这两个命令实现的。multi 命令用于开启事务,开启事务后所有的命令都会被放入一个队列中,最后通过 exec 命令统一执行事务中的所有命令。
Redis 的事务和关系型数据库的事务不太相似。关系型数据库中事务一般表示为原子操作,要么全部成功要么全部失败。而在 Redis 中,事务并不能保证命令全部成功,他的结果取决于事务中命令的内容。
Redis 可以在输入 exec 命令之前先将命令存放到一个队列中缓存,输入 exec 后,所有命令开始执行,其中的某个命令失败并不会影响其余命令的执行。在事务执行的过程中,其他客户端提交的请求并不会加入该事务序列。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set v1 k1
QUEUED
127.0.0.1:6379> set v2 k2
QUEUED
127.0.0.1:6379> exec
OK
OK
我们可以看到,当执行 multi 命令后,再输入 set 命令,得到的结果是 QUEUED 而不是 OK。当执行 exec 命令后,两个 set 命令被依次执行,返回两个结果 OK。
持久化是 Redis 非常重要的一个功能。
Redis 是一个基于内存的数据库,如果没有该功能,一旦服务器重启或断电,所有数据都会丢失,这对于数据库来说是非常致命的。
Redis 中实现持久化有两种方式:
RDB(redis database):在指定时间间隔内将内存中的数据快照写入磁盘,是某一个时间点上数据的完整副本,可以通过修改配置文件中的 save 参数实现。或者直接在命令行手动输入 save 命令触发快照功能。
127.0.0.1:6379> save
由于 RDB 方式仍然不能保存最后一次快照之后的数据,所以该方式更适合于处理数据备份。
可以将 save 命令使用子进程执行,这种情况下 Redis 在快照时间内仍然可以工作,但这种方式会有极大的性能损耗。
127.0.0.1:6379> bgsave
AOF(append only file):只追加文件,在执行写命令的时候,不仅会将数据写入内存中,同时还会将数据写如到一个追加的文件中,会以日志的形式来记录每次操作。当出现问题时,AOF 会执行日志中的命令来保证数据的持久化。
开启 AOF 的方式是将配置文件中的 appendonly 参数改为 yes 即可。
主从复制是指将一台 Redis 的数据复制到另外一台 Redis 上。被复制的 Redis 被叫做主节点,也叫 master 节点。数据存储的 Redis 被叫做从节点,也叫 slave 节点。
一台 Redis 可以有无数个从节点,但每个从节点只能有一个主节点。数据的复制是单向的,只能从主节点到从节点。一般来说主节点负责数据的写操作,从节点负责数据的读操作。主节点会将自己的数据通过异步的方式发送到从节点,从节点接收到主节点的数据后更新数据,这样就达到了数据一致的目的。
主从配置可以通过修改配置文件或命令来进行修改。
主节点无需配置,Redis 默认配置即为主节点。
将 Redis 修改为从节点的配置文件修改:
port 端口号修改
pidfile 内文件名添加端口号
dlfilename 内文件名添加端口号
replicaof 将该注释打开,填入主节点的ip地址和端口号
在主从复制的内容中,我们可以搭建一主多从的 Redis 节点,初步实现了高可用,实现了性能的提升。但仍然存在一个问题,当主节点宕机,我们就需要手动的将从节点中的一台修改为主节点,这样就无法实现真正的高可用,Redis 哨兵模式可以解决这个问题。
Redis 哨兵会以一个独立的进程运行在 Redis 集群中,用来监控 Redis 节点是否运行正常,他的主要功能有:
通过不断的发送命令来检查节点是否正常。
如果发现某个节点出现问题,哨兵会以发布订阅模式的方式通知其余节点。
当主节点不能正常工作时,哨兵会进行自动故障转移操作,它会将一个从节点升级为主节点,并且将其余的从节点指向这个新的节点。
需要新的配置文件:sentinel.conf
文件内容
sentinel monitor master 127.0.0.1 6379 1
master 表示主节点名称,后跟主节点的 ip 地址和 端口,1 表示只需要一个哨兵同意就可以进行自动故障转移。
启动配置文件:redis-sentinel sentinel.conf
值得注意的是哨兵也属于一个进程,它自身可能也会存在故障,所以一般使用时建议三个或以上的哨兵同时监控主节点以保证监控准确。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。