Redis

缓存
缓存穿透
查询不存在的数据,导致没有数据写入缓存,直击数据库
- 缓存空数据
- 内存占用高
- 布隆过滤器
- 底层是bitmap
- 可能发生误判,内存占用小
缓存击穿
key有过期时间,key过期的时候大量并发请求访问,那么可能同时触发缓存重建的过程,导致mysql被击垮
- 互斥锁
- 缓存重建时候需要拿锁,拿锁才能去重建缓存,其他线程等待
- 强一致,性能差
- 逻辑过期
- 不设置过期时间,逻辑过期
- 获取锁,异步重建缓存,直接返回旧数据
- 高可用,性能优
缓存雪崩
大量缓存集体过期,同时失效,或者Redis宕机
- 随机值过期
- Redis集群
- 限流降级
- 多级缓存
双写一致性
- 一致性要求高
-
允许延迟一致
- 读:直接返回,走缓存的路子
- 写:延迟双删
- 写删缓存后改数据库:
- 先改后删
- 上面都会导致数据不一致性
-
使用延时双删: 删两次,但不能保证完全 强一致性
- 其他解决方案:强一致性数据加锁
- 使用读写锁
- 读的时候用共享锁
- 写的时候用排他锁
- 追求最终一致性
- 使用消息中间件
持久化
- RDB
- 把内存数据存储到硬盘中
- save/ bgsave 是否使用主进程
- redis.conf
- 执行原理:fork主线程,完成fork之后读取内存数据写入RDB文件
- RDB期间如何保证数据一致性, 使用 copy on write
- AOF
- Append Only file
- 默认关闭
- bgrewriteaof, 可以设置重写机制

数据过期策略
- 惰性删除
- 需要使用的时候,再检查是否过期,过期了就删除
- cpu友好,内存不友好
- 定期删除
- 每隔一段时间,对一些key进行检查
- SLOW和FAST模式
- 二者配合使用
数据淘汰策略
- redis内存不够,会淘汰一部分数据

- 优先使用 allkeys-lru
- 如果没有冷热数据区分: allkeys-random

分布式锁
- 集群中的定时任务
- 抢单
- 幂等性
分布式
- 因为服务是集群式,所以不能用sychronized锁方法
- 我们使用redis去实现一个分布式锁就好
XiaoLin Coding
Redis
-
redis memcached - 数据结构丰富,支持持久化,支持集群,有lua,事务,订阅模式
MySQL
索引
- Mysql的 innoDB引擎是不支持hash索引的
- 前缀索引优化,覆盖索引优化
- 前缀索引对大文本等十分好用
- 覆盖索引解决的是宽表数据回表查询慢的问题
- 索引失效
- 左/左右模糊匹配
- 对索引列进行了 计算,函数,类型转换
- 联合索引是否遵循 最左匹配原则
- WHERE 子句中,如果OR前的条件列是索引列,OR后的条件列不是索引列
- 深度分页
- 无法解决
- 最好使用游标分页
事务
- ACID
- 原子性 一致性 隔离性 持久性
- 持久性是通过重做日志来保证的
- 原子性是通过日志回滚来保证的
- 隔离性
- 并行事务
- 脏读 幻读 不可重复读
- 脏读是读到了 写未提交
- 不可重复读 是 读到了 修改前后的数据
- 幻读主要是增删造成的
- 隔离级别
- 读未提交,读已提交,可重复读,串行化
- 读未提交: 脏读 不可重复读 幻读
- 读已提交: 不可重复读 , 幻读
- 可重复读: 幻读
- 串行化
锁
- 全局锁,表级锁(表锁,元数据所,意向锁,AUTO-INC锁),行级锁(记录锁,间隙锁,临键锁)
FloCA
难点
- 大模型不懂流程结构
- RAG : 极其依赖检索到的文本
- VLM
- 图序列化
- 幻觉
- prompt工程
- 微调
- 自然语言转为符号表达式