一文总结Redis知识点

目录

  • 为什么基于MySQL又出现Redis?Redis的优点?
  • Redis支持的基本命令
  • Redis支持的数据结构
    • 1 String
    • 2 List
    • 3 Set
    • 4 Sorted Set
    • 5 Hash
    • 6 Stream 消息队列
    • 7 Geospatial 地理空间
    • 8 Bitmap 位图
    • 9 Bitfield 位域
    • 10 HyperLogLog
  • Redis是单线程还是多线程?
  • 发布订阅模式
  • Redis中的事务与关系型数据库中的事务的区别?
  • 持久化的两种方式RDB和AOF有什么区别?用哪个更好?
    • RDB快照(Redis Database)
    • AOF日志(Append-Only File)
  • 主从复制
  • Sentinel 哨兵模式
  • Redis集群
    • 集群中如何进行数据分区?
      • 节点取余分区
      • 一致性哈希分区
      • 虚拟槽分区
      • 集群的伸缩?
  • 如何保证缓存数据和数据库数据的一致?
  • 如何保证本地缓存和分布式缓存的一致?
  • 如何处理热key和大key?
  • Redis的管道?

为什么基于MySQL又出现Redis?Redis的优点?

  • MySQL是基于磁盘IO的,Redis是基于内存的。
    内存的读写速度比磁盘IO的读写速度快很多,可以大大提高性能。

  • 优点:基于内存所以性能高,支持的数据类型很丰富,支持所有主流的编程语言如python Java等,支持数据持久化(ROB AOF机制),支持主从复制,支持集群模式,支持哨兵模式。

  • Redis是key-value形式的非关系型数据库

Redis支持的基本命令

  • SET 添加键值对
  • GET 获取键值对
  • EXISTS 查询键值对
  • DEL 删除键值对
  • FLUSHALL 删除所有键
  • KEYS * 查询所有键
  • TTL 查看键过期时间
  • EXPIRE 设置键的过期时间

Redis支持的数据结构

1 String

  • Redis默认用String进行存储
  • String所有的命令都与基本命令一致

2 List

  • 底层数据结构是双端队列
  • 命令以L开头
  • 独有命令:LPUSH(左边入队)LPOP(左边出队)LRANGE(从左边输出队列)LLEN(队列长度)LTRIM(从左边数保留队列的部分元素)RPUSH(右边入队)…

3 Set

  • 无序去重集合
  • 命令以S开头
  • 独有命令:SADD(添加元素)SREM(删除元素)SISMEMBER(查询元素)
  • 支持集合运算,交集并集等

4 Sorted Set

  • 有序去重集合
  • 命令以Z开头
  • Zset中的每个元素都会关联一个浮点类型的分数,然后根据分数从小到大排序元素
  • Zset中的元素是唯一的,但元素的分数可以是重复的
  • 独有命令:ZRANGE key 0 -1 WITHSCORES(输出所有成员+分数)ZRANK(查看成员从小到大的排名)

5 Hash

  • 命令以H开头
  • Redis本身就是键值对,相当于键值对中的value又是键值对

6 Stream 消息队列

  • 命令以X开头
  • 独有命令:XREAD COUNT count BLOCK ms STREAMS key 0(从头一次从队列中读count条消息,如果没有消息就阻塞多少ms,可以重复读取。把0改成#可以读最新消息)XGROUP(创建消费者组和创建消费者)XINFO(查看消费者组的信息)

7 Geospatial 地理空间

  • Redis3.2版本的新特性
  • 一种专门用来存储地理位置信息的数据结构
  • 命令以GEO开头
  • 支持地理位置的计算操作
  • 独有命令:GEOPOS(查找城市经纬度)DEODIST(计算城市直线距离)GEOSEARCH(查询以某城市为中心,在某范围内的城市)

8 Bitmap 位图

  • 一个01数组,下标表示偏移量
  • 命令以BIT开头
  • 支持位运算
  • 适用场景:记录用户签到情况,在线状态,是否点赞

9 Bitfield 位域

  • 命令以BITFIELD开头
  • 适用场景:记录游戏玩家信息

10 HyperLogLog

  • 一种做基数统计的算法,即计算集合中的不重复元素个数
  • 命令以PF开头
  • 原理:随机算法
  • 优点:占用内存小
  • 缺点:有误差
  • 适用场景:对精确度要求不高,但数据量很大的统计工作,如统计某词的搜索次数

Redis是单线程还是多线程?

  • Redis一直倾向于使用单线程,避免了频繁的线程切换,是它的优点之一
  • 4.0之前完全是单线程
  • 4.0之后主线程是单线程,同时还有后台线程(处理脏数据、释放无用链接、删大key等)
  • 6.0之后执行命令是单线程,同时还有其他线程(处理数据读写、解析协议)

发布订阅模式

  • publish命令,将消息发送到指定频道
  • subscribe命令,订阅指定频道
  • 缺点:消息无法持久化,无法记录历史消息

Redis中的事务与关系型数据库中的事务的区别?

  • 事务是一系列命令的集合,事务开启后,所有命令放到队列中,打包到一起发起执行事务的请求,可以在一次请求中执行多个命令
  • MULTI命令开启事务
  • EXEC命令执行事务
  • 关系型事务为原子操作,所有命令要么全部执行成功,要么全部失败
  • 非关系型事务不是原子操作,任何一个命令执行失败都不会妨碍下一个命令继续执行

持久化的两种方式RDB和AOF有什么区别?用哪个更好?

RDB快照(Redis Database)

  • 每隔一个固定的时间间隔,将内存中的数据快照写入磁盘,即ROB保存的是某个时间点内数据的完整副本
  • 优点:恢复速度快,适合备份
  • 缺点:如果服务器突然宕机,最后一次快照之后的数据会丢失,做不到实时持久化
  • 触发方式:1. 自动触发 2. save命令,在执行save命令期间,redis不能干其他事情 3. bgsave命令,创建一个子进程专门来拍快照,创建子进程期间redis不能干其他事情,但拍快照期间可以干其他

AOF日志(Append-Only File)

  • 执行命令时一边将命令写到内存中,一边写到AOF中,Redis重启时利用AOF中的命令重建数据库,即AOF是一个保存着执行过的所有命令的日志
  • 优点:做到了实时持久化
  • 缺点:文件很大,恢复速度慢,启动效率低

各有优点,混合持久化最好,即ROB+增量AOF的形式,AOF文件只保存最后一次快照到此刻的执行命令,Redis重启时,先加载ROB文件,再重放增量AOF文件,即避免了ROB无法实时持久化,也避免了AOF文件过大。

主从复制

  • 将一台redis主服务器的数据复制到其它redis从服务器
  • 低级的redis集群模式
  • 一个主节点可以有多个从节点,一个从节点只有一个主节点
  • 数据单向复制,只能从主到从,主写从读
  • 数据同步的方式可以全量复制,也可以部分复制
  • 优点:数据热备份,故障恢复,负载均衡(读写分离可以分担服务器负载),高可用基石(哨兵模式和集群的基础)
  • 缺点:主节点故障需人工干预(哨兵模式可解决),主节点的写能力受限制(分布式可解决)

Sentinel 哨兵模式

  • 自动故障转移,主从复制过程中主节点故障无需人工干预
  • 以独立进程的形式运行在redis集群中,监控服务器们运行,若发现某节点有问题,通过发布订阅模式通知其他节点,主节点故障会将一个从节点升级成新的主节点,再通知其他从节点更换了主节点。
  • 主观下线和客观下线 主观下线就是哨兵节点认为某个节点有问题,客观下线就是超过一定数量的哨兵节点认为主节点有问题。
  • 如何选新的主节点?拿到节点列表,先过滤不健康节点,再选择优先级最高的节点们,再选复制偏移量最大的节点们(说明数据最完整),再选runid最小的节点(说明启动最早)
  • 哨兵节点是一个进程,也有可能故障,所以一般用3个哨兵,选举一个领导哨兵干活,领导挂了后重新选一个领导哨兵

Redis集群

  • 数据分区/分片:集群最核心的功能。集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加;另一方面 每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
  • 高可用: 集群支持主从复制和主节点的 自动故障转移 (与哨兵类似),当任一节点发生故障时,集群仍然可以对外提供服务。

集群中如何进行数据分区?

  • 即拿到一个key(数据)应该把它放到集群中的哪个节点上?
  • 数据分区是在创建集群的时候完成的
  • 节点数量至少为6个才能保证组成完整高可用的集群

节点取余分区

  • 对key或用户ID对hash值取余,来确定数据映射到哪一个节点上。
  • 缺点:当节点数量变化时,如扩容或收缩节点,所有数据节点映射关系需要重新计算,会导致数据的重新迁移

一致性哈希分区

  • 将整个 Hash 值空间组织成一个虚拟的圆环,然后对集群节点的 IP 地址或主机名做 Hash 取值后,放置在圆环上。当我们拿到一个key时,先对这个 key 做同样的Hash 取值,确定在环上的位置,然后按照顺时针方向在环上“行走”,遇到环上的第一个节点,将key放入。
  • 优点:加入和删除节点只影响哈希环中相邻的节点,对其他节点无影响
  • 缺点:当节点在圆环上分布不平均时,部分缓存节点的压力会较大。当某个节点故障时,这个节点承担的所有数据访问都会被顺移到下一个节点上,会对下一个节点造成压力。

虚拟槽分区

  • Redis 集群使用的便是该方案
  • 在一致性哈希分区的基础上,引入了虚拟节点,称为槽(slot)。在使用了槽的一致性哈希分区中,一个节点被分割成了多个槽,槽是数据管理和迁移的基本单位。
  • 槽解耦了数据和实际节点之间的关系,增加或删除节点对系统的影响很小。当删除某个节点时,该节点下的多个槽可以带着数据较平均地分配到剩余的多个节点上,避免了该节点所有数据堆积到下一个节点上的问题。

集群的伸缩?

  • 扩容:为新节点分配一定数量的槽和数据
  • 缩容:将槽和数据分配给其他节点,再将要删除的节点下线

如何保证缓存数据和数据库数据的一致?

如何保证本地缓存和分布式缓存的一致?

如何处理热key和大key?

Redis的管道?

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

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

相关文章

SpringBoot Thymeleaf iText7 生成 PDF(2023/08/29)

SpringBoot Thymeleaf iText7 生成 PDF(2023/08/29) 文章目录 SpringBoot Thymeleaf iText7 生成 PDF(2023/08/29)1. 前言2. 技术思路3. 实现过程4. 测试 1. 前言 近期在项目种遇到了实时生成复杂 PDF 的需求,经过一番…

ceph中PGLog处理流程

ceph的PGLog是由PG来维护,记录了该PG的所有操作,其作用类似于数据库里的undo log。PGLog通常只保存近千条的操作记录(默认是3000条, 由osd_min_pg_log_entries指定),但是当PG处于降级状态时,就会保存更多的日志&#x…

地铁+铁路系统防雷接地应用解决方案

地铁作为城市轨道交通的一种,是一种高效、安全、环保的公共交通方式。然而,地铁也面临着雷电灾害的威胁,尤其是在雷暴多发的地区。 雷电对地铁系统的影响主要有以下几个方面: 直接雷击:雷电直接击中地铁系统的设备或…

RISC-V公测平台发布 · 在SG2042上配置Jupiter+Octave科学计算环境

简介 JupyterHub是一个开源的共享计算平台,它为每个用户管理一个单独的 Jupyter 环境, 可以用于学生班级、企业数据科学小组或科学研究小组。它是一个多用户中心,可以生成、管理和代理多个单用户Jupyter笔记本服务器的实例。 GNU Octave是一…

WebSocket- 前端篇

官网代码 // 为了浏览器兼容websocketconst WebSocket window.WebSocket || window.MozWebSocket// 创建连接 this.socket new WebSocket(ws://xxx)// 连接成功this.socket.onopen (res)>{console.log(websocket 连接成功)this.socket.send(入参字段) // 传递的参数字段}…

zookeeper集群 数据一致性测试

搭建zk集群 准备 3台ubuntu 20机器每台机器提前安装配置好jdk-8apache-zookeeper-3.8.2-bin.tar.gz 开始 # 上传 scp -P 22 -r C:\Users\xcrj\Downloads\apache-zookeeper-3.8.2-bin.tar.gz root192.168.1.102:/root/zk/ # 解压 tar -zxvf apache-zookeeper-3.8.2-bin.tar.…

【前端】 Layui点击图片实现放大、关闭效果

实现效果&#xff1a;点击图片实现放大&#xff0c;点击空白处关闭效果。下图。 实现逻辑&#xff1a;二维码是使用JQ插件生成的&#xff0c;点击二维码&#xff0c;获取图片路径&#xff0c;通过Layui的弹窗显示放大后的图片。 Html <div id"qrcode" class&quo…

Java学习笔记31——字符流

字符流 字符流为什么出现字符流编码表字符串中的编码解码问题字符流写数据的5中方式字符流读数据的两种方式字符流复制Java文件 字符流 为什么出现字符流 汉字的存储如果是GBK编码占用2个字节&#xff0c;如果是UTF-8占用三个字节 用字节流复制文本文件时&#xff0c;文本文…

驱动开发错误汇编

本博文将会不定期更新。以便记录我的驱动开发生涯中的一些点点滴滴的技术细节和琐事。 生成时link找不到导出函数&#xff0c;比如"LNK2019 无法解析的外部符号 _FltCreateCommunicationPort32"。出现这种情况的原因是&#xff0c;驱动的编译环境忽略了所有的默认库&…

基于实例的学习方法

基于实例的学习方法 动机基本概念基于实例的学习基于实例的概念表示 1. 最近邻最近邻的例子理论结果最近邻&#xff08;1- NN&#xff09;:解释问题 K-近邻(KNN)KNN讨论1 &#xff1a;距离度量KNN 讨论2&#xff1a;属性KNN:属性归一化KNN:属性加权 KNN讨论3:连续取值目标函数K…

Python爬虫实战:自动化数据采集与分析

在大数据时代&#xff0c;数据采集与分析已经成为了许多行业的核心竞争力。Python作为一门广泛应用的编程语言&#xff0c;拥有丰富的爬虫库&#xff0c;使得我们能够轻松实现自动化数据采集与分析。本文将通过一个简单的示例&#xff0c;带您了解如何使用Python进行爬虫实战。…

C# 使用NPOI操作EXCEL

1.添加NOPI 引用->管理NuGet程序包->添加NOPI 2.相关程序集 3.添加命名空间 using NPOI.HSSF; using NPOI.XSSF; using System.IO; using NPOI.XSSF.UserModel; using NPOI.HSSF.UserModel; 4.从Excel导入的dgv样例 //NPOI读入dgv private void button1_Click(object s…

内存分析之GCViewer详细解读

文章目录 GCViewer详细解读一&#xff0c;Chart详解二&#xff0c;Event detail三&#xff0c;Summary四&#xff0c;Pause五&#xff0c;相关概念5.1 GC5.1.1 Full GC5.1.2 Minor GC 5.2 垃圾收集器5.2.1 串行收集器&#xff08;Serial&#xff09;5.2.2 **ParNew收集器**5.2.…

Python切换输入法的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

经纬恒润荣获吉利汽车“最佳价值贡献”奖

8月18日&#xff0c;以“全面向新 共创共赢”为主题&#xff0c;吉利汽车在宁波成功举行2023年电子电器核心供应商恳谈会。经纬恒润凭借在项目合作上持续创新、高效协同等优异表现&#xff0c;获得“最佳价值贡献”奖项。 作为国产汽车代表性品牌之一&#xff0c;吉利汽车积极推…

多通道振弦数据记录仪在岩土工程隧洞中的完整解决方案

多通道振弦数据记录仪在岩土工程隧洞中的完整解决方案 隧洞工程是一种非常复杂的工程类型&#xff0c;需要高度的安全性和精确性。而在岩土工程中&#xff0c;振弦是一种非常常用的测试方法&#xff0c;用于测定岩土体的物理性质以及地震波传播特性等&#xff0c;以利于对隧洞…

【深入浅出设计模式--状态模式】

深入浅出设计模式--状态模式 一、背景二、问题三、解决方案四、 适用场景总结五、后记 一、背景 状态模式是一种行为设计模式&#xff0c;让你能在一个对象的内部状态变化时改变其行为&#xff0c;使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧密相关&#x…

解决Three.js辉光背景不透明

使用此pass canvas元素的background都能看到 不过相应的辉光颜色和背景颜色不相容的地方看起来颜色会怪一些 如图 不过如果是纯色就没什么问题了 //ts-nocheck /** Author: hongbin* Date: 2023-04-06 11:44:14* LastEditors: hongbin* LastEditTime: 2023-04-06 11:49:23* De…

电缆工厂 3D 可视化管控系统 | 智慧工厂

近年来&#xff0c;我国各类器材制造业已经开始向数字化生产转型&#xff0c;使得生产流程变得更加精准高效。通过应用智能设备、物联网和大数据分析等技术&#xff0c;企业可以更好地监控生产线上的运行和质量情况&#xff0c;及时发现和解决问题&#xff0c;从而提高生产效率…

libevent源码学习3---事件event

libevent源码学习3—事件event libevent 的基本操作单元是事件。每个事件代表一组条件的集合, 这些条件包括: 文件描述符已经就绪, 可以读取或者写入文件描述符变为就绪状态,可以读取或者写入(仅对于边沿触发 IO)超时事件发生某信号用户触发事件 所有事件具有相似的生命周期。…