redis持久化策略
Redis 中常用的两种持久化策略:
- RDB(Redis DataBase):
- RDB 是将 Redis 在内存中的数据定期保存到磁盘上的一种持久化方式。通过快照的方式,将数据保存为一个压缩的二进制文件(.rdb 文件)。
- RDB 的优点是备份数据快速,适合用于数据恢复和全量备份;同时由于是紧凑的二进制文件,可以减少磁盘空间的占用。
- RDB 的缺点是可能会出现数据丢失,因为数据是定期保存的;另外,在数据量较大时,生成快照可能会影响 Redis 的性能。
- AOF(Append Only File):
- AOF 是通过将 Redis 所有写操作追加到文件末尾的方式来记录数据变动的一种持久化方式。当 Redis 重启时,可以通过重新执行 AOF 文件中的写操作来还原数据。
- AOF 的优点是数据更加安全,可以保证每次写操作都被记录下来;同时,AOF 文件可以提供更好的数据持久性保证。
- AOF 的缺点是相对于 RDB,AOF 文件通常会比较大,可能会增加磁盘的占用;另外,AOF 文件的恢复速度可能会比 RDB 恢复慢一些。
除了单独使用 RDB 或 AOF 外,Redis 还支持同时使用 RDB 和 AOF 两种持久化方式,以提供更好的数据持久性和灾难恢复能力。此外,Redis 也支持实时数据同步(Replication)来提高数据的可用性和容错能力。
redis内存淘汰策略
Redis支持8种不同的内存淘汰策略:
- noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。
- volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
- allkeys-random:对全体key ,随机进行淘汰。也就是直接从db->dict中随机挑选
- volatile-random:对设置了TTL的key ,随机进行淘汰。也就是从db->expires中随机挑选。
- allkeys-lru: 对全体key,基于LRU算法进行淘汰
- volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰
- allkeys-lfu: 对全体key,基于LFU算法进行淘汰
- volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰
比较容易混淆的有两个算法:
- LRU(LeastRecentlyUsed),最近最久未使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
- LFU(LeastFrequentlyUsed),最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。
redis数据删除
Redis的过期KEY删除策略有两种:
- 惰性删除
- 周期删除
惰性删除,顾明思议就是过期后不会立刻删除。Redis会在每次访问KEY的时候判断当前KEY有没有设置过期时间,如果有,过期时间是否已经到期。
周期删除:顾明思议是通过一个定时任务,周期性的抽样部分过期的key,然后执行删除。
redis是单线程吗
Redis 4.0 以前是完全单线程;
Redis从4.0开始,也有后台线程在工作,处理一些较为缓慢的操作,例如无用连接的释放、大 key 的删除等;
Redis 6.0引入多线程IO,只是用来处理网络数据的读写和协议的解析,而执行命令依旧是单线程,所以不需要去考虑set/get、事务、lua等的并发问题
为什么单线程快
- 纯内存操作,避免大量访问数据库,减少直接读取磁盘数据,redis将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度快.
- 单线程操作,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗.
- 采用了非阻塞I/O 多路复用机制.