Redis是一个高性能的开源键值对(Key-Value)数据库,以其出色的速度和对多种数据结构的支持而闻名,被广泛用于缓存、消息队列、会话存储等场景。本文将系统性地介绍Redis的安装部署、核心操作、数据持久化与备份,并最终构建一个高可用的Redis主从同步架构。
环境准备与安装
建议从Redis官方网站下载源码包进行编译安装,以获得最新的稳定版本。以下是下载与编译安装的基本步骤。
$ wget http://download.redis.io/releases/redis-5.0.3.tar.gz
$ tar xzf redis-5.0.3.tar.gz
$ cd redis-5.0.3
$ make
编译成功后,生成的可执行文件位于src目录下。
基础配置与管理
默认情况下,Redis以后台模式运行,端口号为6379。其核心配置文件为redis.conf。让我们修改几个关键配置以方便使用。
首先,设置Redis以后台服务(守护进程)模式运行:
daemonize yes
接着,指定日志文件的存放路径,便于问题排查:
logfile "/path/to/your/redis.log"
配置完成后,可以使用以下命令启动Redis服务并连接客户端:
$ src/redis-server ../redis.conf # 指定配置文件启动服务
$ src/redis-cli # 使用客户端连接
核心数据结构与常用命令
Redis支持五种核心数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和Sorted Set(有序集合)。
一、String类型
用于存储字符串、整数或浮点数。
set key1 com # 设置键值,重复设置会覆盖
setnx key1 zhangsan # 仅当key1不存在时设置,用于分布式锁等场景
setex key3 100 fansik # 设置key3并指定100秒后过期
ttl key3 # 查看key3的剩余生存时间(秒)
mset key4 123 key5 213 # 批量设置
mget key1 key2 key4 key5 # 批量获取
del key1 # 删除键
二、Hash类型
类似于编程语言中的Map,适合存储对象。
hset hash1 name fanjinbao # 设置单个字段
hget hash1 name # 获取单个字段值
hmset hash1 work it singel yes # 批量设置多个字段
hmget hash1 work single # 批量获取多个字段值
hgetall hash1 # 获取Hash中所有字段和值
hlen hash1 # 获取字段数量
三、List类型
一个简单的字符串列表,按插入顺序排序,支持从两端插入或弹出。
lpush list a b c # 从左侧(头部)插入 a, b, c
lrange list 0 -1 # 列出list中索引0到-1(全部)的元素
lpop list # 从左侧弹出一个元素(取出并删除)
rpush list 1 2 3 # 从右侧(尾部)插入 1, 2, 3
rpop list # 从右侧弹出一个元素
四、Set类型
无序且元素唯一的字符串集合,支持交集、并集、差集等集合运算。
sadd set1 a b c d # 向集合中添加元素
smembers set1 # 查看集合中所有元素
srem set1 a # 删除指定元素
sinter set1 set2 # 求两个集合的交集
sunion set1 set2 # 求两个集合的并集
sdiff set1 set2 # 求集合set1与set2的差集(set1有而set2没有的元素)
五、Sorted Set类型
在Set基础上,为每个元素关联一个分数(score),元素按分数排序。
zadd zset 1 123 2 234 # 添加元素123(分数1)和234(分数2)
zrange zset 0 -1 # 按分数升序显示所有元素
zrange zset 0 -1 withscores # 显示元素及其分数
zrank zset 555 # 返回元素555在升序排列中的索引(排名)
zrevrank zset 444 # 返回元素444在降序排列中的索引
六、键(Key)相关命令
keys * # 查询所有键(生产环境慎用)
keys set* # 模糊匹配以`set`开头的键
exists list # 判断键是否存在
expire set1 10 # 为键set1设置10秒后过期
ttl set1 # 查看键set1的剩余生存时间
type keyfansik # 查看键的数据类型
select 1 # 切换到1号数据库(默认16个,0-15)
move set1 2 # 将键set1移动到2号数据库
七、服务器相关命令
dbsize # 返回当前数据库的键总数
info # 获取详细的服务器和数据库状态信息
flushdb # 清空当前数据库
flushall # 清空所有数据库
config get * # 获取所有配置参数
config set timeout 1000 # 设置客户端连接超时时间为1000秒
数据持久化策略
Redis提供两种主要的持久化方式:RDB(快照)和AOF(追加日志)。
RDB(快照)
在指定时间间隔内,将内存中的数据快照写入磁盘二进制文件(默认dump.rdb)。配置项在redis.conf中:
save 900 1 # 900秒内至少有1个key被更改,则触发快照
save 300 10 # 300秒内至少有10个key被更改
save 60 10000 # 60秒内至少有10000个key被更改
手动执行SAVE命令会阻塞主进程创建快照,而BGSAVE会在后台异步执行。
AOF(Append Only File)
记录所有写操作命令,以文本协议格式追加到文件末尾(默认appendonly.aof)。开启并配置AOF:
appendonly yes
appendfsync everysec # 每秒同步一次,在性能和数据安全间取得平衡
AOF方式数据更安全,但文件通常比RDB大,恢复速度也较慢。生产环境常结合使用两种方式。
数据库安全
为Redis服务设置访问密码是基础的安全措施。可以在配置文件中永久设置,或通过命令行临时设置。
永久密码
修改配置文件redis.conf:
requirepass admin
临时密码
通过CONFIG命令设置(重启后失效):
127.0.0.1:6379> CONFIG set requirepass "runoob"
OK
设置密码后,客户端连接必须先进行认证:
127.0.0.1:6379> AUTH "runoob"
OK
禁用或重命名危险命令
为了防止误操作或被恶意利用,可以在配置文件中重命名或禁用某些命令,例如:
rename-command CONFIG fansik # 将CONFIG命令重命名为fansik
rename-command CONFIG "" # 禁用CONFIG命令
搭建Redis主从同步架构
主从复制是Redis实现高可用的基石。一个主节点(Master)可以有一个或多个从节点(Slave)。主节点负责处理写操作,并将数据变更同步给从节点;从节点作为只读副本,承担读请求,起到负载均衡和故障转移的作用。
配置步骤
-
配置主节点
编辑主服务器的redis.conf,确保允许远程连接(如果从节点与主节点不在同一机器):
bind 0.0.0.0
同时,强烈建议设置主节点密码(requirepass),如上文安全部分所述。
-
配置从节点
编辑从服务器的redis.conf,添加以下两行:
slaveof 192.168.110.131 6379 # 指定主服务器的IP和端口
masterauth admin # 如果主服务器设置了密码,这里填写主服务器的密码
slaveof指令告诉Redis实例作为谁的从节点。
-
验证主从状态
至此,一个基础的Redis主从复制环境就搭建完成了。通过这种架构,不仅提升了系统的读性能,也为后续实现故障自动切换的哨兵(Sentinel)模式或更复杂的集群(Cluster)模式奠定了基础。技术社区如云栈社区中,有更多关于Redis哨兵、集群配置及生产环境优化的深入探讨和实践分享。
参考资料
[1] redis数据库主从配置, 微信公众号:mp.weixin.qq.com/s/_Rb6w0oTf23d55YlNCgstA
版权声明:本文由 云栈社区 整理发布,版权归原作者所有。