Redis基础知识全解

基本篇
数据结构篇
String类型
List类型
Set类型
Zset类型
BitMap类型
HyperLogLog介绍类型
Stream介绍类型
GEO介绍类型
Hash类型
持久化篇
AOF日志(存储操作)
RDB 快照(存储数据)
大 Key 对 AOF 日志的影响
功能篇
过期删除策略
内存淘汰策略
高可用篇
主从复制模式
哨兵机制Sentinel
缓存篇
缓存雪崩
缓存击穿
缓存穿透
布隆过滤器
缓存和数据库的一致性
应用场景篇
消息队列
生产者消费者模型
参考博客
😊点此到文末惊喜↩︎

基本篇
Redis是什么
定义:是一个内存数据库,提供多种高效的数据结构来支持不同的业务场景,从而实现高并发和高性能。
内存存储:内存存储读写快,能提供高并发和低时延的数据访问
数据结构:String类型、List类型、Hash类型、Set类型、Zset类型、Bitmap类型、HyperLogLog类型、Geo类型、Stream类型
业务场景:缓存、消息队列、点赞系统、共同关注、抽奖活动、排行榜系统、连续签到天数等
使用Redis的好处有哪些?
高性能:Redis基于内存存储,读写速度快,具有好的并发性能
数据结构丰富:应用场景广泛
持久化支持:Redis支持多种持久化方式,可以将数据存储到磁盘中,从而避免数据丢失。
分布式支持:Redis支持分布式部署,可以通过Redis Cluster或Sentinel等机制,扩展应用程序以提供更好的性能和可用性。
简单易用:Redis的命令简单易用,易于上手,而且支持多种编程语言和操作系统。
Redis解决了MySQL那些问题 / Redis相比MySQL的优点
高性能
MySQL具有磁盘IO的速度瓶颈,但Redis基于内存存储,读写速度快
Redis具有丰富的数据结构能适合不同的业务场景。
高拓展性:Redis支持分布式部署,支持集群间的数据迁移。
数据结构篇


String类型
String的数据结构
总体结构:String 数据类型是一种KV结构,其中key是字符串类型,而value是redisObject结构体类型。
redisObject 结构体:包括对象类型(type)、编码格式(encoding)、SDS指针等字段

SDS结构(Simple Dynamic String)的组成
len:标识SDS当前保存字符串的实际长度,是一个无符号整数,通过该字段O(1)时间内获得字符串长度
free:标识SDS中未使用的空间长度,
buf:定义为char buf[ ],是c99引入的柔性数组,实际是一个指针
拓展方式类似于vector,通常每次进行翻倍扩容增大free,但SDS最大容量为512MB。
编码格式
int:不使用SDS进行存储,因为int类型的值大小固定
raw:redisObject和其ptr指向的SDS分别进行内存空间的分配
embstr:SDS内嵌到redisObject结构体中,申请和释放一次内存处理。内存连续有利于CPU缓存,提高性能。
SDS的优点
保存多种数据:可以保存文本或二进制数据,即也能保存音视频和图片等任意数据类型
API接口安全:字符串拼接会进行边界安全检查
List类型
List的数据结构
前述:在 Redis 3.2 版本之前,由压缩列表或双向链表实现,之后均由quicklist实现。
结构(类似deque,外链内数组)
控制器:链表头指针head、链表尾指针tail、quicklist属性信息(节点数量、总元素数量等)
双向链表:quickList链表结点间通过双指针连接,quickList内部有指向zipList的指针,zipList是一个键值对数组。

插入
头尾插入:zipList中有空闲则直接插入,没有则创建新结点再插入
中间插入:有空则插入,没空则查找相邻,相邻没空则分裂被插入结点
常用于消息队列
优点
消息保存:建立生产者消费者模型,通过LPUSH+RPOP实现消息操作
阻塞自旋:使用BRPOP将获取到空消息的消费者阻塞,避免其自旋空转
重复消息处理:生产者自行实现全局唯一 ID,消费者记录已经处理过的消息的 ID,每次处理消息前判断消息是否已经处理过
问题:消费者读出消息后,消息队列将删除被读出的消息。
消息可靠性问题:如果消费者进行消息处理失败,可通过BRPOPLPUSH,从备份List读取过去的消息
多消费者消费同一消息:从消息队列读出的一个消息可通过消费者组分发到多个消费者,但是 List 类型并不支持
Set类型
定义:String类型的无序且唯一的集合,key是set名,value为set中的元素
特点
用途:可以对集合进行增删改查,还可以求多个集合的并交差(主库会导致事务阻塞,通常通过从库进行)
分类处理:当元素小于512个并全为整数时,底层会使用数组进行存储,否则使用哈希表
常见应用场景
点赞系统
示例:用户A对一个视频B点赞
原理:视频B为set名称,用户A为set中的一个元素。
共同关注
示例:A和B各自关注了很多公众号
A和B作为set名,关注公众号作为各自set中的元素,可以通过交集计算
抽奖活动
key为抽奖活动名,value为员工名称,把所有员工名称放入抽奖箱,可以保证同一个用户不会中奖两次,也可使用SRANDMEMBER命令允许重复中奖
Zset类型
定义:是一种有序集合类型,在Value中增加了一个排序属性
原理:使用跳表实现的
业务场景
排行榜系统,如销量排名、视频播放排名等
BitMap类型


定义:Bitmap位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素
适合数据量大的二值统计场景
适合数据量大:bit 是计算机中最小的单位
二值统计:一个bit位只能表示两种状态
应用场景
连续签到天数:用户为key,value为每天签到状态的bit数组
用户登录状态:将用户 ID 作为 offset,在线就设置为 1,下线设置 0
连续签到用户总数:把每天的日期作为 Bitmap 的 key,userId 作为 offset,对每天的Bitmap 的对应的用户bit位做 『与』运算
HyperLogLog介绍类型
概述
作用:进行快速基数统计,可以快速计算集合中不重复元素的个数
原理:统计规则是基于概率完成的,标准误算率是 0.81%。
优点:能够使用较小空间开销进行快速的基数统计,每个 HyperLogLog 键只需要花费 12 KB 内存,即可计算接近 2^64 个不同元素的基数。HyperLogLog 就非常节省空间。
应用场景
百万级以上的网页用户访问量计数
Stream介绍类型
概述:Redis 专门为消息队列设计的数据类型。
原理:新的消息被追加到Stream的尾部,消费者从Str

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王甜甜(.NET)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值