Redis高性能数据库讲解与实战指南
一、Redis数据库
Redis是一种高性能的开源内存数据库,采用C语言进行编写,支持多种数据结构并具备持久能力,广泛应用与高并发、低延迟的数据处理场景。
1.Redis核心特性
高性能内存存储:基于内存的高效存储机制,提供毫秒级读写能力,完美支撑高并发实时应用场景。
丰富数据结构支持:支持字符串、哈希、列表、集合、有序集合等多样化数据结构,灵活适配各类业务场景需求。
可靠数据持久化:采用RDB快照与AOF日志双重持久化机制,全方位保障数据安全性与可靠性。
弹性高可用方案:支持主从复制、哨兵监控和集群分片等多种部署模式,轻松构建高可用分布式系统。
2.应用场景
缓存优化:通过缓存热点数据,有效降低数据库查询压力。
实时计算:支持计数器实现和榜单排名功能。
分布式锁:基于Redis的setnx和expire命令实现,确保多进程并发操作的安全性。
异步处理:借助发布订阅模式构建高效的消息队列系统。
3.Redis缓存三大问题
(1)Redis缓存雪崩
在特定时间段内,若Redis缓存中的大量数据同时失效或过期,会导致大量请求直接涌向数据库,造成数据库负载激增,进而引发Redis服务性能骤降甚至系统崩溃。
(2)Redis缓存击穿
当热点缓存数据在短时间内失效或缺失时,若恰逢大量请求涌入,这些请求会直接压向数据库,导致数据库负载激增、性能骤降甚至崩溃。
(3)Redis缓存穿透
当某个数据在缓存和数据库中都不存在时,每次请求都会直接访问数据库,导致缓存穿透现象。这种情况会显著增加数据库负载,造成性能急剧下降,甚至引发系统崩溃。
4.常用命令
mset:同时存储多个变量
mset 变量一 值 变量二 值 ...
mget:同时查看多个变量值
mget 变量一 变量二...
keys:查看变量,*匹配所有变量名,?匹配一个字符
keys * #查看所有变量名
keys ? #查看变量名一个字符
keys a* #a开头的变量名
keys 变量名 #查看指定变量是否存在
select:切换库
select 库编号 #默认库编号0-15
move:移动变量到其他库里
move 变量 库编号
exists:检查变量是否存储,返回值1变量存储,返回0变量不存在
exists 变量名
expire:设置变量的过期时间,不设置变量永久不过期
ttl 变量名 #查看变量过期时间,-1表示永不过期,-2标识已经过期被删除
expire 变量名 数值 #设置变量多少秒过期
type:检查变量存储数据的类型
type 变量名
del:删除内存里的变量
del 变量一 变量二 ...
flushdb:删除当前所在库的所有数据
flushdb
Flushall:清空内存
flushall
二、部署Redis集群流程
1.准备集群环境
配置集群的主机服务器进行文件配置
#vim /etc/redis.conf 修改主配置文件
92 port 6379 //端口号
69 bind ip //IP地址
838 cluster-enabled yes //启用集群功能
846 cluster-config-file nodes-6379.conf //存储集群信息文件
852 cluster-node-timeout 5000 //集群中主机通信超时时间
重启服务
#systemctl restart redis
2.创建集群
任何一台redis服务器都可执行
#redis-cli --cluster create 主机1ip:6379 主机2ip:6379 .... --cluster-replicas 1
--cluster-replicas 1
参数为每个主节点配置1个从节点,这是实现Redis高可用的最低要求。在集群创建过程中,系统会自动分配主从角色:默认将主机列表中的前N台设为主节点,其余作为从节点。同时,系统会自动为主节点分配哈希槽,以此实现数据的分布式存储机制。
3.测试集群
(1)测试数据自动备份
Master服务器创建数据,使用Slave服务器查看数据
#redis-cli -c -h slave服务器ip -p 6379
keys *
(2)测试服务高可用
当主服务器(Master)下线时,对应的从服务器(Slave)将自动升级为主节点,接管原主节点的哈希槽分配,从而确保Redis服务的高可用性。
#systemctl stop redis #master服务器关闭redis服务
#redis-cli --cluster info 服务器ip:6379 #选择一台服务器查看集群信息
三、Redis主从
Redis主从复制机制通过将主节点数据自动同步到一个或多个从节点,实现了数据备份与读写分离。这种架构设计不仅提升了Redis服务的可用性和可靠性,还具备出色的扩展能力。主从结构有一主一从、一主多从、主从从。
1.配置Redis主从
(1)所有服务器都要修改配置文件
#vim /etc/redis.conf
69 bind 192.168.88.61 设置服务使用的Ip地址
92 port 6379 使用默认端口即可
连接服务查看角色
#redis-cli -h 服务器ip -p 6379
info replication 默认为主服务器
(2)配置Slave服务器
连接服务,指定主服务器ip和端口号并永久保存配置
#redis-cli -h 服务器ip -p 6379
replicaof Master服务器ip 6379 绑定主服务器
config rewrite 永久保存配置
(3)恢复为独立的数据库服务器
replicaof no one
四、哨兵服务
Redis哨兵(Sentinel)是Redis集群的高可用性解决方案,它通过实时监控主从节点状态来确保服务稳定性。哨兵会持续发送心跳检测来确认节点存活状态。一旦检测到主节点故障,哨兵系统会立即启动故障转移流程:首先通过内部投票机制选出新的主节点,然后自动更新所有从节点的配置信息。这套机制完全自动化运行,最大程度地保证了服务不中断。
1.搭建哨兵服务器
安装哨兵服务,修改配置文件,然后启动服务器
#rpm -y install redis
#vim /etc/redis-sentinel.conf
15 bind ip 指定哨兵服务使用ip地址
21 port 26379 指定哨兵服务监听端口
26 daemonize yes 服务守护进程方式运行服务
84 sentinel monitor 名称 主服务器ip地址 6379 票数
#systemctl start redis-sentinel 启动哨兵服务
五、持久化
1.RDB
数据持久化的默认方式采用定时机制,按预设间隔生成内存数据的二进制快照文件,实现全量备份以保存特定时刻的数据状态。该方案尤其适合数据量大但需要快速备份恢复的场景,备份和恢复过程均不会阻塞Redis服务的正常运行,是进行全量备份的理想选择。
备份数据:
#cp /数据库目录/dump.rdb /备份目录/dump.rdb
恢复数据:
#cp /备份目录/dump.rdb /数据库目录
2.AOF
将写操作命令记录到日志文件中,通过重放日志命令实现数据恢复。这种方式在最大程度上确保了数据的完整性和持久性。AOF采用追加方式更新数据,即使频繁执行写入操作也不会影响Redis的性能,同时兼具良好的可读性和易操作性。适用于增量备份。
(1)启用AOF
config set appendonly yes 启用
config rewrite 保存到配置文件
(2)备份AOF文件
cp /var/lib/redis/appendonly.aof /opt/ 拷贝到/opt/目录
(3)恢复数据
cp /opt/appendonly.aof /var/lib/redis/
六、数据类型
1.字符类型
存储变量时,设置变量有效期
set 变量名 数据 ex 数值 变量多少秒过期
set 变量名 数据 px 数值 变量多少毫秒过期
incr:递增数字,当操作键不存在时默认键值为0
incr 变量名
incrby:增加指定整数
incrby 变量名 整数
decr:递减数字,每次-1
decr 变量名
decrby:递减指定整数
decrby 变量名 整数
append:字符串追加
append 变量名 "字符串"
strlen:获取字符串长度
strlen 变量名
getrange:获取变量部分数据
getrange 变量名 数1 数2 数为正,则输出从数1字符到数2字符的字符数为负,则输出倒数|数1|到|数2|的字符
2.列表类型
lpush:向列表左边增加元素,返回值表示增加元素后列表的长度。
lpush 变量名 元素1 元素2 ...
lrange:取出列表中所有元素
lrange 变量名 0 -1
llen:统计元素个数
llen 变量名
lindex:通过下标输出单个元素 第1个元素下标用0表示 ,最后一个元素下标用-1表示
lindex 变量名 下标
lset修改元素
lset 变量名 下标 修改后元素
删除元素
lpop 变量名 删除头部元素
rpop 变量名 删除尾部元素
rpush:尾部追加元素
rpush 变量名 元素 追加元素
lindex:插入元素
linsert 变量名 before 元素 插入元素 在指定元素前插入元素
linsert 变量名 after 元素 插入元素 在指定元素后插入元素
3.散列类型
赋值与取值
hset 变量名 key value 创建变量
hget 变量名 key 查看key列的值
设置多个字段
hmset 变量名 key1 value1 key2 value2
hmget 变量名 key1 key2 查看key1,key2的值
获取所有列名及对应的值
hgetall 变量名
删除列
hdel 变量名 key
只获取列名
hkeys 变量名
只获取值
hvals 变量名
获取列数量
hlen 变量名
4.集合类型
(1)无序集合
无序集合中的每个元素都是不同的,且没有顺序
创建/追加/删除
sadd 变量名 元素1 元素2 ... 自动删除重复的值
查看成员
smembers 变量名
判断元素是否在集合中
sismember 变量名 元素 返回0表示不存在,返回1表示存在
输出成员个数
scard 变量名
合并两个集合元素,重复的元素只显示一次
sunion 变量1 变量2
输出两个集合中相同的元素
sinter 变量1 变量2
比较两个集合元素的不同
sdiff 变量1 变量2
随机取出变量元素,允许重复
srandmember 变量名 -数值
随机弹出一个元素
spop 变量名
(2)有序集合
创建变量
zadd 变量名 数值1 元素1 数值2 元素2 ...
统计元素个数
zcard 变量名
zrange 变量名 0 -1 withscores 输出成员名称及对应的值
获取某个元素的值
zscore 变量名 元素
获取指定范围的元素
zrangebyscore 变量名 数1 数2 withscores
增加某个元素的值
zincrby 变量名 数值 元素
获取指定数值范围内元素的个数
zcount 变量名 数值1 数值2
删除元素
zrem 变量名 元素