目录
- 为什么要用Redis?
- Redis到底是多线程还是单线程?
- Redis数据持久化机制
- RDB方式
- AOF方式
- Redis是单线程,但为什么快?
- Redis 过期删除策略
- Redis 内存淘汰策略
为什么要用Redis?
- 基于内存操作,内存读写速度快
- 支持多种数据类型,包括String、Hash、List、Set、ZSet等
- 支持持久化,Redis支持
RDB
和AOF
两种持久化机制,持久化功能可以有效地避免数据丢失问题 - 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
- 支持高并发,使用IO模型(epoll), 天生支持高并发.
- 工作线程单线程,即避免频繁的上下文切换,又避免了线程安全问题,Redis6.0之后IO线程引入了多线程
Redis到底是多线程还是单线程?
对于Redis到底是多线程还是单线程,分为两个阶段:
- Redis 6.0 之前:
Redis是 单线程 的,IO操作和计算操作串行执行 - Redis 6.0之后 :
Redis 将IO操作交给IO线程处理,并且使用线程池,使 IO线程实现多线程 并行执行IO操作,而计算操作由工作线程处理,工作线程仍保持单线程。
Redis数据持久化机制
持久化就是把内存的数据写到磁盘中,防止服务宕机导致内存数据丢失。
Redis支持两种方式的持久化,一种是 RDB
的方式,一种是 AOF
的方式。前者会根据指定的规则定时将内存中的数据存储在硬盘上,而后者在每次执行完命令后将命令记录下来。一般将两者结合使用。
RDB方式
RDB
是 Redis 默认的持久化方案。RDB
持久化时会将内存中的数据写入到磁盘中,也就是快照(Snapshot),数据恢复是将快照文件直接读到内存中。
RDB的优缺点:
- 缺点 :
- 快照时间有间隔,不能实时备份,丢失数据可能会比较多
- 开启子进程备份数据,在数据集比较庞大时,fork()可能会非常耗时,造成服务器在一定时间内停止处理客户端。
- 优点 :
- 恢复数据比较快
- 备份的文件就是原始内存数据的大小,不会额外增加数据占用。
AOF方式
AOF(append only file)持久化:以独立日志的方式记录每次写命令,Redis重启时会重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,AOF 是Redis持久化的主流方式。
AOF的优缺点:
- 优点 :
- 数据安全性高,不易丢数据
- AOF文件有序保存了所有写操作,可读性强
- 缺点 :
- AOF方式生成文件体积变大
- 数据恢复速度比RDB慢
Redis是单线程,但为什么快?
- Redis 基于内存,内存的访问速度比磁盘快很多
- 单线程操作,避免了频繁的上下文切换
- 合理高效的数据结构
- 采用了非阻塞I/O多路复用机制 epool
Redis 过期删除策略
- 惰性删除 :放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
- 定期删除 :每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定
Redis 内存淘汰策略
Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
Redis 提供 8 种数据淘汰策略:
LRU 全称Least recently used, 淘汰的是最近最久未使用的数据项。
LFU 全称Least-frequently used,淘汰的是最近访问频率最低的数据项,4.0及以上版本可用。
范围 | 淘汰策略名称 | 策略含义 | 人话 |
---|---|---|---|
默认策略 | noeviction | 不淘汰数据;写不进去返回错误 | 不删除任意数据,这时如果内存不够时,会直接返回错误 |
只针对设置 过期的keys | volatile-lru | 根据 LRU 算法挑选数据淘汰 | 从设置了过期时间的数据集中,选择最近最久未使用的数据释放 |
volatile-lfu | 根据 LFU 算法挑选数据淘汰 | 淘汰掉设置了过期时间的key过去被访问次数最少的数据 | |
volatile-random | 随机挑选数据淘汰 | 从设置了过期时间的数据集中,随机 | |
volatile-ttl | 挑选越早过期的数据进行删除 | 从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作 所有keys | |
所有keys | allkeys-lru | 根据 LRU 算法挑选数据淘汰 | 从数据集中(包括设置过期时间以及未设置过期时间的数据集中) 选择最近最久未使用的数据释放 |
allkeys-random | 随机挑选数据淘汰 | 随机选择一个数据进行释放 | |
allkeys-lfu | LFU 算法挑选数据淘汰 | 淘汰掉过去被访问次数最少的一条数据 |