Java后端面试题(redis相关1)(day7)

目录

为什么要用Redis?


  1. 基于内存操作,内存读写速度快
  2. 支持多种数据类型,包括String、Hash、List、Set、ZSet等
  3. 支持持久化 ,Redis支持 RDBAOF 两种持久化机制,持久化功能可以有效地避免数据丢失问题
  4. 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
  5. 支持高并发,使用IO模型(epoll), 天生支持高并发.
  6. 工作线程单线程,即避免频繁的上下文切换,又避免了线程安全问题,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的优缺点:

  • 缺点 :
    1. 快照时间有间隔,不能实时备份,丢失数据可能会比较多
    2. 开启子进程备份数据,在数据集比较庞大时,fork()可能会非常耗时,造成服务器在一定时间内停止处理客户端。
  • 优点 :
    1. 恢复数据比较快
    2. 备份的文件就是原始内存数据的大小,不会额外增加数据占用

AOF方式

AOF(append only file)持久化:以独立日志的方式记录每次写命令,Redis重启时会重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,AOF 是Redis持久化的主流方式。

AOF的优缺点:

  • 优点 :
    1. 数据安全性高,不易丢数据
    2. AOF文件有序保存了所有写操作,可读性强
  • 缺点 :
    1. AOF方式生成文件体积变大
    2. 数据恢复速度比RDB慢

Redis是单线程,但为什么快?


  1. Redis 基于内存,内存的访问速度比磁盘快很多
  2. 单线程操作,避免了频繁的上下文切换
  3. 合理高效的数据结构
  4. 采用了非阻塞I/O多路复用机制 epool

Redis 过期删除策略


  1. 惰性删除 :放任键过期不管,但是每次从键空间中获取键时 ,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
  2. 定期删除 :每隔一段时间 程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定

Redis 内存淘汰策略


Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

Redis 提供 8 种数据淘汰策略:

LRU 全称Least recently used, 淘汰的是最近最久未使用的数据项。

LFU 全称Least-frequently used,淘汰的是最近访问频率最低的数据项,4.0及以上版本可用。

范围 淘汰策略名称 策略含义 人话
默认策略 noeviction 不淘汰数据;写不进去返回错误 不删除任意数据,这时如果内存不够时,会直接返回错误
只针对设置 过期的keys volatile-lru 根据 LRU 算法挑选数据淘汰 从设置了过期时间的数据集中,选择最近最久未使用的数据释放
只针对设置 过期的keys volatile-lfu 根据 LFU 算法挑选数据淘汰 淘汰掉设置了过期时间的key过去被访问次数最少的数据
只针对设置 过期的keys volatile-random 随机挑选数据淘汰 从设置了过期时间的数据集中,随机
只针对设置 过期的keys volatile-ttl 挑选越早过期的数据进行删除 从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作 所有keys
所有keys allkeys-lru 根据 LRU 算法挑选数据淘汰 从数据集中(包括设置过期时间以及未设置过期时间的数据集中) 选择最近最久未使用的数据释放
所有keys allkeys-random 随机挑选数据淘汰 随机选择一个数据进行释放
所有keys allkeys-lfu LFU 算法挑选数据淘汰 淘汰掉过去被访问次数最少的一条数据
所有keys
相关推荐
monkey_meng20 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
七星静香21 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员22 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU22 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie626 分钟前
在IDEA中使用Git
java·git
Elaine20239141 分钟前
06 网络编程基础
java·网络
G丶AEOM42 分钟前
分布式——BASE理论
java·分布式·八股
落落鱼201343 分钟前
tp接口 入口文件 500 错误原因
java·开发语言
想要打 Acm 的小周同学呀44 分钟前
LRU缓存算法
java·算法·缓存
hlsd#1 小时前
go 集成go-redis 缓存操作
redis·缓存·golang