实习面经摘录(七)

来自网络,供个人学习,侵删 某手

先完成后完美

1.慢sql怎么排查,怎么优化

开启慢查询日志、分析执行计划(EXPLAIN)、实施监控

优化策略:1.索引优化,利用覆盖索引减少回表

2.SQL改写:避免SELECT * ,查询所需字段

2.sql注入是什么,举个例子

3.使用什么存储引擎,为什么

InnoDB;

1.事务支持:支持ACID事务

2.行级锁:并发性能好,锁粒度小,适合高并发写操作

3.崩溃恢复,拥有redo log 和undo log,具备更好的故障恢复能力

4.redis主要存什么什么情况的数据,除了redis还有哪些缓存方案

1.热点数据

2.会话状态:session、token

3计数器:点赞数、浏览量、库存扣减

4临时数据:验证码

5.复杂结构:排行榜(Zset)、消息队列(List/stream)位图计算

5.用的多的redis数据类型说一下

  1. String(字符串):最基础,用于缓存对象、计数器(INCR)、分布式锁(SETNX)。
  2. Hash(哈希):存储对象(如用户信息),可单独修改字段,节省内存。
  3. List(列表):双向链表,用于消息队列、最新列表(如微博动态)。
  4. Set(集合):去重,用于好友关系、共同关注、抽奖(随机获取)。
  5. ZSet(有序集合) :带分数的Set,用于排行榜、延时队列。
    (进阶:Bitmap用于签到统计,HyperLogLog用于UV统计,Geo用于地理位置)

6.并发场景下的数据类型说一下

在并发场景下,主要利用Redis的原子性操作:

  1. String:使用 INCR/DECR 做高并发计数器(如库存扣减、秒杀),避免并发竞态条件。
  2. String (SETNX):实现分布式锁,防止集群环境下重复执行任务。
  3. List:利用 LPUSH + RPOP(或 BRPOP)实现生产者-消费者模型的消息队列,处理削峰填谷。
  4. ZSet:利用分数作为时间戳,实现延时队列或按权重处理的并发任务。
  5. Lua脚本:将多个操作封装成Lua脚本,保证复杂逻辑在并发下的原子性。

7.为啥选择kafka,其他两个了解吗

高性能、高拓展、高可用、持久化

kafka超高吞吐量:基于顺序写磁盘和零拷贝技术

RocketMQ用mmap + write技术实现零拷贝

是一个典型的"大数据量、高吞吐、顺序处理"场景,而不仅仅是简单的"任务分发"场景。

8.redis哨兵模式了解吗,节点挂了,哨兵模式怎么做的

  • 了解:哨兵(Sentinel)是Redis的高可用解决方案,负责监控主从节点状态,实现自动故障转移。
  • 节点挂了的处理流程:
    1. 主观下线:哨兵检测到主节点无响应,标记为"主观下线"。
    2. 客观下线:多数哨兵达成共识,标记为"客观下线"。
    3. 选举Leader:哨兵集群通过Raft算法选举出一个Leader哨兵负责故障转移。
    4. 挑选新主:Leader根据优先级、复制进度等规则,从从节点中选出一个新的主节点。
    5. 切换与通知:Leader命令选中的从节点提升为主节点,命令其他从节点复制新主,并通知客户端新的主节点地址。

Redis 数据类型命令行终端 (redis-cli) 中运行的命令演示。

1. String (字符串)

场景 :缓存、计数器、分布式锁 (SETNX)

复制代码
# --- 缓存对象 ---
# 设置 key 和 value,ex 表示过期时间(秒)
SET user:1001 "{\"id\":1001, \"name\":\"Alice\", \"vip\":true}" EX 300
# 获取
GET user:1001

# --- 计数器 (INCR) ---
# 先重置为0 (可选)
SET article:888:views 0
# 自增
INCR article:888:views
INCR article:888:views
# 查看结果
GET article:888:views

# --- 分布式锁 (SETNX 的现代用法) ---
# 尝试加锁:如果 lock:order:9527 不存在,则设置为 "client_uuid_1",并设置10秒过期
# NX = Not Exists, EX = Expire
SET lock:order:9527 "client_uuid_1" NX EX 10
# 返回 (integer) 1 表示成功,(integer) 0 表示失败(锁已被占用)

# 再次尝试加锁 (应该失败)
SET lock:order:9527 "client_uuid_2" NX EX 10

# 模拟释放锁 (先检查 value 是否匹配,再删除,实际生产建议用 Lua 脚本)
DEL lock:order:9527

2. Hash (哈希)

场景:存储对象,单独修改字段

复制代码
# --- 存储用户信息 ---
# HSET key field value
HSET user:info:1002 name "Bob" age 25 city "Beijing"

# --- 单独修改字段 ---
# 年龄 + 1
HINCRBY user:info:1002 age 1

# --- 获取数据 ---
# 获取单个字段
HGET user:info:1002 name
# 获取所有字段
HGETALL user:info:1002
# 获取指定字段
HMGET user:info:1002 name city

3. List (列表)

场景:消息队列、最新列表 (微博动态)

复制代码
# --- 消息队列 ---
# 左侧推入任务 (LPUSH)
LPUSH queue:tasks "task_1" "task_2" "task_3"
# 查看队列
LRANGE queue:tasks 0 -1

# 右侧弹出任务 (消费)
RPOP queue:tasks

# --- 最新列表 (保留最新 5 条) ---
# 不断推入新动态
LPUSH feed:user:101 "Post_A" "Post_B" "Post_C" "Post_D" "Post_E" "Post_F" "Post_G"
# 修剪列表,只保留索引 0 到 4 (共5条),多余的自动丢弃
LTRIM feed:user:101 0 4
# 查看结果 (应该是 Post_G 到 Post_C)
LRANGE feed:user:101 0 -1

4. Set (集合)

场景:去重、共同关注、抽奖

复制代码
# --- 添加成员 (自动去重) ---
SADD follow:user:A "News" "Tech" "Sports" "Music"
SADD follow:user:B "Tech" "Music" "Food" "Travel"

# --- 共同关注 (交集) ---
SINTER follow:user:A follow:user:B

# --- 抽奖 (随机获取 1 个) ---
SRANDMEMBER follow:user:A 1

# --- 查看集合所有成员 ---
SMEMBERS follow:user:A

5. ZSet (有序集合)

场景:排行榜、延时队列

复制代码
# --- 排行榜 (分数越高排名越前) ---
# ZADD key score member
ZADD rank:game 100 "Player_A"
ZADD rank:game 500 "Player_B"
ZADD rank:game 300 "Player_C"

# 更新分数 (Player_A + 200)
ZINCRBY rank:game 200 "Player_A"

# 获取前三名 (从高到低: REVse range)
ZREVRANGE rank:game 0 2 WITHSCORES

# --- 延时队列 (分数 = 执行时间戳) ---
# 假设当前时间是 1715600000
# 任务1: 2秒后执行 (1715600002)
ZADD queue:delay 1715600002 "task_delay_1"
# 任务2: 5秒后执行 (1715600005)
ZADD queue:delay 1715600005 "task_delay_2"

# 查询当前已到期任务 (分数 <= 当前时间)
# 这里模拟当前时间是 1715600003
ZRANGEBYSCORE queue:delay 0 1715600003

6. 进阶类型 (Bitmap, HyperLogLog, Geo)

复制代码
# --- Bitmap (签到统计) ---
# 用户 1 在第 1 天 (offset 0) 和第 3 天 (offset 2) 签到
SETBIT sign:2023-10-u1 0 1
SETBIT sign:2023-10-u1 2 1
# 统计签到天数
BITCOUNT sign:2023-10-u1

# --- HyperLogLog (UV 统计) ---
# 模拟添加 1000 个用户 (循环太慢,这里演示几个)
PFADD uv:site:user "user_1" "user_2" "user_3" "user_1" # user_1 重复
# 估算数量 (会自动去重)
PFCOUNT uv:site:user

# --- Geo (地理位置) ---
# 添加北京两个地点 (经度 纬度 名称)
GEOADD city:beijing 116.4074 39.9042 "TianAnMen"
GEOADD city:beijing 116.3974 39.9092 "ForbiddenCity"

# 查询 TianAnMen 附近 5 公里内的地点
GEORADIUS city:beijing 116.4074 39.9042 5 km
相关推荐
星幻元宇VR2 小时前
沉浸式体验:VR交通安全学习机的教育魅力
科技·学习·vr·虚拟现实
醇氧2 小时前
Spring AI Alibaba 学习(一) 集成阿里云百炼大模型应用
java·学习·spring
Nan_Shu_6142 小时前
学习: 尚硅谷Java项目之小谷充电宝(4)
学习
71-32 小时前
VMware没网的处理方式
笔记·学习
微露清风2 小时前
系统性学习Linux-第五讲-基础IO
linux·运维·学习
風清掦2 小时前
【江科大STM32学习笔记-08】DMA直接存储器存取
笔记·stm32·单片机·嵌入式硬件·学习
Nan_Shu_6142 小时前
学习: 尚硅谷Java项目之小谷充电宝(5)
学习
zhouping@2 小时前
JAVA的学习笔记day05
java·笔记·学习
小陈phd3 小时前
多模态大模型学习笔记(十二)——transformer学习之Embedding
笔记·学习·transformer