Redis面试题

Redis 是一个高性能的键值对数据库,常用于缓存、消息队列、排行榜等场景。它支持丰富的数据类型,如字符串、哈希、列表、集合和有序集合。Redis 的优点包括高读写速度、数据持久化和事务支持,但受限于内存大小,不适用于海量数据。在主从复制和集群方案中,Redis 可以实现高可用性和数据一致性。面试中常见的问题涉及Redis的数据淘汰策略、哈希槽、避免缓存穿透、雪崩等问题,以及如何利用Redis实现异步队列和延时队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主题 链接
Java基础知识 面试题
Java集合容器 面试题
Java并发编程 面试题
Java底层知识 面试题
Java常用框架 面试题
计算机网络 面试题
数据库 面试题
RabbitMQ 面试题
Redis 面试题
Elasticsearch 面试题
Zookeeper 面试题
系统设计 面试题

为什么用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,满足大部分的使用要求
在这里插入图片描述

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,区别在于内存结构的不同。

struct sdshdr{
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值