一、redis-万字长文读懂redis

news2024/12/23 19:19:09

高性能分布式缓存Redis

  • `第一篇章`
  • 1.1缓存发展史&缓存分类
    • 1.1.1 大型网站中缓存的使用
      • 带来的问题
    • 1.1.2 常见缓存的分类及对比
      • 与memcache对比
    • 1.2 数据类型选择&应用场景
      • 1.2.1 string
      • 1.2.2 hash
      • 1.2.3 链表
      • 1.2.4 set
      • 1.2.5 sortedset有序集合类型
      • 1.2.6 总结
    • 1.3 Redis高级应用&拓展功能
      • 1.3.1 发布订阅
        • redis提供发布订阅功能,可用于消息的传输
        • 指令详情
        • 使用场景
      • 1.3.2 事务
        • redis事务支持回滚吗
        • redis 事务
      • 1.3.2 lua脚本
      • 1.3.3 慢查询日志
  • `第二篇章`
    • 2.1 持久化原理
      • 2.1.1 原理
      • 2.1.2 持久化流程
      • 2.1.3 RDB
        • 概念
        • 特点
        • 触发方式:指令手动触发和redis.conf自动触发
        • RDB优势
        • RDB劣势
      • 2.1.4 AOF
        • 概念
        • 特点
        • AOF持久化实现
        • AOF重写原理
        • 持久化优先级
      • 2.1.5 降低fork阻塞
      • 2.1.6 实践中的其它策略
    • 2.2 过期删除策略
      • 2.2.1 问题分析
        • 1. 如何设置过期时间
        • 2. 如何盘判定key已过期
        • 3. 过期删除策略有哪些
        • 4. Redis过期删除策略是什么
    • 2.3 内存淘汰策略
      • 2.3.1 概念
      • 2.3.2 如何设置Redis的最大运行内存
      • 2.3.3 Redis的八种内存淘汰策略
      • 2.3.4 LRU算法和LFU算法有什么区别
        • LRU传统算法
        • Redis中的LRU算法
        • LFU算法
        • redis中LFU算法
    • 2.4 Redis高可用
      • 2.4.1 主从复制的出现
      • 2.4.2 主从复制结构
      • 2.4.3 主从复制实现
      • 2.4.4 sentinel 哨兵模式
        • 哨兵的出现
        • 客观下线
        • 哨兵挂了怎么办
      • 2.4.5 主从+哨兵存在的问题
  • `第三篇章`
    • 3.1 分布式锁
      • 何为分布式锁
      • 分布锁的特点
      • 如何设计一把良好的锁
    • 3.2 布隆过滤器(BloomFilter)
    • 3.3 Redis Cluster
  • `第四篇章-FAQ`
    • 4.1 如何保持缓存和数据库的一致性
      • ==总结==
      • 1)为什么使用redis来做缓存
      • 2)缓存策略带来的问题
      • 3)导致数据不一致原因
      • 4)并发引起的一致性问题
      • 5)删除缓存可以保证一致性吗
      • 6)如何保证两步都执行成功
      • 7)主从库延迟和延迟双删策略
      • 8)保证更新数据库和删除缓存都能成功
    • 4.2 redis是单线程架构还是多线程架构
    • 4.3 单线程的redis为什么这么快
    • 4.4 Redis6.x之后为何引入了多线程?
    • 4.5 缓存穿透\缓存击穿\缓存雪崩
    • 4.6 为什么用 Redis 作为 MySQL 的缓存?
    • 4.7 Redis 如何实现数据不丢失?

第一篇章

1.1缓存发展史&缓存分类

1.1.1 大型网站中缓存的使用

在这里插入图片描述
分析:直接从数据库中的数据,是存储在磁盘中的,需要多次的IO,而且请求数据库是基于TCP连接,单机的mysql qps 1W+,而redis的qps达到10w+;所以可以在Tomcat和mysql中加入屏障,将热点数据放入redis,非热点数据放入数据库中,流程如下
在这里插入图片描述

带来的问题

  • 读写缓存策略
    • 读写穿透
    • 异步缓存写入
  • 数据库和缓存如何保证数据一致性
    • 写策略
      • 先更新缓存,再删除缓存
      • 先删除缓存,再更新数据库

1.1.2 常见缓存的分类及对比

与memcache对比

共同点:

  1. 都是基于内存的数据库,一般都用来当做缓存使用。
  2. 都有过期策略。
  3. 两者的性能都非常高。

区别:

  1. Redis 支持的数据类型更丰富(String、Hash、List、Set、zset),而 Memcached 只支持最简单的 key-value 数据类型;
  2. Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了
  3. Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;
  4. Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持
    所以,很少使用memcached了

1.2 数据类型选择&应用场景

  • 常见的五种数字类型:string、hash、list、set、zset

1.2.1 string

  • redis并不是简单的使用c的string,而是构建了简单动态字符串,不光可以保存文本数据还可以保存二进制,并且获取字符串的长度为0
    • 常用命令:set,get,strlen,exists
    • 应用场景:缓存对象、常规计数、分布式锁、共享session
      • 对象缓存:直接缓存整个对象的json
      • 分布式锁:setnx product:10001 true;setnx product:10001 false

1.2.2 hash

  • key-value,适合存储
    • 适合做对象缓存

      电商购物车
      用户id为key;商品id为field;商品数量为value;

      Hest cart:1 1001 1 //向id为1的商品1001添加1间商品
      

1.2.3 链表

  • c的链表查询比较难,所以redis使用了双向链表,支持反向查找和遍历,更方便操作,不过带了了额外的内存开销
    • 内部实现:quicklist
    • 常用命令:rpush、lpop、lpush
    • 应用场景:发布与订阅或者说消息队列,慢查询
      在这里插入图片描述
    • 常用数据结构
      • Stack(栈)=LPUSH(左边放)+LPOP(左边取)–> FILO
      • Queue(队列)=LPUSH(左边放)+RPOP右边取)
      • BLocking queue(阻塞队列)=LPUSH(左边放)+ BRPOP(右边阻塞取:没有数据就阻塞!)
        • 实现微波朋友圈等的关注列表显示
        • 实现后发的消息在列表中最上方展示
        • 小明关注了北京本地宝,京城美味君等公众号,这些订阅号发布消息时,通过推或拉的方式把消息LPUSH放入redis中属于小明的list中。其中key为msg:{小明D}。当小明要获取大V们发的消息时,使用LRANGE 命令从队列中获取指定个数的订阅号信息
          Lpush msg:1 1001 //1001是北京本地宝,mag:1是小明的id
          Lpush msg:1 1002
          显示的结果是1002先显示

1.2.4 set

  • 是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。一个集合最多可以存储 2^32-1 个元素。概念和数学中个的集合基本类似,可以交集,并集,差集等等,所以 set 类型除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集
    • 底层实现:哈希表或整数集合
    • 常用命令: sadd,spop,smembers,sismember,scard,sinterstore,sunion 等
    • 应用场景: 需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景

1.2.5 sortedset有序集合类型

  • 介绍:zset 类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序集合zSet 来说,每个存储元素相当于有两值组成的,一个是有序集合的元素值,一个是排序值。
    • 内部实现:压缩列表或跳表
    • 常用命会: zadd,zcard,zscore,zrange,zrevrange,zrem等
    • 应用场景: 需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息。

1.2.6 总结

在这里插入图片描述

1.3 Redis高级应用&拓展功能

1.3.1 发布订阅

redis提供发布订阅功能,可用于消息的传输

redis的发布订阅包含三个部分,publisher(redis客户端),subscriber(redis客户端)、channel(服务器)
在这里插入图片描述

指令详情
  • SUBSCRIBE/PSUBSCRIBE:订阅,精确、或者按匹配符UNSUBSCRIBE/PUNSUBSCRIBE:退订,精确、或者按匹配
  • PUBLISH:发送;PUBSUB:查看消息列表
使用场景
  • 在Redis哨兵模式中,哨兵通过发布与订阅的方式与Redis主服务器和Redis从服务器进行通信Redisson是一个分布式锁框架,在Redisso
  • 分布式锁释放的时候,是使用发布与订阅的方式通知的注:重业务的消息,推荐用消息队列

1.3.2 事务

redis事务支持回滚吗

所谓事务,是指作为单个逻辑工作单元执行的一系列操作
mysql在执行事务时,会提供回滚机制,当事务执行发生错误时,事务中的所有操作都会撤销,已修改的数据也会被恢复到事务执行前的状态,但是redis并没有提供回滚机制,redis事务不一定能保证原子性

redis 事务

redis事务的本质是一组命令的集合:单词执行多个命令,一次性、排他性、顺序性

  • redis事务是通过multi、exec、discrd、watch这四个命令来完成的
  • redis的单个命令都是原子性的,所以这里需要确保事务的对象是命令集合
  • redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行
  • redis不能保障失败回滚

原理刨析:
在exec执行事务的一瞬间,判断监控的key是否变动
变动则取消事务队列,直接不执行
无变动则执行,提交事务
在这里插入图片描述

1.3.2 lua脚本

redis+lua脚本保持原子性

  • lua是一种轻量小巧的脚本语言用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
  • Lua应用场景
    • 游戏开发、独立应用脚本、web应用脚本、查询库存扣减库存
    • Nginx+lua开发高性能web应用,限流、防止Sql注入

时间复杂度:取决于执行的脚本。

  • 使用Lua脚本的好处:
  • 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无换事务。
  • 复用。客户端发送的脚本会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。

1.3.3 慢查询日志

日常使用redis为什么要用慢查询日志
客户端请求的生命周期的完整生命周期,4个阶段
慢查询只统计步骤3的时间
在这里插入图片描述

  • 在生产环境中,慢查询功能可以有效地帮助我们找到Redis可能存在的瓶颈,但在实际使用过程中要注意以下几点:
    • slowog-max-en:线上建议调大慢查询列表,记录慢査询时Redis会对长命令做阶段操作,并不会占用大量内存,增大慢查询列表可以减缓慢查询被剔除的可能,例如线上可设置为1000以上.
    • 2slowlog-log-slower-than:默认值超过10毫秒判定为慢查询,需要根据Redis并发量调整该值,慢查询只记录命令的执行时间,
      并不包括命令排队和网络传输时间,因此客户端执行命令的时间会大于命令的实际执行时间,因为命2令执行排队机制,慢查询会导致其他命令级联阻塞,因此客户端出现请求超时时,需要检査该时间点是否有对应的慢查询,从而分析是否为慢查询导致的命令级联阻塞.

第二篇章

2.1 持久化原理

2.1.1 原理

redis是内存数据,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将redis中方的数据以某种形式从内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1906044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI集成工具平台一站式体验,零门槛使用国内外主流大模型

目录 0 写在前面1 AI艺术大师1.1 绘画制图1.2 智能作曲 2 AI科研助理2.1 学术搜索2.2 自动代码 3 AI智能对话3.1 聊天机器人3.2 模型竞技场 4 特别福利 0 写在前面 人工智能大模型浪潮滚滚,正推动着千行百业的数智化进程。随着技术演进,2024年被视为是大…

『C++成长记』string模拟实现

🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.…

C语言调试技巧

叠甲:以下文章主要是依靠我的实际编码学习中总结出来的经验之谈,求逻辑自洽,不能百分百保证正确,有错误、未定义、不合适的内容请尽情指出! 文章目录 1.bug 是什么2.debug 是什么3.两种模式的区别4.IDE 调试介绍4.1.模…

满足信创环境运行的国产FTP服务器是什么样的?

2018 年以来,受“华为、中兴事件”影响,我国科技尤其是上游核心技术受制于人的现状对我 国经济发展提出了严峻考验。在全球产业从工业经济向数字经济升级的关键时期,中国明确 “数字中国”建设战略, 抢占数字经济产业链制高点。 在…

RK3588编译rkmpp,拉取海康威视网络摄像头264码流并运行yolo

硬件:EVB评估版 SOC:Rockchip RK3588 背景: 由于项目需要,需要拉取264码流,并通过将yolov5s.pt将模型转化为rknn模型,获取模型分析结果。取流可以通过软件解码或者硬件解码,硬件解码速度更快&…

tesseract-ocr 字库训练(提高识别率进阶版)

github字库地址:https://github.com/tesseract-ocr/tessdata 一、tesseract-ocr字库训练 1、配置 jdk 环境变量 步骤(略) 2、安装 tesseract-ocr 并配置环境变量 下载地址:https://digi.bib.uni-mannheim.de/tesseract/ 配置环境…

无人机群辅助边缘计算系统的任务卸载和资源分配联合优化

源自:系统工程与电子技术 作者:刘世豪 黄仰超 胡航 司江勃 韩蕙竹 安琪 注:若出现无法显示完全的情况,可 V 搜索“人工智能技术与咨询”查看完整文章 摘 要 为提升无人机群辅助边缘计算系统在负载不均衡场景下的性能, 构…

红黑树模拟实现

概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡…

使用GZip对npm run build打包的vendor.js文件进行压缩

vue-cli项目 安装npm i compression-webpack-plugin -D npm i compression-webpack-plugin -D使用:在vue.config.js文件中 const CompressionPlugin require(compression-webpack-plugin) module.exports {configureWebpack: {plugins: [new CompressionPlugin…

html+css+js贪吃蛇游戏

贪吃蛇游戏&#x1f579;四个按钮控制方向&#x1f3ae; 源代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 互粉必回&#x1f64f;&#x1f64f;&#x1f60d;&#x1f60d;&#x1f60d; 源代码&#x1f4df; <!DOCTYPE html> <html lang"en"&…

【2024最新】Arduino通过Python进行串口通信控制电机

1. 背景 最近想研究一下用 Python 控制 Arduino 的技术&#xff0c;通过上网查询&#xff0c;发现可以用 Python 中的 serial 库来实现和 Arduino 主板的串口通信&#xff0c;从而控制 Arduino。 特此记录一下这个小项目的过程及出现的问题。 2. 基础准备 主板&#xff1a;…

中仕公考:“三支一扶”岗位分别做什么工作?

“三支一扶”计划旨在招募应届毕业生或近两年内毕业的毕业生&#xff0c;部分省份还考虑技工院校高级工班、预备技师班毕业生。在湖北省&#xff0c;报考支医岗位不限制毕业年限&#xff0c;安徽和云南等省对支医类岗位取消了开考比例要求。为解决招人留人难题&#xff0c;艰苦…

毛绒玩具音乐芯片:OTP语音芯片WTN6040方案解析

随着科技的不断发展&#xff0c;智能化和互动性已经成为玩具设计中的关键因素。在毛绒玩具市场中&#xff0c;集成音乐播放功能的毛绒玩具因其趣味性和互动性而备受欢迎。本文将详细介绍OTP&#xff08;One Time Programmable&#xff09;语音芯片WTN6040在毛绒玩具音乐芯片中的…

网页UI:被客户说不大气!大气能当饭吃?真能,最起码保住你饭碗

大气的网页UI设计可以带来以下几个好处&#xff1a; 提升品牌形象&#xff1a;大气的设计能够给用户留下深刻的印象&#xff0c;增强品牌的认知度和形象。通过精心设计的元素、色彩和排版&#xff0c;可以传达出品牌的专业、高端和可信赖的形象。强化用户体验&#xff1a;大气…

SpringBoot开发实用篇(二)

目录 一&#xff1a;Redis 1&#xff1a;SpringBoot整合Redis 2&#xff1a;SpringBoot读写Redis的客户端 3&#xff1a;SpringBoot操作Redis实现技术切换&#xff08;jedis&#xff09; 二&#xff1a;Mongodb 1&#xff1a;Mongodb基础操作 2&#xff1a;SpringBoot整合…

【DataSophon】DataSophon1.2.1 ranger usersync整合

目录 一、简介 二、实现步骤 2.1 ranger-usersync包下载编译 2.2 构建压缩包 2.3 编辑元数据文件 2.4 修改源码 三、重新安装 一、简介 如下是DDP1.2.1默认有的rangerAdmin&#xff0c; 我们需要将rangerusersync整合进来 ,实现将Linux机器上的用户和组信息同步到Ranger…

『粽享端午』交互小程序 小游戏 案例赏析

在这片古老而又年轻的土地上&#xff0c;地域的差异孕育了丰富多彩的饮食文化。粽子&#xff0c;作为端午节的象征&#xff0c;承载着南咸北甜的口味之争&#xff0c;自古便在人们舌尖上演绎着不同的风味传奇。 然而&#xff0c;在快节奏的现代生活洪流中&#xff0c;我们渐渐失…

家谱管理系统

《家谱管理系统》 一个家谱关系由若干家谱记录构成&#xff0c;每个家谱记录由父亲、母亲和子女姓名构成&#xff0c;其中姓名是关 键字。设计并实现一个简单的家谱管理系统。定义一个主菜单&#xff0c;界面友好&#xff0c;演示程序以用户和计算机的对话方式进行&#xff0c…

开关电源——调制模式和工作模式

一、开关电源的调制模式 开关电源作为一种广泛应用于电子设备中&#xff0c;用于将一定电压和电流转换为另一种电压和电流的技术&#xff0c;以下是开关电源三种常见的调制模式&#xff1a; 脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09; 脉冲频率调制&#xff…

触发器编程-创建(CREATE TRIGGER)、删除(DROP TRIGGER)

一、定义 1、触发器&#xff08;Trigger&#xff09;是用户对某一表中的数据做插入、更新和删除操作时被处罚执行的一段程序&#xff0c;通常我们使用触发器来检查用户对表的操作是否合乎整个应用系统的需求&#xff0c;是否合乎商业规则以维持表内数据的完整性和正确性 2、一…