一. redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构
回答: 五种
1.string
2.list
可以做为简单队列,和分页功能
3.hash
存放结构化数据,例如 用户信息等等
4.set
存放不重复数据,求差集,交集,并集等等
5.sorted set
相比set 多了一个score 分数,可以根据分数进行排序
二. redis的过期策略以及内存淘汰机制
回答: redis采用定期清除和惰性删除的策略
redis 并不是每隔100ms 扫描全部的key 而是根据随机抽取一定得key
进行检查key 是否过期, redis 也会在你获取某个key的时候进行检查
当前key 时候过期。 但是不管是定期清除还是惰性清除都会造成有些key
没被清除这样内存中key会越来越多,占用空间越来越大,这时候就需要
内存淘汰机制
配置内存淘汰机制在redis.conf中配置maxmemory-policy 属性
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
allkeys-random:从数据集中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据,新写入操作会报错
三. redis 持久化方式
回答 redis持久化有两种 aof 和rdb
RDB: rdb持久化方式是指在指定间隔时间内数据集写入快照(Snapshot)
实际操作是fork()出一个子进程 将当前父进程的数据复制到子进程
在有子进程写入临时文件,会在对应的目录下生成dump.rdb 文件
AOF : aof 是以日志形式记录每一次 写、删除、更新操作 通过wirte函数
拼接到文件默末尾
AOF在运行效率上往往会慢于RDB 并且 AOF 文件比RDB大
四、单线程redis 速度为什么这么快
回答 redis 单线程不存在上下文切换, 使用io多路复用模型
五、缓存雪崩、缓存穿透、缓存击穿等问题
缓存穿透 是指用户在查询数据时候数据库没有缓存自然也没有,
这样用户 查询的时候每次都会去查询数据库相当于进行了两次没用的查询
解决办法
1. 布隆过滤器
2. 暴力解决 如果数据库没有 直接给缓存设置占位符设置个过期时间时间
不要太长太长时间也没用
缓存雪崩 缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量
巨大,引起数据库压力过大甚至down机
解决办法
1、置热点key 永不过期
2、果缓存数据库是分布式部署,将热点数据分布在不同数据库
3、尽量分散key过期时间 避免大量key 同一时间失效
缓存击穿 是指数据库中有数据但是缓存中没有这时候由于并发用户
特别多同时读取数据库造成数据库瞬间压力加大
解决办法
1.设置热点key 永不过期
2.添加分布式锁(互斥锁)
六、redis 实现分布式锁
1、redisson框架
2、使用set 命令 不能使用setnx 和expire组合 不能保证原子性
参考地址
建议使用Redisson框架
七、redis并发竞争key 问题
1、使用分布式锁
2、使用队列
八、redis 哨兵 主从 集群 概念
九、redis 为什么是单线程
首先多线程操作的本质就是cpu模拟多个线程来操作 那么就会存在上下文切换的损耗,而对于内存系统来说没有上下文切换是效率最高的,一般内存系统的瓶通常在于带宽,网络io等等。
十、redis 部署方式 (主从、哨兵、集群等等)
redis常见面试题汇总
最新推荐文章于 2024-06-26 09:40:48 发布