Redis进阶

本文详细介绍了Redis的线程模型,解释了其单线程模式下为何能保持高效率,并讨论了Redis的多线程更新。此外,文章深入探讨了Redis的数据持久化机制,包括RDB和AOF两种方式,以及如何配置触发持久化的策略。同时,提到了Redis事务的原子性和主从复制架构,用于实现读写分离和故障恢复。最后,介绍了哨兵机制在集群中的作用,以及key的过期策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis线程模型

问:redis是单线程还是多线程?

答:不同的版本有区别,6.x版本之前是真正意义上的单线程:处理客户端连接和执行操作的命令都是由一个线程执行的

6.x之后的版本引入了多线程,处理客户端请求由专门的线程处理,执行命令还是单线程

问:为什么单线程模式速度非常快?

答:1.数据存储在内存中,读取速度快,CPU不是性能瓶颈

2.结构简单,key-value底层是哈希结构,查询操作速度是O(1)

3.采用IO多路复用,非阻塞IO模型,提高链接访问率

4.单线程执行命令,不存在线程切换,节省开销,而且线程安全

Redis序列化

IO对象序列化,对象反序列化,对象信息持续保存在硬盘上

mybatis是一个Javad的数据持久层框架

Redis数据是存储在内存中的,内存数据是临时保存

Redis直持数据持久化到硬盘

问:Redis是如何将数据持久化到硬盘的?

答:RDB(Redis DataBase)和AOF(Append Only File)。RDB和AOF这两种方式都可以在redis.conf文件中可以配置

Redis默认使用RDB方式:直接将内存的快照(k-v)存储起来

问:如何配置触发持久化的机制?

答:1.save m n|save 多少秒内 多少键

2.flushall命令,触发rdb规则

3.退出
 

RDB

RDB持久化是在指定的时间间隔内将数据集快照写入磁盘。也是默认的持久化方式,这种方式就是把内存中数据以快照的方式写入二进制文件中,默认文件为dump.rdb

AOF

以日志的方式将命令存储到文件中 set name jim

还原时将命令逐个还原为数据

默认是不开启的

appendonly on

同步机制:

appendfsync always 每次set记录一次

appendfsync everysec 每秒记录一次

Redis事务

Redis在执行单条命令时,是原子性(单线程的一次只能有一条线程执行命令)

问:有时候,一次操作需要执行多条命令,如何保证多条命令整体执行

答:可以通过Redis事务实现:

开启事务:multi

添加命令。。。命令添加进来不会立刻执行,添加到一个队列

执行exc命令时,才会将队列中多条命令依次执行,执行一个事务中多条命令时,其他客户端会被隔离,不会交替执行

但是事务不保证多条命令执行的原子性(加入执行了3条命令,其中有一条语法出错,那么会将其他两条正确的语法继续执行)

主从复制

主从——主机和从机——集群架构

问:为什么用集群?

答:如果有一台Redis服务,万一宕机,所有的请求都传到MYSQL导致MySQL宕机

可以搭建多台redis服务器,如果其中有一台故障,那么其他服务也可以继续

主机负责写数据,将数据同步到从机,一般的读数据从从机查询

实现读写分离,写命令由主机执行,读命令从从机执行

主机配置
bind 0.0.0.0
#任何 ip 都可以访问
daemonize yes 后台运行
pidfile /var/run/redis_6379.pid #进程号文件
logfile "6379.log"
#日志文件
注意文件名修改只是为了区分
dbfilename dump6379.rdb #数据文件
requirepass root #主机密码
从机配置
#bind 注释
daemonize yes 后台运行
pidfile /var/run/redis_6380.pid #进程号文件
logfile "6380.log"
#日志文件
注意文件名修改只是为了区分
dbfilename dump6380.rdb #数据文件
replicaof <masterip>主机 ip <masterport>主机端口
masterauth <master-password>主机密码
从机进入客户端模式 ./redis-cli -p 从机端口

哨兵机制

有一个单独线程,对集群中的多态服务进行监听,给每个服务发请求,如果没有响应,说明出现故障

比如主机宕机,会在从机中选出一个充当主机,当原主机恢复后,又可以当作主机使用

key的过期策略

当key设置过期时间,那么时间到了后redis将如何处理过期的key

1.立刻删除:到期立刻执行回调函数,立刻释放内存,对redis性能有影响

2.惰性删除:到期后不会立即删除,而是到下次调用该键时,根据状态(设置是会记录的)来决定是否删除还是继续使用,占用内存

3.定期删除:每隔一段时间对所有到期的键统一进行删除(类似于java的垃圾回收机制)

### Redis 的高级用法和特性 #### 1. 使用带有自动补全和语法高亮的交互式 CLI 为了更高效地管理和操作 Redis 数据库,可以采用具备自动完成命令以及提供语法高亮特性的客户端工具。这种增强型CLI能够显著提升用户体验,在执行复杂查询时尤为有用[^1]。 ```bash # 安装并运行支持自动完成与语法高亮特性的Redis CLI pip install interactive-redis-cli interactive_redis_cli ``` #### 2. 启用多种持久化机制保障数据安全 通过配置 `redis.conf` 文件中的设置项来激活 RDB (快照) 和 AOF (追加仅文件) 这两种不同的持久化策略。这有助于防止意外断电或其他异常情况造成的数据丢失风险。当容器启动时指定挂载外部卷用于存储这些持久化的数据库副本,从而实现跨重启后的状态保持[^2]。 ```dockerfile # Docker Compose 或者直接使用Docker指令启动带持久化的Redis实例 docker run --name redis \ -v /local/path/to/data:/data \ -v /local/path/to/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -p 6379:6379 -d redis \ redis-server /usr/local/etc/redis/redis.conf ``` #### 3. 创建受限账户提高安全性 对于生产环境下的 Redis 实例来说,创建一个专门的服务账号是非常重要的一步。该账号不具备 shell 访问权限,并且其家目录也被移除以减少潜在的安全威胁。此外还将 Redis 可执行程序及其工作路径赋予此特定用户组所有权,确保只有授权人员才能对其进行修改或访问[^3]。 ```bash # 添加不具Shell登录能力也不拥有Home Directory的新用户 sudo useradd -M -s /sbin/nologin redis # 更改Redis安装目录所属权给新建立的用户 chown -R redis:redis /path/to/installation/ ``` #### 4. 构建分布式集群架构扩展性能 随着业务增长带来的负载压力增大,单机版 Redis 很难满足需求。此时可以通过构建多节点组成的集群模式来进行横向扩容。每个节点负责处理一部分键空间内的读写请求,而整个系统的吞吐量则取决于所有成员共同协作的结果。在实际部署过程中需注意各服务器间网络连接质量及延迟等因素的影响[^4]。 ```bash # 分别于不同主机上依次启动多个Redis服务端进程作为集群组成部分之一 /usr/local/redis/src/redis-server /etc/redis/node-01.conf /usr/local/redis/src/redis-server /etc/redis/node-02.conf ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值