Redis的面试题
Redis的五中数据类型以及应用场
在redis中string是可以修改de被称之为动态字符串.其中内部更像arraylist
内部维护一个字节数组,在其内部分配了一定的空间.
内存分配机制
当字符串的长度小于1m的时候,每次扩容都是加倍空间
当字符串长度超过1m的时候每次扩容只会扩张1m的空间
字符串的最大长度是512mb.
各种高频搜索de数据做缓存k为自定义的搜索id 值为搜索得值.
-
list 列表
Redis
中的list
和Java
中的LinkedList
很像,底层都是一种链表结构, list
的插入和删除操作非常快,时间复杂度为 0(1),不像数组结构插入、删除操作需要移动数据。
但list的数据结构可不是双向列表
当数据量较少的时候它的底层数据节后为一块连续的内存 被称为 ziplist
就是说底层所有元素紧挨着 分配的是一块连续的储存空间,当数据量较多的时候就会变成 quicklist(快速链表.) 可是由于链表的前后指针回prev和next会占用较多的内存 首先会占用空间其次会加重内存碎片化 在redis3.2之后都改成了ziplist+链表的混合结构
应用场景
由于list是一个按照顺序排列的列表所以应用场景一般是
队列功能比如消息队列.
朋友圈滇藏.评论列表排行榜每次通过lpush命令和lrange命令能实现最近新列表功能
3hash(字典)
redisd的hash结构和java的hashmap相识是数 数组加列表的结构 当发生hash碰撞的时候就会把新元素追加链表上 在redis中 hashdevalsh只能是字符串
hash和string都可以存储用户信息但不同的是hash可以对用户de信息每个字段进行单独的存储.除了大key还有hashde小key. String是存储整个字符串要修改要拿出整个值 解析成对象在存入 hash的话可以直接对某个字段进行修改 从而节省网络de流量.不过hashde内存占用大于string
应用场景
购物车 hsehde key field value 三个命令可以实现以用户的id 商品id为 field商品的数量为值value 恰好构成了购物车三要数.
第二个也可以用于存储对象 相当于吧string 序列后的jsen对象存储到hash的里面
4 set(无序集和)
redisd 的set和java中的hashset有些类似 内部的键值对是无序且唯一的 内部实现的话相当于一个特殊的字典,字典中的value相当于都是一个值 null 当集中最后一个元素呗移除后数据结构被回收删除
1好友关注 粉丝 感兴趣的的人集和
sinter命令可以获取的到a和b的共同好友
sismember命令可以判断a是否是b的好友
scard命令可以获取好友的数量
关注的实施smove命令可以将b从a的粉丝转移到a的好友集和.
2首页的随机展示:比如美团的首页有很多推荐的商家,并不能全部推荐 set适合存放所有的展示内容二srandmember命令可以随机获取几个展展示
存储活动中奖的id 因为set的值是不可重复得 可以保证不会重复中奖.
5zset
首先数据是一个set保证和数据的值唯一性 另外还可以给每个值value赋予一个 排序权重 内部是一种跳跃列表的结构.
应用场景的话可以用作排行榜但是和list不同的是做到一个动态排序 例如
value存储用户id score设置为关注时间就可以按关注时间排序.
zset还可以存学生的id score存考试de城市
redisde持久化机制
他的持久化机制有两种一种是(rdb)快照 一种是(aof) 日志 快照的话是全量的一个备份 日志是连续的增加备份 .
快照机制是redis默认开启de,她会根据配置的策略将内存的数据保存在本地的二进制文件中
官方提供两种方式生成快照 一种是save命令但是有缺点会阻塞我们的主进程当如果数据很大的时候会导致整个redis不可使用.
第二个命令是bgsave命令 就是在主进程的基础上生成一个字进程 会共享主进程的代码和数据段 ,相当于在后台生成一个快照
关键在主进程进行读取操作的时候两个进程是互不影响如果是修改那么修改的数据块就会被复制进本地的二进制文件rdb中.在这过程中主进程依旧可以修改数据
每次要更换旧derdb文件
相当于定时操作备份全盘
-
Redis宕机后数据恢复快
-
可以恢复多个版本的数据如何有备份本地文件的保存点
-
二进制文件体积小
-
缺点丢失的数据更多
aof机制的就是每次都先将要存储的以日志的形式记录key发生变化的指令备份到缓存中每隔默认1秒就存储到本地的文件上
AOF 文件是一个只进行追加操作的日志文件(append only log), 因此对 AOF 文件的写入不需要进行 seek
将所有的指令操作以文本的形式存储到文件中
Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
恢复是先恢复aof再恢复rdb
*AOF 的缺点*
对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积
redis内存淘汰机制
redis会把每个设置了过期时间的key都放入一个独立的字典中以后定期遍历这个字典
定期删除
1 redis不会遍历所有的字典默认每次十秒随机从过期字典中key抽取20个key
2删除这个20个key中的已经过期的key
3如果过期比例超过了四分之一则重复扫描
-
noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键
-
allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键
-
volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键
-
allkeys-random:加入键的时候如果过限,从所有key随机删除
-
volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐
-
volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键
-
volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键
-
allkeys-lfu:从所有键中驱逐使用频率最少的键
一般会选择 volatile-lru第三个
惰性删除
简单来说就是当你访问这个key的时候Redis会对这个key进行检查如果过期了就删除立即删除不会返回数据. 相当于没被定期删除检查到的key你来访问的时候也会删除掉不会给你返回数据
redis如何保证高可用
-
主要是数据持久化
-
主从同步
redis的主从同步模式分为主从模式和从从模式主从模式是一个节点多个从节点
从从从模式从一级节点下还有从节点
好处可以读写分离 把写入得操作请求分发到主节点上,把读的操作分到从节点上 可以减轻主节点的压力提高运行速度
当单一节点损坏其他节点可以复制完整的输数据
主从复制的数据还提高而了数据的安全性
-
redis哨兵模式
redis得主从同步的话如果主节点发生了宕机的话必须人工介入.
于是有了哨兵模式 .哨兵模式就是来监听主从服务器de当.主从服务器发生了故障redis哨兵提供自动容灾修复功能
原理是哨兵服务器每一秒向主从服务器发送一次ping请求如果主服务超过
秒有响应哨兵则认为该服务器以下机如果是主服务器下机的话哨兵会 按照规则自动推出主服务器 并完成主服务器de自动切换功能
-
redis集群
-
集群一般主节点负责读写从节点负责同步数据
有多个主节点同时每个主节点有多个从节点,将数据分布在不同的主服务器上,以此来降低系统对单主节点的依赖,并且可以大大提高 Redis 服务的读写性能
Redis 集群,除了可以提供主从和哨兵的功能之外,还提供了多个主从节点的集群功能,这样就可以把数据均匀的存储各个主机主节点上,实现了系统的横向扩展,大大提高了 Redis 的并发处理能力
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统