Redis的线程模型、持久化、事务
线程模型
为什么Redis是单线程?
Redis内部使用文件事件处理器(file event handler
),这个处理器是单线程的,因此Reids被叫做单线程模型。
- 在6.x之前:处理客户端的连接、请求、读写操作都是单线程执行的。
- 在6.x之后:处理客户端的连接、请求是多线程的,读写操作是单线程的,保证了Redis的线程安全
为什么在Redis6.x引入多线程
Redis的性能瓶颈在于内存和网络IO,网络IO的读写在Redis执行期间占用了大部分CPU的时间,内存可以扩展,网络IO的性能提升是Redis性能提升的关键,因此采用多线程做网络请求处理。
为什么Redis作为单线程模型效率也很高?
- 在内存中操作,读取速度快
- 数据结构简单,以键值对存储,底层使用哈希结构,查询效率为O(1)
- 非阻塞的IO多路复用,多路复用监控多个socket连接客户端,使用一个线程处理多种情况,避免了IO阻塞
- 避免了线程切换带来的开销,是线程安全的
持久化
- Redis中的数据存储在内存中,容易丢失,因此需要持久化(保存到硬盘)的方式保存数据。
- Redis提供了RDB(生成快照)和AOF(记录每次对数据的操作)两种持久化机制,两种方式都可以在
redis.conf
中设置 - Redis默认使用RDB方式
RDB(Reids Database)
在指定时间间隔内将内存中的数据(Key-Value)生成快照存储到硬盘中。
默认文件:dump.rdb
RDB的优点、缺点
优点:
- 适合大规模的数据恢复(存储在文件中,redis开机会还原到内存)
- 对数据的完整性要求不高
缺点:
- 需要一定的时间间隔触发,若遇到进程退出、服务器宕机等情况,最后一次修改的数据会丢失。
触发快照的条件
1.redis.conf中save 满足配置 save [seconds] [changes]
- save m秒 n个键改变
save <seconds> <changes>
如果不需要持久化,可以注释所有save行来停用该功能。
2. 执行 flushall 命令
3. 退出Redis
- 备份会自动生成一个
dump.rdb
- 下次启动Redis,会将文件中的数据还原到内存中
AOF(Append Only File)
- 以日志形式记录redis执行过的写命令。
- 文件中只能追加,不能修改
- redis启动后,会将日志中的命令从前到后执行一遍来恢复上次的数据。
开启AOF持久化机制
1.打开redis.conf文件
appendonly no-->appendonly yes
appendfilename "appendonly.aof"
事务
- Redis事务就是一组命令的集合,一个事务中的所有命令都会被序列化
- 不保证原子性——一个事务中的几个命令,只有发生错误的命令不执行,其他命令执行。(数据库原子性是事务中所有语句都执行或都不执行)
- Redis事务中没有隔离级别,可以隔离其他客户端,将一个事务中的命令执行完后,再让其他客户端中的命令执行,不会发生交替执行
- 事务的命令不会直接去执行,执行
exec
(execute)命令时才执行事务中的命令
redis 的事务
开启事务(multi)
命令入队(.....)
执行事务(exec)
放弃事务(discard)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15584.html