关于Redis知识的理解

系列文章
关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解

关于HashMap的哈希碰撞、拉链法和key的哈希函数设计

关于JVM内存模型和堆内存模型的理解

关于代理模式的理解

关于Mysql基本概念的理解

关于软件设计模式的理解

文章目录

  • Redis的由来
  • 一、Redis数据类型的发展历程及使用命令?
        • 1.字符串(String)
        • 2.哈希表(Hash)
        • 3.列表(List)
        • 4.集合(Set)
        • 5.有序集合(Sorted Set)
        • 6.位图(Bitmap)
        • 7.HyperLogLog
        • 8.地理空间索引(Geo)
        • 9.流(Stream)
  • 二、Redis是单线程 还是多线程?为什么查询效率高?
    • 1.单线程模型
    • 2.查询效率高
      • 内存数据存储
      • 单线程优势
      • 非阻塞I/O模型
      • 高效的数据结构和算法
  • 三、Redis的部署模式有哪些?
      • 单机模式
      • 主从模式
      • 哨兵模式
      • 集群模式
  • 四、有序集合(Sorted Set)如何保证有序性?
        • 按分数排序
        • 唯一性
        • 基于跳跃表(Skip List)实现

Redis的由来

Redis的作者,叫Salvatore Sanfilippo,来自意大利的西西里岛,居住在卡塔尼亚。目前供职于Pivotal公司。他使用的网名是antirez。为了解决网站的负载问题而在 2009 年 发明了 Redis,并在社区的帮助下将其发展成为一种流行的开源数据库和缓存解决方案。

一、Redis数据类型的发展历程及使用命令?

Redis支持的数据类型是其核心功能之一,随着时间的推移,它不断扩展和改进。以下是Redis支持的主要数据类型的发展历程以及它们的常见使用命令:

1.字符串(String)

发展历程:字符串是Redis最基本的数据类型之一,从一开始就被支持。
常见命令:SET、GET、DEL、INCR、DECR等。

2.哈希表(Hash)

发展历程:Redis 2.0 引入了哈希表数据类型。
常见命令:HSET、HGET、HDEL、HGETALL、HINCRBY等。

3.列表(List)

发展历程:Redis 1.0 引入了列表数据类型。
常见命令:LPUSH、RPUSH、LPOP、RPOP、LRANGE等。

4.集合(Set)

发展历程:Redis 2.0 引入了集合数据类型。
常见命令:SADD、SREM、SMEMBERS、SINTER、SUNION等。

5.有序集合(Sorted Set)

发展历程:Redis 1.2 引入了有序集合数据类型。
常见命令:ZADD、ZRANGE、ZREM、ZSCORE、ZINTERSTORE等。

6.位图(Bitmap)

发展历程:Redis 2.6 引入了位图数据类型。
常见命令:SETBIT、GETBIT、BITCOUNT、BITOP等。

7.HyperLogLog

发展历程:Redis 2.8 引入了HyperLogLog数据类型。
常见命令:PFADD、PFCOUNT、PFMERGE等。

8.地理空间索引(Geo)

发展历程:Redis 3.2 引入了地理空间索引数据类型。
常见命令:GEOADD、GEODIST、GEORADIUS、GEORADIUSBYMEMBER等。

9.流(Stream)

发展历程:Redis 5.0 引入了流数据类型。
常见命令:XADD、XREAD、XTRIM、XLEN等。

二、Redis是单线程 还是多线程?为什么查询效率高?

1.单线程模型

Redis一直以来都是单线程的,这是其设计和实现的核心特性之一。在Redis 6.0版本,为了改进Redis的性能和扩展性, 引入了多线程 I/O(I/O threading)。但它仍然保持了单线程模型。也就是说,Redis在执行命令和数据处理时仍然是单线程的,多线程仅用于处理输入/输出操作,例如网络请求和磁盘操作。

2.查询效率高

查询效率高,主要是由于以下几个原因:

内存数据存储

Redis主要将数据存储在内存中,而不是磁盘上。由于内存的读写速度比磁盘快得多,因此Redis能够以极快的速度响应查询请求。此外,Redis还支持持久化机制,可以将内存中的数据定期或在特定条件下持久化到磁盘上,以防止数据丢失。

单线程优势

虽然Redis是单线程的,但是它通过高效利用CPU和内存以及非阻塞I/O模型,能够在单线程的情况下处理大量的并发请求。与多线程相比,单线程模型避免了线程切换和同步开销,简化了并发控制,从而提高了系统的整体性能。

非阻塞I/O模型

Redis使用了非阻塞的I/O多路复用模型(例如epoll、kqueue等),这使得单个线程可以同时处理多个客户端连接的请求。当一个客户端的请求需要等待磁盘I/O或网络I/O时,Redis可以继续处理其他客户端的请求,而不会被阻塞。

高效的数据结构和算法

Redis内部使用了高效的数据结构和算法来实现不同的数据类型和操作,例如使用哈希表来实现键值对存储、使用跳跃表来实现有序集合等。这些数据结构和算法的选择使得Redis在处理数据时具有高效性能。

三、Redis的部署模式有哪些?

Redis可以以多种方式进行部署,取决于应用的需求、规模和可用资源。以下是几种常见的Redis部署模式:

单机模式

在单机模式中,Redis运行在单个服务器上,作为一个独立的实例。这种部署模式适用于小型应用或者开发环境,具有简单、快速部署的优点。

主从模式

在主从模式中,Redis包含一个主节点和一个或多个从节点。主节点负责接收写操作并将数据同步到从节点,而从节点则负责复制主节点的数据,并且可以处理读请求。这种部署模式提高了系统的可用性和容错性,并且可以实现读写分离,提高读取性能。

哨兵模式

在哨兵模式中,通过使用Redis Sentinel来监控和管理多个Redis实例,实现自动故障转移和故障检测。Sentinel部署模式可以提高系统的可用性和容错性,适用于需要高可用性的生产环境。

集群模式

在集群模式中,使用Redis Cluster来分片和复制数据,并在多个节点之间进行负载均衡和数据同步。集群模式部署适用于大规模应用和需要横向扩展的场景,能够提供高可用性、横向扩展和自动分片的功能。

四、有序集合(Sorted Set)如何保证有序性?

在Redis中,有序集合(Sorted Set)是一种特殊的数据结构,它保持了元素的有序性,并且每个元素都关联着一个分数(score)。Redis使用有序集合来存储一组元素,并根据元素的分数进行排序。以下是Redis如何保证有序性的几个关键点:

按分数排序

有序集合中的元素按照其关联的分数进行排序。当元素被添加或者更新时,Redis会根据新的分数重新排序元素,以保持集合的有序性。

唯一性

在有序集合中,每个元素都是唯一的。如果添加的元素已经存在于集合中,那么它的分数会被更新,但元素的位置不会改变。

基于跳跃表(Skip List)实现

Redis内部使用跳跃表作为有序集合的底层实现。跳跃表是一种高效的数据结构,可以在O(log N)的时间复杂度内进行插入、删除和查找操作,并且可以保持元素的有序性。

总的来说,Redis通过使用跳跃表作为底层实现,以及根据分数进行元素的排序和唯一性保证,来确保有序集合的有序性。这使得Redis的有序集合成为了一种高效、灵活且功能强大的数据结构,适用于各种需要排序功能的场景。

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

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

相关文章

SpringTask Cron表达式

Cron表达式格式 1.Cron表达式格式 Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 秒 分 时 一个月第几天 月 一个星期第几天 年 &…

fegin返回参数统一处理

相关版本: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.3</version></parent><properties><spring-cloud.version>2023.0.0</spri…

C语言:生命周期和作用域,static和extern

关键字static与extern 1.作用域&#xff08;scope&#xff09;&#xff1a;代码中能够访问到变量的范围&#xff08;变量可以被使用的文本区间&#xff09;。&#xff08;分为全局作用域和局部作用域&#xff09; ☺全局作用域&#xff1a;在整个程序中都能访问的变量。通常…

C语言入门系列:数据类型转换

文章目录 一&#xff0c;自动类型转换1&#xff0c;赋值运算1.1&#xff0c;浮点数赋值给整型变量-不安全1.2&#xff0c;整数赋值给浮点数变量-安全1.3&#xff0c;窄类型赋值给宽类型-安全1.4&#xff0c;宽类型赋值给窄类型-不安全 2&#xff0c;混合类型的运算2.1&#xff…

Python 连接clickhouse常用的三种方式

1. 概述 ClickHouse是一个开源的分布式列式数据库管理系统&#xff0c;它被设计用于存储和分析大规模数据。Python是一种流行的编程语言&#xff0c;凭借其简洁的语法和丰富的生态系统&#xff0c;成为了数据处理和分析的首选语言之一。在Python中&#xff0c;我们可以使用多种…

Ubuntu24使用kubeadm部署高可用K8S集群

Ubuntu24使用kubeadm部署高可用K8S集群 使用kubeadm部署一个k8s集群&#xff0c;3个master1个worker节点。 1. 环境信息 操作系统&#xff1a;ubuntu24.04内存: 2GBCPU: 2网络: 能够互访&#xff0c;能够访问互联网 hostnameip备注k8s-master1192.168.0.51master1k8s-maste…

20.Cargo和Crates.io

标题 一、采用发布配置自定义构建1.1 默认配置1.2 修改配置项 二、将crate发布到Crates.io2.1 编写文档注释2.2 常用&#xff08;文档注释&#xff09;部分2.3 文档注释作用测试2.4 为包含注释的项添加文档注释2.5 使用pub use导出公有API2.6 创建Crates.io账号2.7 发布2.8 版本…

【Flutter】基础教程:从安装到发布

Flutter 是一种流行的开源移动应用开发框架&#xff0c;由 Google 开发&#xff0c;可用于构建高性能、跨平台的移动应用。本教程将带领你从安装 Flutter 开发环境开始&#xff0c;一步步完成第一个程序&#xff0c;并介绍如何将应用发布到各个平台上。 跨端原理的关键点包括&a…

基于STM32的智能停车场管理系统

目录 引言环境准备智能停车场管理系统基础代码实现&#xff1a;实现智能停车场管理系统 4.1 车位检测模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能停车场管理与优化问题解决方案与优化收尾与总结 1. 引言 智能停车场管理系统通…

Linux常用命令(17)—pastesortcomm命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

kotlin空类型安全 !! ?. ?:

1、定义可空类型 fun main(){// 定义可空类型var x:String? "hello"x null } 2、!! 强转类型 定义可空类型之后&#xff0c;如果使用其内置方法&#xff0c;编译不会通过&#xff0c;因为值有可能为null&#xff0c;可以使用 !! 把类型强转为不可空&#xff1a…

仿中波本振电路的LC振荡器电路实验

手里正好有一套中波收音机套件的中周。用它来测试一下LC振荡器&#xff0c;电路如下&#xff1a; 用的是两只中频放大的中周&#xff0c;初步测试是用的中周自带的瓷管电容&#xff0c;他们应该都是谐振在465k附近。后续测试再更换电容测试。 静态电流&#xff0c;0.5到1mA。下…

malloc和new的本质区别

目录 一、结论 二、示例 1.实现类T 2.用malloc分配类T的内存空间 3.用new分配类T的内存空间 一、结论 malloc 和 new 都是用于在运行时动态分配内存的机制。但它们之间存在一些本质的区别&#xff0c;主要是在使用方面&#xff0c;现在我们直接说结论&#xff0c;然后在通过…

第5天:函数

学习目标 理解函数的基本概念和作用掌握函数的定义和调用学习参数传递和返回值了解作用域的概念 学习内容 1. 函数的基本概念 函数是组织代码的基本方式&#xff0c;它将一组逻辑相关的操作封装在一起&#xff0c;通过函数名调用函数&#xff0c;可以使代码更简洁、更易读和…

ArcGIS与Excel分区汇总统计三调各地类面积!数据透视表与汇总统计!

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 01 需求说明 介绍一下ArcGIS与Excel统计分区各地类的三调地类面积。 ArcGIS统计分析不会&#x…

Unity客户端的Http通讯实战

背景知识 在Unity游戏开发中&#xff0c;一个常见场景是&#xff0c;后端扔过来一个Swagger后端接口网页&#xff0c;需要你使用对应的接口对应的接口发送和接收数据&#xff0c;如图所示为发起Get请求&#xff1a; 我们可以通过点击Try it out按钮直接在网页上测试收发数据&a…

spring整合openAI大模型之Spring AI

文章目录 一、SpringAI简介1.什么是SpringAI2.SpringAI支持的大模型类型&#xff08;1&#xff09;聊天模型&#xff08;2&#xff09;文本到图像模型&#xff08;3&#xff09;转录&#xff08;音频到文本&#xff09;模型&#xff08;4&#xff09;嵌入模型&#xff08;5&…

Guava-EventBus 源码解析

EventBus 采用发布订阅者模式的实现方式&#xff0c;它实现了泛化的注册方法以及泛化的方法调用,另外还考虑到了多线程的问题,对多线程使用时做了一些优化&#xff0c;观察者模式都比较熟悉&#xff0c;这里会简单介绍一下&#xff0c;重点介绍的是如何泛化的进行方法的注册以及…

建筑工程八大员标准员题库附答案

一、单选题(在每小题列出的四个选项中&#xff0c;只有一个最符合题目要求的选项) 1、【单选题】( )适用于处理较厚软土和冲填土地基,多用于处理机场跑道、水工结构、道路、路堤、码头、岸坡等工程地基,对于泥炭等有机质沉积地基则不适用。(B) A、换土垫层法 B、预压法 C、灰…

dial tcp 10.96.0.1:443: connect: no route to host

1、创建Pod一直不成功&#xff0c;执行kubectl describe pod runtime-java-c8b465b98-47m82 查看报错 Warning FailedCreatePodSandBox 2m17s kubelet Failed to create pod sandbox: rpc error: code Unknown desc failed to setup network for…