1. Redis简介
Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,数据结构包含字符串、哈希、列表、集合和有序集合。Redis支持主从复制、发布/订阅、Lua脚本、LRU驱动事件、事务和不同级别的磁盘持久化。Redis的特点是高性能、高并发,是一款NoSQL数据库。
2. Redis单机模式
Redis单机模式指Redis服务器只运行在一个节点上,所有数据都存放在内存中。如果需要持久化数据,可以选择RDB(Redis DataBase)或AOF(Append Only File)方式。其中RDB方式是在某个时间点上将内存中的数据备份到磁盘中,而AOF方式则是将所有写操作追加到文件中,用于在重启Redis时恢复数据。
2.1 Redis数据类型
Redis支持五种数据类型,分别是:字符串(string)、哈希(hash)、列表(list)、集合(set)和有序集合(sorted set)。
其中,字符串是最常用的数据类型,可以存放任何数据,包括二进制数据。哈希类型可以看作是一个属性列表,适用于存储对象信息。列表类型用于存储有序的字符串列表,可以进行左右插入和弹出操作。集合类型存储无序的字符串集合,支持交、并、差集运算。有序集合类型类似于集合类型,但是每个元素都有对应的权重值(score),可以按照权重排序。
举例说明Redis数据类型
redis> SET key1 "hello"
OK
redis> HSET user:1 name "Tom"
(integer) 1
redis> LPUSH list1 "a"
(integer) 1
redis> LPUSH list1 "b"
(integer) 2
redis> SADD set1 "a"
(integer) 1
redis> SADD set1 "b"
(integer) 1
redis> ZADD zset1 1 "a"
(integer) 1
redis> ZADD zset1 2 "b"
(integer) 1
2.2 Redis命令行操作
Redis提供了一系列命令用于数据操作,可以在Redis客户端中执行。下面使用Redis命令行演示如何进行数据操作:
字符串操作
redis> SET key1 "value1"
OK
redis> GET key1
"value1"
哈希操作
redis> HSET person id 1
(integer) 1
redis> HSET person name "Tom"
(integer) 1
redis> HGET person id
"1"
redis> HGET person name
"Tom"
列表操作
redis> LPUSH list1 "item1"
(integer) 1
redis> LPUSH list1 "item2"
(integer) 2
redis> LRANGE list1 0 -1
1) "item2"
2) "item1"
集合操作
redis> SADD set1 "item1"
(integer) 1
redis> SADD set1 "item2"
(integer) 1
redis> SMEMBERS set1
1) "item2"
2) "item1"
有序集合操作
redis> ZADD zset1 1 "item1"
(integer) 1
redis> ZADD zset1 2 "item2"
(integer) 1
redis> ZRANGE zset1 0 -1 WITHSCORES
1) "item1"
2) "1"
3) "item2"
4) "2"
3. Redis主从模式
Redis主从模式是指Redis服务器可以拆分为主节点和从节点,共同构成一个分布式系统。主节点可以进行写操作,而从节点只能进行读操作。
Redis主从模式的作用:
提高Redis的读取性能,缓解单点读压力。
提高Redis的可用性,主节点宕机后从节点可以顶替主节点,不会影响整个系统的运行。
通过从节点可以进行数据备份。
3.1 Redis主从配置
Redis主从配置大致分为以下几个步骤:
启动主节点,修改配置文件
bind 127.0.0.1
port 6379
daemonize yes #后台启动
logfile "/var/log/redis.log"
# 打开主节点的只读模式
slave-read-only yes
启动从节点,修改配置文件
bind 127.0.0.1
port 6380
daemonize yes #后台启动
logfile "/var/log/redis.log"
# 设置从节点
slaveof 127.0.0.1 6379
3.2 Redis主从复制
Redis主节点可以将自己的数据同步到从节点中,从而实现主从复制。当主节点执行写操作时,会将数据同步到从节点中,从节点就可以读取到主节点的最新数据。
Redis主从复制的过程
从节点连接主节点,发送SYNC命令
redis> SLAVEOF 127.0.0.1 6379
OK
redis> SYNC
主节点执行BGSAVE命令,备份数据
redis> BGSAVE
Background saving started
主节点将备份过的数据发送给从节点
redis> PSYNC b8b5476d36ac5997f4a15dd75d2363e8aba708c1 3806997
+OK
从节点保存主节点的数据,并持续接收主节点的新数据
redis> WAIT 1 1000
OK
4. Redis哨兵模式
Redis哨兵模式是一种用于高可用性的Redis解决方案,能够在Redis主从复制的基础上,自动检测主节点的故障,切换到备用节点,保证Redis集群的高可用性。
如果主节点宕机,哨兵可以自动切换到备用节点,使得Redis集群仍然可以正常工作。
4.1 Redis哨兵配置
Redis哨兵配置大致分为以下几个步骤:
修改主节点配置文件
bind 127.0.0.1
port 6379
daemonize yes #后台启动
logfile "/var/log/redis.log"
# 打开主节点的只读模式
slave-read-only yes
# 开启哨兵模式
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 1
启动哨兵进程,创建配置文件
port 26379 #哨兵端口号
daemonize yes
logfile "/var/log/sentinel.log"
# 设置哨兵监控的主节点
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
sentinel parallel-syncs mymaster 1
4.2 Redis哨兵切换
当Redis主节点发生故障时,哨兵可以自动切换到备用节点,使得Redis集群仍然可以正常工作。
Redis哨兵切换的过程
哨兵检测到主节点故障
+sdown master mymaster 127.0.0.1 6379
哨兵选举出新的主节点
+elected-leader master mymaster 127.0.0.1 6380
哨兵更改备用节点为主节点,并通知前端应用
+switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
5. Redis集群模式
Redis集群模式主要解决单机Redis的容量有限,无法支持海量数据的需求。Redis集群的每个节点都需要存储部分数据,可以横向扩展节点以增加整个Redis集群的存储容量。
Redis集群模式需要满足以下几个条件:
数据分片:将数据分为多个区间,每个节点存储其中的一部分数据。
节点间互联:Redis集群中的每个节点都要互相连通。
故障转移:当某个节点出现故障时,需要自动将其故障转移到其他节点上。
5.1 Redis集群搭建
Redis集群的搭建大致分为以下几个步骤:
创建6个Redis节点,并修改配置文件
bind 127.0.0.1
port 6379
daemonize yes #后台启动
logfile "/var/log/redis.log"
cluster-enabled yes
cluster-config-file node-6379.conf
cluster-node-timeout 5000
bind 127.0.0.1
port 6380
daemonize yes #后台启动
logfile "/var/log/redis.log"
cluster-enabled yes
cluster-config-file node-6380.conf
cluster-node-timeout 5000
# ... 其它节点
使用redis-trib.rb脚本创建Redis集群
$ redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
5.2 Redis集群操作
Redis集群提供了一系列操作命令,用于管理Redis节点和数据。下面以一些常用的Redis集群命令为例进行演示:
创建键值对
$ redis-cli -c -p 6379
127.0.0.1:6379> SET key1 value1
OK
查询键的信息
$ redis-cli -c -p 6379
127.0.0.1:6379> CLUSTER KEYSLOT key1
(sinteger) 12758
移动键的槽位
$ redis-cli -c -p 6379
127.0.0.1:6379> CLUSTER SETSLOT 12758 NODE 751e45d402d5393f137881891f9aa1f04791f09e
OK
查看节点信息
$ redis-cli -c -p 6379
127.0.0.1:6379> CLUSTER NODES
6. 总结
Redis是一个开源的内存数据结构存储系统,支持主从复制、哨兵和集群模式,具有高性能和高可用性。单机模式适用于小规模系统,而主从模式可以提高读取性能和可用性。哨兵模式可以实现自动故障转移,保证Redis集群的高可用性。集群模式则可以进行横向扩展,解决单机Redis容量的问题。不同模式有不同的优缺点,根据实际需求选择合适的模式才能发挥Redis的最大价值。