java中小型公司面试预习资料(二):Redis

Redis是必不可少的,也是最常用的

一、数据结构

1、基本数据类型

字符串(String): 缓存、计数器(限流器)、分布式锁。
列表(List): 消息队列、最新消息列表。
哈希(Hash): 存储对象属性(如用户信息)。
集合(Set): 去重(如点赞用户ID,抽奖的中奖名单)。
有序集合(Zset): 排行榜、延迟队列(通过分数score排序)。

2、高级数据结构

地理位置(Geo): 适合存储和查询具有地理位置信息的数据,如用户位置、附近的商家、地理围栏等。
基数统计(HyperLogLog): 适合用于统计网站的 UV、独立 IP 数、用户访问量等场景。
位图(Bitmap): 适合用于统计和分析大规模数据,例如用户的活跃情况、网站的访问情况、商品的销售情况等。

3、数据用法

计数器或限流器(String):

复制代码
// 初始化一个key,值为"0"的字符串
SET key 0
// 每当计数器增加/减少时,使用INCR/DECR命令对键的值进行递增操作。
INCR key 
// 使用GET命令来获取当前值。
GET key
//如果是限流操作,初始化时,EXPIRE设置有效期
SET key 0 EX 60

分布式锁(String):

复制代码
//设置一个唯一的键和值,并设置过期时间. value值可以存储一些获取到锁的宿主信息
SETNX lock_name value EX <lock_timeout>

简单消息队列(List):

生产者:使用LPUSH命令将消息插入到List的左侧。

消费者:使用RPOP命令从List的右侧按顺序读取。

阻塞读取:BRPOP命令可以避免消费者在没有消息时不断轮询队列,该命令会阻塞直到有新消息到达。

保持列表长度:使用LTRIM命令设置List的范围,从而保持其长度不超过指定的大小。

二、高可用与集群

1、主从复制

一个主节点可以拥有多个从节点

2、哨兵(Sentinel)

复制代码
多个sentinel组成sentinel集群(也可以一个)。sentinel是一个特殊模式的Redis服务器.

A.当主服务器超过用户设定的下线时长,则sentinel会从主服务器下的从服务器中挑选一条成为主服务器。

B.sentinel向其他所有从服务器发新的复制命令,让它们成为新的主服务器的从服务器,以实现故障转移。

C.sentinel会继续监视已下线的主服务器,当它重新上线将它设置为新的主服务器的从服务器。

领导Sentinel出现异常后通过选举模式选出新的领导Sentinel。

3、Cluster集群模式

客户端在向Redis Cluster发送命令时,只需要提供键名。Redis Cluster的节点会负责处理键到槽的映射和数据的路由。
哈希槽计算

计算键的CRC16值:

Redis使用CRC16算法来计算给定键的哈希值。

确定槽:

将计算出的CRC16哈希值对16384取模,得到的结果就是键应该被分配到的槽(slot)编号。

键到槽的映射:

根据这个槽编号,Redis Cluster知道将这个键存储在哪个节点上。

例如,如果某个键的CRC16值为5000,那么该键将被分配到槽编号为5000 % 16384 = 5000的槽上。

自动迁移

由于键到槽的映射是在服务器端完成的,因此当集群中的节点发生变化(如节点故障或增加新节点)时,Redis Cluster能够自动迁移数据以保持数据的完整性和可用性。

性能优化

优化数据分布和查询性能。例如,设计键名时可以考虑如何分布它们以避免热点问题(即某些节点因为某些特定模式的键而承受过多的负载)。总之,键到槽的映射是在Redis Cluster的服务器端进行的,客户端只需要发送完整的命令和键名即可。这种设计使得Redis Cluster既保持了高性能又易于管理。

三、持久化机制

1、RDB(快照)

原理:定时生成内存数据的二进制快照文件。

优点:恢复速度快,适合备份。

缺点:可能丢失最后一次快照后的数据。

2、AOF(追加日志)

原理:记录所有写操作命令,重启时重放日志。

优点:数据丢失风险低。

缺点:文件体积大,恢复速度慢。

3、混合模式(Redis 4.0+)

结合RDB和AOF,先加载RDB快照,再重放AOF增量日志。

四、缓存问题与事物

缓存穿透

现象:大量请求查询不存在的key,绕过缓存直接访问数据库。

解决:布隆过滤器拦截非法请求、缓存空值。

缓存击穿

现象:热点key过期后,高并发请求直接击穿到数据库。

解决:互斥锁(如SETNX)、永不过期策略+异步更新。

缓存雪崩

现象:大量key同时过期,导致数据库负载激增。

解决:随机过期时间、多级缓存(如本地缓存+Redis)。

事务

命令:MULTI(开启事务)、EXEC(执行)、WATCH(监控key)。

原子性:事务中的命令要么全部执行,要么全部不执行,但不支持回滚。

相关推荐
二哈赛车手3 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~3 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8293 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
发现一只大呆瓜4 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
未若君雅裁5 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记6 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI6 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
Patrick_Wilson6 小时前
知识沉淀的四层模型:从个人笔记到企业资产,让文档真正长出复利
面试·程序员·ai编程
Mr. zhihao7 小时前
深入解析redis基本数据结构
数据结构·数据库·redis