Redis笔记
2024-06-10 18:23:45 0 举报
AI智能生成
为你推荐
查看更多
Redis是一个开源的、高性能的、支持多种数据类型的内存数据库,可以用于存储和处理大量数据。它提供了丰富的命令,支持字符串、哈希、列表、集合、有序集合等数据类型,以及发布-订阅、事务等高级功能。此外,Redis还支持数据持久化、主从复制、集群等特性,可以保证数据的可靠性和可用性。Redis因其高性能、高可用、灵活性等优点,被广泛应用于各种web、游戏、移动应用等场景的缓存、会话存储、队列系统等领域。
作者其他创作
大纲/内容
1.1.认识Nosql
1.2.认识Redis
1.3.安装
1.4.命令行客户端演示
1.5.图形化客户端演示
1.Redis入门
2.1.Redis数据结构介绍
2.2.通用命令
2.3.String类型
2.4.Hash类型
2.5.List类型
2.6.Set类型
2.7.SortedSet类型
2.Redis常见命令
3.1.Jedis快速入门
3.2.Jedis连接池
3.3.SpringDataRedis快速入门
3.4.RedisSerializer配置
3.5.StringRedisTemplate
3.Redis客户端
基础篇
4.1.1.搭建黑马点评项目
4.1.2.基于session的短信登录
4.1.3.集群下的session共享问题
4.1.4.Redis实现共享session
4.1.5.Redis实现session的刷新问题
4.1.短信验证码的登录注册功能
Redis解决Session共享问题- string类型的应用- Hash类型的应用
一种具备高效读写能力的数据暂存区域
什么是缓存?
降低后端负载
提高服务读写响应速度
缓存的作用?
开发成本
运维成本
一致性问题
缓存的成本?
4.3.1.认识缓存
4.3.2.添加redis缓存
Redis自带的内存淘汰机制
内存淘汰
利用expire命令给数据设置过期时间
过期淘汰
主动完成数据库与缓存的同时更新
主动更新
三种策略
内存淘汰或过期淘汰
低一致性需求
主动更新为主
过期淘汰兜底
高一致性需求
策略选择
一致性良好
实现难度一般
缓存调用者在更新数据库的同时完成对完成的更新
Cache Aside
一致性优秀
实现复杂
性能一般
缓存与数据库集成为一个服务,服务保证两者的一致性,对外暴露API接口。调用者调用API,无需知道自己操作的是数据库还是缓存,不关心一致性。
Read/Write Through
一致性差
性能好
缓存调用者的CRUD都针对缓存完成。由独立线程异步的将缓存数据写到数据库,实现最终一致
Write Back
主动更新的方案
更新缓存会产生无效更新,并且存在较大的线程安全问题
删除缓存本质是延迟更新,没有无效更新,线程安全问题相对较低
更新缓存还是删除缓存?
在满足原子性的情况下,安全问题概率较低
先更新数据,再删除缓存
安全问题概率较高
先删除缓存,再更新数据库
先操作数据库还是缓存?
利用事务机制
单体系统
利用分布式事务机制
分布式系统
如何确保数据库与缓存操作原子性?
Cache Aside的模式选择
1.先查询缓存
2.如果缓存命中,直接返回
3.如果缓存未命中,则查询数据库
4.将数据库数据写入缓存
5.返回结果
查询数据时
1.先修改数据库
2.然后删除缓存
确保两者的原子性
修改数据库时
最佳实践
4.3.3.缓存更新策略
客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库
产生原因
对于不存在的数据也在Redis建立缓存,值为空,并设置一个较短的TTL时间
思路
实现简单,维护方便
优点
额外的内存消耗
短期的数据不一致问题
缺点
缓存空对象
利用布隆过滤算法,在请求进入Redis之前先判断是否存在,如果不存在则直接拒绝请求
内存占用少
存在误判的可能性
布隆过滤
做好数据的基础格式校验
加强用户权限校验
做好热点参数的限流
其它
解决方案
4.3.4.缓存穿透
在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
给不同的Key的TTL添加随机值
利用Redis集群提高服务的可用性
给缓存业务添加降级限流策略
给业务添加多级缓存
4.3.5.缓存雪崩
在某一时段被高并发访问
缓存重建耗时较长
热点Key
热点key突然过期,因为重建耗时长,在这段时间内大量请求落到数据库,带来巨大冲击
给缓存重建过程加锁,确保重建过程只有一个线程执行,其它线程等待
实现简单
没有额外内存消耗
一致性好
等待导致性能下降
有死锁风险
互斥锁
热点key缓存永不过期,而是设置一个逻辑过期时间,查询到数据时通过对逻辑过期时间判断,来决定是否需要重建缓存
重建缓存也通过互斥锁保证单线程执行
重建缓存利用独立线程异步执行
其它线程无需等待,直接查询到的旧数据即可
线程无需等待,性能较好
不保证一致性
有额外内存消耗
逻辑过期
4.3.6.缓存击穿(热点Key)
4.3.7.缓存工具封装
4.2.商家查询的缓存功能
Redis的缓存实战方案
4.4.1.秒杀优惠券的基本实现
4.4.2.超卖问题
乐观锁和悲观锁
4.4.3.基于乐观锁解决超卖问题
4.3.秒杀优惠券功能
4.5.1.实现秒杀的一人一单限制
4.5.2.单机模式下的线程安全问题
4.5.3.集群模式下的线程安全问题
分布式锁原理
Redis的String结构实现分布式锁
锁误删问题
锁的原子性操作问题
Lua语法
redis的Lua脚本
RedisTemplate调用Lua脚本
Lua脚本解决原子性问题
Redisson分布式锁
Hash结构解决锁的可重入问题
发布订阅结合信号量解决锁重试问题
watchDog解决锁超时释放问题
4.5.4.分布式锁
4.5.6.基于分布式锁实现一人一单
4.4.秒杀的一人一单限制功能
4.6.1.基于Redis实现秒杀减库存
4.6.2.基于Redis的一人一单限制
4.6.3.基于阻塞队列的异步下单
4.5.Redis实现秒杀优化
4.7.1.基于消息队列的异步下单思路
4.7.2.基于List结构的消息队列
4.7.3.基于PubSub的消息队列
4.7.4.基于stream的消息队列
4.7.5.Redis作为消息队列的3种方式对比
4.7.6.基于Stream消息队列实现异步秒杀下单
4.6.秒杀的异步优化
4.8.1.分享探店图文
4.8.2.点赞功能
4.8.3.基于List实现点赞用户列表TOP10
4.8.4.基于SortedSet实现点赞排行榜
4.7.达人探店功能
Redis的各种排行榜实现方案:- 基于List的排行榜- 基于SortedSet的排行榜
4.9.1.关注列表实现原理
4.9.2.添加关注
4.9.3.共同关注列表
4.9.4.取消关注
4.9.5.探店推送功能
4.8.关注列表
Redis在社交应用下的典型应用:- 关注、共同关注- 粉丝内容推送
4.10.1.BitMap原理
4.10.2.实现签到功能
4.10.3.实现补签功能
4.10.4.统计连续签到天数
4.9.签到功能
BitMap结构的应用
4.11.1.UV统计的基本思路
4.11.2.HypeLogLog实现统计
4.10.UV统计功能
HyperLogLog结构的应用
4.12.1.GEO基本用法
4.12.2.获取附近的店铺
4.11.附近的店铺功能
Geo结构的应用
实战篇
Redis在秒杀场景下的应用:- 缓存- 分布式锁- 超卖问题- Lua脚本- Redis消息队列
RedisObject
SDS
RAW
EMBSTR
INT
string
ziplist
hashTable
hash
linkedList + zipList
quickList
list
inset
set
hashtable + skiplist
sorted_set
hyperloglog
rax
listpack
streams
geohash
1.Redis底层数据结构
2.1.单线程阻塞IO
2.2.多线程阻塞IO
2.3.非阻塞IO
2.4.IO多路复用
单Reactor
多Reactor
2.5.NIO线程模型
2.6.Redis线程模型
2.线程模型
字符串
整型
多行
错误
数组
null
3.1.交互规范
3.2.手写Redis客户端
3.Redis通信协议
4.1.Redis内存淘汰策略
4.2.LRU算法介绍
4.3.实现LRU算法
4.内存淘汰策略
5.Redis热点面试题总结
原理篇
1.1.RDB持久化演示
1.2.RDB持久化原理
1.3.AOF持久化演示
1.4.AOF与RDB对比
1.Redis持久化
2.1.主从集群结构
2.2.搭建主从集群
2.3.主从全量同步原理
2.4.主从增量同步原理
2.Redis主从
主观和客观下线
选举原理
故障转移
3.1.哨兵作用和工作原理
3.2.搭建哨兵集群
3.3.RedisTemplate连接哨兵集群
3.Redis哨兵
4.1.搭建分片集群
4.2.散列插槽原理
添加节点
插槽迁移
删除节点
4.3.集群伸缩
4.4.集群故障转移
4.5.RedisTemplate访问分片集群
4.6.集群模式下的常见问题及解决方案
4.Redis分片集群
5.1.多级缓存架构
导入Demo数据
导入Demo工程
初识Caffeine
实现进程缓存
5.2.JVM进程缓存
安装
快速入门
获取请求参数
发送http请求
基于id的负载均衡
Redis缓存预热
查询Redis
Nginx本地缓存
5.3.OpenResty
同步策略分析
Canal实现缓存同步
5.4.缓存同步
5.Redis多级缓存实战
业务层面的最佳实践
运维层面的最佳实践
6.Redis性能优化
高级篇
Redis
0 条评论
回复 删除
下一页