Redis 基础 问题

前言


 相关系列

  • 《Redis & 目录》(持续更新)
  • 《Redis & 基础 & 源码》(学习过程/多有漏误/仅作参考/不再更新)
  • 《Redis & 基础 & 总结》(学习总结/最新最准/持续更新)
  • 《Redis & 基础 & 问题》(学习解答/持续更新)
     
     

Redis是什么?有哪些应用场景?


    Redis的全称为Remote Dictionary Server(远程字典服务),是一个基于C语言开发的开源/高性能/非关系型的数据库。与传统数据库不同的是:Redis会直接将数据保存在内存中,因此其读/写速度非常之快。据估算Redis每秒可以处理10/8万次以上的读/写,是目前已知性能最好的键/值型数据库,因此被广泛应用于缓存方向,并在分布式锁/消息通知等方面也有不小的运用…常用应用场景如下:

  • 热点缓存:将热点数据写入内存中读取可有效减少磁盘I/O并提升并发量,从而有效增强读取性能;
  • 会话缓存:Redis可储存全局性的会话信息(Token & 令牌)以支持对整个系统的全局访问,并有效提高系统整体的可用性/伸缩性;
  • 全页缓存:Redis可缓存整个页面的输出以减少接口调用/页面渲染的时间;
  • 计数器/排行榜:Redis可通过多种方式对整数进行快速增/减以实现计数器功能。并且由于Redis的读/写性能很高,因此很适合存储频繁读/写的计数量。此外计数器功能还可配合有序集合类以进一步实现实时排行榜功能;
  • 数据共享:Redis可作为共享数据的媒介以在多服务之间传递共享数据;
  • 消息队列(发布/订阅功能):Redis列表类型的底层结构为双向链表,因此可通过首/尾两端的插入/移除实现轻量级的消息队列功能以处理异步任务,不过该需求更推荐使用Kafka/RabbitMQ等专业的消息中间件实现;
  • 分布式锁 :作为多服务共享的中间件,Redis可使用自带的SETNX命令/官方提供的API以提供分布式锁功能,从而确保在多服务之间共享资源的一致性;
  • 限流:Redis可通过增/减整数,结合Lua脚本等方式统计总数以判断是否到达阈值以实现限流功能。
     
     

Redis与Memcached有什么区别?


  • Redis的读/写速度比Memcached快很多;
  • Redis支持数据持久化;
  • Redis支持更多的数据类型,而Memcached只支持最基本的键/值。
     
     

为什么要用缓存?


    这主要是出于性能方面的考量。内存的数据读取速度/并发承受量都远高于磁盘,因此将热点数据直接存于内存中将有效避免大量低效的数据库/磁盘I/O,并提升读取的最大并发量,而这两点都能为性能带来极大的收益。
 
 

为什么更推荐Redis,而不是使用Map/Guava做缓存?


    缓存分为本地缓存和分布式缓存。本地缓存的优点是轻量/快速,但缺点是生命周期与服务绑定,并且由于在多实例(分布式/集群)情况下每个实例都拥有各自的缓存,因此很容易在开发/使用时出现缓存不一致问题,Map/Guava就属于该类型的缓存。而Redis作为分布式缓存其优点是生命周期与服务无关,并且多实例(表面上)使用的缓存都相同,因此便保证了数据的访问性/一致性。这种特性明显更加符合当今服务的大规模分布式应用场景,因此相比Map/Guava而言更推荐使用Redis做缓存。当然Redis也不是毫无缺点,在保证高可用的情况下,其整体架构设计/实现都较复杂。
 
 

Redis有哪些优缺点?


 优点

  • 读/写性能优异:Redis的读/写速度为110000/81000次/s;
  • 使用便利:Redis支持五/三大基础/特殊数据类型,这使得其可以快速支持绝大多数的数据操作;
  • 支持事务/批处理:Redis的所有基础操作都是原子的,并支持将多个基础操作打包执行;
  • 支持数据持久化:Redis支持RDB/AOF两种数据持久化机制,其本质分别是数据快照/指令日志;
  • 支持主从备份:Redis支持一主多从/级联等多种集群部署方案,主机会自动将数据同步到从机,从而实现读写分离。
     

 缺点

  • 容量受内存限制:受限于物理内存昂贵而偏小的原因,Redis难以用于海量数据的存储,仅适用于微量数据的高性能读/写/运算;
  • 事务缺乏ACID属性:Redis事务只支持“伪”原子性/“读已递交”级别的隔离性,不支持数据回滚,并且不具备一致性/持久性;
  • 数据丢失:即使是在启动了持久化机制及主从同步的情况下,数据也无法完全避免丢失的情况发生;
  • 集群难以在线扩容:集群在内存耗尽时想要对进行在线扩容会变得很复杂,因为内存难以像磁盘一样动态增/删,因此运维人员在系统上线时必须确保有足够的内存来避免该问题,但这又会对资源造成了较大浪费。
     
     

Redis为什么这么快?


 基础数据类型

  • String & 字符串
        字符串类型是Redis最基本的数据类型,一个键对应一个值,但值最大不能超过512M;
        字符串类型不仅可以保存字符串,还可以保存数字,并支持递增/递减等操作;
        字符串类型是二进制安全的,这意味着它可以保存任何数据,比如JPEG图像或者序列化对象。
  • List & 列表
        列表类型是字符串类型的列表,会按元素的插入顺序进行排序;
        列表类型的底层实现是双向链表,因此支持首/尾两端的插入/移除/获取,并且时间复杂度都为O(1)。
  • Set & 集合
        集合类型是无序的字符串类型集合,会自动对插入的元素去重。
  • Zset & 有序集合
        有序集合类型是有序的字符串类型集合,会自动对插入的元素去重;
        有序集合类型与集合类型类似,但每个元素都会关联一个double类型的分数,并按分数进行排序;
        有序集合类型是唯一既可以进行范围查询又能够保持元素唯一性的数据结构。
  • Hash & 哈希
        哈希类型的本质是键值对,并且其键/值都是字符串类型;
        哈希类型非常适合存储对象,因为其键/值结构与类的字段/值结构高度相似。
     

 特殊数据类型

  • Bitmaps & 位图
        位图类型不是独立数据类型,而是基于字符串类型实现;
        位图类型的底层结构是位数组,其会将元素代表的唯一整数ID作为索引,用于在位数组中定位以记录元素是否存在而不记录元素本身。因此位图类型非常节省空间,也可以高效统计大量数据,如统计在线用户数等。
  • HyperLogLog & 基数
        基数类型可用于统计集合中不重复元素的数量;
        基数类型非常节省空间,但是它只能给出近似值而非精确值。
  • Geo & 地理
        地理类型用于存储经纬度等地理信息。
  • Streams & 流
        流类型提供了消息持久化/消费者组/消息确认等机制,是Redis官方推荐的消息队列解决方案。
     
     

Redis有哪些数据类型?


  • 硬件上基于内存实现,这是Redis快速的核心原因;
  • 算法上基于哈希实现,并在此基础上提供/优化了哈希/列表/集合等高效的数据结构,使得读/写可以在时间复杂度为O(1)的操作中完成;
  • 指令采用单线程执行,避免了线程/上下文切换的开销,也无需考虑锁相关的影响,并简化了数据处理的逻辑;
  • 采用非阻塞的多路I/O复用模型,使得单线程能够并发/高效地处理多客户端连接,减少了Redis在网络I/O上的等待,并且在Redis 6.0版本中引入了多线程机制进一步提升了网络I/O的处理性能。
     
     

如何最小化使用Redis内存?


    尽可能多的将相同对象的多项数据以哈希类型紧凑保存,这将大幅减少内存的消耗量

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

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

相关文章

C++ 魔法三钥:解锁高效编程的封装、继承与多态

快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 目录 💯前言 💯封装 1.封装概念 2.封装格式 3.封装的原理 4.封装的作用 💯继承 1.继承的概念 2.继承格式 3.继承的…

情感咨询小程序的市场需求大吗?

情感咨询小程序的市场需求较大,主要体现在以下几个方面: 情感问题普遍存在5: 恋爱关系困扰:在恋爱过程中,人们经常会遇到诸如沟通不畅、争吵频繁、信任危机等问题。例如,年轻人在恋爱初期可能会因为不了解…

【现代C++】常量求值

现代C(特别是C11及以后的版本)增强了对编译时常量求值的支持,包括constexpr函数、constinit和consteval关键字。这些特性允许在编译时进行更多的计算,有助于优化运行时性能并确保编译时的数据不变性。 1. constexpr - 编译时常量…

震惊!总环On Hold之后,这些期刊也正在被调查!涉及Nature旗下、WR、JCLP....

On Hold期刊 总环被Oh Hold应该是学术圈最近最热的新闻了。相关的调查团队5GH 也发布了相关的推送报道此事: 在该推送的留言区,该团队也透露了一些后续的调查进展,涉及了Nature旗下期刊以及多个中科院一区TOP。评论中大家对于期刊的热议度很高…

Kmeans聚类算法简述

Kmeans聚类算法 1、概述 是一种无监督学习算法,根据样本之间的相似性将样本划分到不同的类别中,不同的相似度计算方式,会得到不同的聚类结果,常用的相似度计算方式有欧式距离。 目的是在没有先验条件知识的情况下,自…

算法设计与分析:大整数的加减乘除运算

第1关:大整数的加减乘除运算 任务描述 本关任务:掌握大整数的基本思想,并运用大整数的基本运算计算出常规整数n的阶乘,然后统计大整数n!中数字0的个数。 相关知识 为了完成本关任务,你需要掌握:1.大整数的…

医学影像学基础:理解CT、MRI、X射线和超声等医学影像设备的基本工作原理和成像技术

目录 医学影像学基础 1. X射线成像 2. 计算机断层扫描(CT) 3. 磁共振成像(MRI) 4. 超声成像 综合对比 1、成像原理对比 2、安全性对比 3、应用领域对比 4、设备特点对比 总结 医学影像学基础 在医学影像学中&#xff0…

super和this

相同点: 1.都是Java中的关键字 2.都只可以在非静态方法中使用 3.在构造方法中使用必须是第一条语句并且二者不可以同时存在不同点: 1.this是当前对象的引用,super是子类对象从父类继承下来部分成员的引用 2.在非静态成员方法中,…

CSS、Less、Scss

CSS、Less和SCSS都是用于描述网页外观的样式表语言,但它们各自具有不同的特点和功能。以下是对这三者的详细阐述及区别对比: 详细阐述 CSS(Cascading Style Sheets) 定义:CSS是一种用来表现HTML或XML等文件样式的计算机…

etcd之etcd分布式锁及事务(四)

1、etcd分布式锁及事务 1.1 前言 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如 果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要…

计算机网络-CSMA/CD协议笔记及“争用期”的理解

假设a和b是总线型网络上相距最远的两个节点。 从零这个时刻a节点会往信道上发送数据,那么a节点发送的第一个比特,需要经过τ这么长的时间,也就是经过一个单向的传播时延之后。它的这个信号才可以被最远的这个节点检测到。那如果b结点在τ这个…

六、深度剖析 Hadoop 分布式文件系统(HDFS)的数据存储机制与读写流程

深度剖析 Hadoop 分布式文件系统(HDFS)的数据存储机制与读写流程 在当今大数据领域当中,Hadoop 分布式文件系统(HDFS)作为极为关键的核心组件之一,为海量规模的数据的存储以及处理构筑起了坚实无比的根基。…

android aild 传递多个参数, in ,out,inout

在 HIDL 和 AIDL 中,方法参数的传递方式有所不同。HIDL 使用 generates 关键字来表示方法的返回值,而 AIDL 使用 in、out 和 inout 关键字来表示参数的传递方向。 HIDL 中的 generates 在 HIDL 中,generates 关键字用于指定方法的返回值。例…

https://huggingface.co/上的模型无法用linux服务器clone怎么办(只需要稍微改一下网址,就可以切换到镜像下载)

问题描述: 在ubuntu系统上,使用如下命令,克隆仓库,报无法访问错误: git clone https://huggingface.co/distilbert/distilroberta-base通用解决方案: 把下面部分更换: https://huggingface.…

内存泄漏的隐形陷阱:console.log

console.log 本身不会直接导致内存泄漏,但在特定的场景下,其使用方式可能间接引发内存泄漏问题,特别是在以下情况: 1. console.log 引用闭包或对象 console.log 输出的数据如果包含引用类型(例如:对象、数…

Python 基础语法 - 逻辑运算符

逻辑运算符是用来做逻辑计算的,就像之前用到的比较运算符 ,每一次比较其实就是一次条件判断,都会得到一个相应的True或者False的值,而逻辑运算符的操作数就是一个用来做条件判断的表达式或者变量 运算符说明and与or或not非 1. an…

【云原生】云原生与DevOps的结合:提升软件开发与交付的效率

目录 引言一、什么是云原生?1.1 云原生的核心原则1.2 云原生的技术栈1.3 云原生的优势 二、DevOps的概述2.1 DevOps的起源与发展2.2 DevOps文化的重要性2.3 DevOps工具链 三、云原生与DevOps的结合3.1 CI/CD的概念与重要性3.2 持续交付的实施策略3.3 整合CI/CD流程3…

数字IC后端实现Innovus |给各种IP子模块添加port buffer和antenna diode万能脚本

我们之前分享过在hierarchical flow后端实现中为了确保顶层flatten时timing signoff和physical signoff看到的情况和模块级看到的情况一致,我们会在模块io port添加io port buffer(主要是timing,antenna一致性)。实际上在芯片级我…

PSINS工具箱函数介绍——inserrplot

关于工具箱 i n s e r r p l o t inserrplot in

一个关于@JsonIgnore的isxxx()问题

一个关于JsonIgnore的问题 版本:2.13.5 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><optional>true</optional></dependency>代码&#xff1a; Data public clas…