2022 最新 互联网 Java 工程师面试题Redis面试题

本文详细介绍了Redis的基础知识,包括Redis的适用场景、优缺点、为何选择Redis而非map/guava做缓存、其高性能的原因、数据类型如string、hash、list、set、zset的使用和内部实现,以及Redis的数据淘汰策略、集群方案、哈希槽概念、高可用方案、缓存穿透、雪崩、击穿问题及解决方案。此外,还讨论了Redis实现异步队列和延时队列的方法、主从复制的实现和切换、数据丢失处理,以及持久化策略等。
摘要由CSDN通过智能技术生成

文章目录

    • 什么是Redis
    • Redis 有哪些适合的场景?
    • Redis有哪些优缺点
    • 为什么要用 Redis 而不用 map/guava 做缓存?
    • Redis为什么这么快
    • Redis有哪些数据类型
    • string
    • hash
    • list
    • set
    • zset
    • Redis 有哪几种数据淘汰策略?
    • Redis 集群方案应该怎么做?都有哪些方案?
    • 说说 Redis 哈希槽的概念?
    • Redis高可用方案
    • 什么是缓存穿透?
    • 怎么避免缓存穿透?
    • 什么是缓存雪崩?
    • 怎么避免缓存雪崩?
    • 什么是缓存击穿?何如避免?
    • Redis 实现异步队列
    • Redis 实现延时队列
    • redis 主从复制如何实现的?
    • Redis怎么做主从切换?数据丢失怎么办?
    • Redis 持久化
    • 缓存与数据库不一致怎么办
    • 主从数据库不一致如何解决
    • Redis 常见的性能问题和解决方案
    • 假如 Redis 里面有 1 亿个 key ,其中有 10w 个 个 key 是以某个固定的已知的前缀开头的,如何将它们全部找出来?
    • MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?

为什么用redis,怎么使用的
使用了哪些数据结构
介绍sortedset
你会怎么实现sortedset
SoertedSet使用红黑树、跳表哪个实现更好?

什么是Redis

  • Redis(Remote Dictionary Server) 是一个使用 C语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。
  • Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
  • 与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,Redis 经常用来做分布式锁。
  • Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。

Redis 有哪些适合的场景?

  • 缓存
  • 排行榜:使用Redis的SortSet数据结构
  • 计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等
  • 好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能;
  • 简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,完成异步解耦;
  • Session共享
  • 分布式锁

Redis有哪些优缺点

优点

  • 读写性能优异
  • 支持数据持久化,支持AOF和RDB两种持久化方式。
  • 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
  • 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

缺点

  • 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
  • Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
  • Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

为什么要用 Redis 而不用 map/guava 做缓存?

  • map/guava属于本地换成,最主要的特点是轻量以及快速,生命周期随着 jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
  • 使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持服务的高可用,架构上较为复杂。

Redis为什么这么快

  • 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于 HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
  • 数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
  • 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
  • 使用多路 I/O 复用模型,非阻塞 IO;
  • 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

Redis有哪些数据类型

Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求
image.png

string

Redis的数据结构

字符串类型是 Redis 最基础的数据结构,键都是字符串类型,而且其他几种数据结构都是在字符串类型的基础上构建的。字符串类型的值可以实际可以是字符串(简单的字符串、复杂的字符串如 JSON、XML)、数字(整形、浮点数)、甚至二进制(图片、音频、视频),但是值最大不能超过 512 MB。

设置值
set key value [ex seconds] [px millseconds] [nx|xx]
ex seconds:为键设置秒级过期时间,跟 setex 效果一样
px millseconds:为键设置毫秒级过期时间
nx:键必须不存在才可以设置成功,用于添加,跟 setnx 效果一样。由于 Redis 的单线程命令处理机制,如果多个客户端同时执行,则只有一个客户端能设置成功,可以用作分布式锁的一种实现。
xx:键必须存在才可以设置成功,用于更新

获取值
get key ,如果不存在返回 nil
批量设置值
mset key value [key value…]
批量获取值
mget key [key…]

计数
incr key
incr 命令用于对值做自增操作,返回结果分为三种:① 值不是整数返回错误。② 值是整数,返回自增后的结果。③ 值不存在,按照值为 0 自增,返回结果 1。除了 incr 命令,还有自减 decr、自增指定数字 incrby、自减指定数组 decrby、自增浮点数 incrbyfloat。

string 的内部编码
字符串对象底层数据结构实现为简单动态字符串(SDS)和直接存储,但其编码方式可以是int、raw或者embstr,区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值