Redis总结篇(附Redis常见面试题)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 本文是对Redis系列文章的总结,涵盖了Redis的数据结构、主从复制、哨兵模式、Cluster分片方案等关键知识点,并附带了一些常见的Redis面试题。

前言

前面几篇文章分析了Redis数据结构,Redis主从复制,哨兵模式,Cluster分片方案,本文将以问题的形式对这些内容进行一个总结。

一、Redis支持哪些数据结构,以及底层的实现

数据结构类型 底层数据结构 使用场景
string sds(简单动态字符串) 1、分布式锁2、缓存数据3、计数器4、全局id 5、bitmap统计数据
hasher hashtableziplist(压缩列表) 1、redission存储分布式锁2、存储行数据
zset ziplistskiplist(多层级跳表) 1、排行榜
set intset(存整型)hashtable(存非整型) 1、用户信息2、用户点赞关注信息
list quicklist和ziplist组合 1、内存级消息队列,栈
geospatial indexes geoPoint数组 存储地理位置,如经纬度
hyperloglogs 基于string实现 1、大数据不精确统计数据

二、Redis为什么这么快?

1、key的全部操作基于内存存储和操作

2、k/v存储结构,时间复杂度O(1)

3、单线程操作,避免线程上下文切换,上下文切换需要消耗系统资源。这里的单线程是指处理客户端的请求是单线程的,可以把它叫做主线程。单线程的好处?

  • 没有创建线程,销毁销毁线程的开销。
  • 避免了上下文切换,cpu开销。
  • 避免线程之间竞争问题,比如加锁和解锁。死锁等问题。

4、数据据结构精细化设计,比如sds的惰性回收策略,预先分配策略,三种编码类型,hashes,zset多种编码切换,基于字节层面优化存储性能,不浪费一字节内存。

5、非阻塞多路复用io模型

三、Redis内存淘汰策略

淘汰策略 淘汰key的范围
Volatile-lru 设置了过期时间的最近最少使用的key,非传统lru算法,基于采样实现
All-lru 所有的key里面最近最少使用key
Volatile-lfu 设置了过期时间的使用频率最低的key,基于概率实现
All-lfu 所有的key里面使用频率最低的key
Volatile-random 设置了过期时间的随机的key
All-random 所有key里面随机的key

四、Redis实现分布式锁

1、为什么需要分布式锁?

由于在分布式系统中,跨jvm进程之间对共享资源进行互斥访问时,synchronized,lock无法实现。

2、实现分布式锁需要考虑的问题?

  • 互斥
  • 防止死锁
  • 性能
  • 可重入锁方式
  • 锁续约 看门狗,一个线程,1/3的时间去续约。

3、Redission是怎么用redis实现分布式锁的?

redission加锁形式,使用hashes结构。

通过lua脚本将value设置成加锁的次数,实现可重入锁特性。

释放锁就value减少,直到达到0后,删除key。

释放锁

加锁成功后开启续期定时任务

使用了netty中的时间轮组件来创建定时任务

Redission实现的分布式锁存在什么问题呢?

最大的问题,就是如果你对某个redis master实例,写入了myLock这种锁key的value,此时会异步复制给对应的master slave实例。但是这个过程中一旦发生redis master宕机,主备切换,redis slave变为了redis master。接着就会导致,客户端2来尝试加锁的时候,在新的redis master上完成了加锁,而客户端1也以为自己成功加了锁。此时就会导致多个客户端对一个分布式锁完成了加锁。这时系统在业务上一定会出现问题,导致脏数据的产生。所以这个就是redis cluster,或者是redis master-slave架构的主从异步复制导致的redis分布式锁的最大缺陷:在redis master实例宕机的时候,可能导致多个客户端同时完成加锁。

解决办法是什么呢?

官方是推荐使用红锁算法来解决。

五、​Redis哨兵和Cluster有哪些区别?

1、Redis哨兵弥补了Redis主从复制的缺陷,补充了自动故障转移的功能

2、Cluster则弥补了Redis哨兵机制和Redis主从复制中master单节点问题,提供了redis分片的能力​,将请求压力和存储压力分摊到多台Redis服务器上。​

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
18天前
|
存储 NoSQL Java
可能是最漂亮的Redis面试基础详解
我是南哥,相信对你通关面试、拿下Offer有所帮助。敲黑板:本文总结了Redis基础最常见的面试题!包含了Redis五大基本数据类型、Redis内存回收策略、Redis持久化等。相信大部分Redis初学者都会忽略掉一个重要的知识点,Redis其实是单线程模型。我们按直觉来看应该是多线程比单线程更快、处理能力更强才对,比如单线程一次只可以做一件事情,而多线程却可以同时做十件事情。但Redis却可以做到每秒万级别的处理能力,主要是基于以下原因:(1)Redis是基于内存操作的,Redis所有的数据库状态都保存在
可能是最漂亮的Redis面试基础详解
|
6天前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
|
12天前
|
NoSQL 算法 Redis
Redis面试篇
Redis面试篇
31 5
|
13天前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
25 1
|
1月前
|
存储 缓存 NoSQL
【Java面试题汇总】Redis篇(2023版)
Redis的数据类型、zset底层实现、持久化策略、分布式锁、缓存穿透、击穿、雪崩的区别、双写一致性、主从同步机制、单线程架构、高可用、缓存淘汰策略、Redis事务是否满足ACID、如何排查Redis中的慢查询
【Java面试题汇总】Redis篇(2023版)
|
18天前
|
NoSQL Redis
redis 的 key 过期策略是怎么实现的(经典面试题)超级通俗易懂的解释!
本文解释了Redis实现key过期策略的方式,包括定期删除和惰性删除两种机制,并提到了Redis的内存淘汰策略作为补充,以确保过期的key能够被及时删除。
37 1
|
2天前
|
存储 缓存 NoSQL
面试官:Redis如何实现延迟任务?
面试官:Redis如何实现延迟任务?
11 0
|
1月前
|
缓存 监控 NoSQL
阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略
大家好,我是 V 哥。粉丝小 A 面试阿里时被问到 Redis 的内存淘汰策略问题,特此整理了一份详细笔记供参考。Redis 的内存淘汰策略决定了在内存达到上限时如何移除数据。希望这份笔记对你有所帮助!欢迎关注“威哥爱编程”,一起学习与成长。
|
11天前
|
缓存 NoSQL 算法
面试题:Redis如何实现分布式锁!
面试题:Redis如何实现分布式锁!
|
2月前
|
缓存 NoSQL Redis
redis常见面试题总结(上)
Redis 提升读写性能,减少 MySQL 请求。优点包括:内存存储加速数据获取,支持多样数据结构如哈希和有序集合,事务确保操作原子性,具备队列、主从复制及持久化功能。相较于 Memcache,Redis 数据类型更丰富,支持数据持久化与恢复,单值大小可达 512MB。其单线程设计基于 C 语言实现,使用非阻塞 IO 复用来高效处理请求。主从同步机制确保数据一致性,首次同步需生成 RDB 文件。事务虽保证命令序列化执行但不支持回滚。Bigkey 会增加网络负载并可能导致内存不平衡。缓存雪崩、穿透等问题可通过分散过期时间和布隆过滤器解决。缓存预热则预先填充热点数据。
31 0