【Redis】Redis 介绍Redis 为什么这么快?Redis数据结构Redis 和Memcache区别 ?为何Redis单线程效率也高?

目录

Redis 介绍

Redis 为什么这么快?

Redis数据结构

Redis 和Memcache区别 ?

为何Redis单线程效率也高?


Redis 介绍

  • Redis 是一个开源(BSD 许可)、基于内存、支持多种数据结构的存储系统,可以作为数据库、缓存和消息中间件。它支持的数据结构有字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等,除此之外还支持 bitmaps、hyperloglogs 和地理空间(geospatial )索引半径查询等功能。

  • 它内置了复制(Replication)、LUA 脚本(Lua scripting)、LRU 驱动事件(LRU eviction)、事务(Transactions)和不同级别的磁盘持久化(persistence)功能,并通过 Redis 哨兵(哨兵)和集群(Cluster)保证缓存的高可用性(High availability)。

优点:

  • 读取速度快,因为数据存在内存中,所以数据获取快;

  • 支持多种数据结构,包括字符串、列表、集合、有序集合、哈希等;

  • 支持事务,且操作遵守原子性,即对数据的操作要么都执行,要么都不支持;

  • 还拥有其他丰富的功能,队列、主从复制、集群、数据持久化等功能。

缺点:

  • 由于 Redis 是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然Redis 本身有 Key 过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。

  • 如果进行完整重同步,由于需要生成 RDB 文件,并进行传输,会占用主机的 CPU ,并会消耗现网的带宽。不过 Redis 2.8 版本,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的备机。

  • 修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中, Redis不能提供服务。

Redis 为什么这么快?

  1. Redis 基于内存,内存的访问速度是磁盘的上千倍;

  2. 单线程模型:Redis 使用单线程模型处理客户端请求。它不需要进行复杂的线程切换和同步操作,从而避免了多线程并发带来的开销和竞争条件。单线程模型简化了 Redis 的实现,使其更加高效。

  3. 高效的数据结构:Redis 提供了多种高效的数据结构,如字符串、哈希表、列表、集合和有序集合等。这些数据结构在内部实现上进行了优化,使得 Redis 可以高效地执行各种操作,如快速插入、删除、查找和排序。

Redis数据结构

String

String是redis中最基本的数据类型,一个key对应一个value。

Hash

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

List

Redis中的List其实就是链表(Redis用双端链表实现List)。

使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。

Set

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

Zset

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的, 但分数(score)却可以重复。有序集合是通过两种数据结构实现:

  1. 压缩列表(ziplist): ziplist是为了提高存储效率而设计的一种特殊编码的双向链表。它可以存储字符串或者整数,存储整数时是采用整数的二进制而不是字符串形式存储。它能在O(1)的时间复杂度下完成list两端的push和pop操作。但是因为每次操作都需要重新分配ziplist的内存,所以实际复杂度和ziplist的内存使用量相关

  2. 跳跃表(zSkiplist): 跳跃表的性能可以保证在查找,删除,添加等操作的时候在对数期望时间内完成,这个性能是可以和平衡树来相比较的,而且在实现方面比平衡树要优雅,这是采用跳跃表的主要原因。跳跃表的复杂度是O(log(n))。

Redis 和Memcache区别 ?

Redis 与 Memcached 共同点

  1. 都是基于内存的数据库,一般都用来当做缓存使用。

  2. 都有过期策略。

  3. 两者的性能都非常高。

Redis 与 Memcached 区别

  • Redis 支持的数据类型更丰富(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;

  • Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了;

  • Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;

  • Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持;

为何Redis单线程效率也高?

  1. C语言实现,效率高

  2. 纯内存操作

  3. 单线程的话就能避免多线程的频繁上下文切换问题

  4. 丰富的数据结构(全称采用hash结构,读取速度非常快,对数据存储进行了一些优化,比如亚索表,跳表等)

5.基于非阻塞的IO复用模型机制

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大白话扩散模型(无公式版)

背景 传统的图像生成模型有GAN,VAE等,但是存在模式坍缩,即生成图片缺乏多样性,这是因为模型本身结构导致的。而扩散模型拥有训练稳定,保持图像多样性等特点,逐渐成为现在AIGC领域的主流。 扩散模型 正如…

python第三次作业

1、求一个十进制的数值的二进制的0、1的个数 def count_0_1_in_binary(decimal_num):binary_str bin(decimal_num)[2:]count_0 binary_str.count(0)count_1 binary_str.count(1)return count_0, count_1decimal_number int(input("十进制数:")) zero…

linux 外部GPIO Watchdog驱动适配

前言 文章描述, 利用外部gpio看门狗芯片驱动芯片的复位功能。 芯片:RK3568 平台: Linux ubuntu.lan 4.19.232 #27 SMP Sat Sep 23 13:43:49 CST 2023 aarch64 aarch64 aarch64 GNU/Linux 硬件接线图示 看门狗芯片采用GPIO喂狗,W…

PTA L2-037 包装机

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品&#x…

unity 横版过关单向通行实现(PlatformEffector2D)

目录 前言一、什么是 PlatformEffector2D?二、使用步骤1.创建模型2.创建jump脚本3.PlatformEffector2D组件 三、效果总结 前言 在 2D 游戏中,处理角色与平台之间的交互是一个常见但复杂的任务。为了简化这一过程,Unity 提供了 PlatformEffec…

五分钟,零基础也能入门 Python 图像文字识别

一. 前言 最近在研究 Python 的一些功能 , 也尝试了一些有趣实现, 这一篇就从实践的角度来研究一下 Python 如何实现图片识别。 众所周知 , Python 的库真的老多了,其中在图像识别上比较突出的就是 OpenCV. 那么基于这个库我们…

有效三角形的个数【双指针】

1.优化版暴力求解 如果能构成三⻆形,需要满⾜任意两边之和要⼤于第三边。实际上只需让较⼩的两条边之和⼤于第三边即可。将原数组排序,从⼩到⼤枚举三元组,这样三层 for 循环枚举出的三元组只需判断较⼩的两条边之和是否⼤于第三边。 class…

新一代酒店智能客控方案亮相上海酒店展:力合微PLC技术推动酒店智能化升级

3月26日,2024上海国际酒店及商业空间博览会(以下简称:上海酒店展)于上海新国际博览中心开幕。作为行业领先的物联网通信芯片企业,22年专注于PLC(电线通信)技术及芯片,(股…

代理与 XLogin 集成

代理与 XLogin 集成 通过将 Smartdaili 住宅代理与强大的 XLogin 反检测浏览器相匹配来解锁网络数据。 什么是 XLogin? XLogin 是一款防关联浏览器,具有多重指纹保护技术,可通过 Selenium 网络驱动程序实现任务自动化,并为每个…

变量,前世你也许是个过客!

很多书中喜欢将变量比喻成一个容器,比如盒子、碗之类的。但老金认为这个比喻有失妥当。按字面意思理解,变量只是一个可以改变的量,就像函数中的自变量x、因变量y一样。变量本身并不具有存储功能,有存储功能的是内存,所…

rmvb怎么转换为mp4?最简单方法!

各种文件格式层出不穷,而RMVB(RealMedia Variable Bitrate)格式作为一种独特的视频文件格式,其起源可以追溯到上世纪90年代。当时,随着数字视频的崛起,RealNetworks公司迎来了一项重要任务:提供…

【LVGL-平铺视图部件(lv_tileview)】

LVGL-平铺视图部件(lv_tileview) ■ LVGL-平铺视图部件(lv_tileview)■ 示例一:添加到行列中的位置(1,0)表示第1列第0行■ 示例二:滑动方向LV_DIR_RIGHT ,LV_DIR_LEFT■ …

Web Components初探

组件化,标签语义化,是前端发展的趋势。现在流行的组件化框架有React、Vue等,标签语义化在H5中添加的article、dialog等。 Web Components 就是类似的一套技术,允许您创建可重用的定制元素,并且在您的web应用中使用它们…

cesium 创建实体

1、 entity 1.1 entity类型整理 Entity分类 1.2 entity添加 椭圆 const ellipse new Cesium.Entity({position: Cesium.Cartesian3.fromDegrees(114.3, 39.9, 100),ellipse: {semiMinorAxis: 30000, //椭圆的短半轴semiMajorAxis: 40000, //椭圆的长半轴extrudedHeight: 0…

如何使用Fiddler对手机进行弱网测试?(干货教程)

1.首先,fiddler连接手机 1)Tools->Options->Connections->设置端口8888,勾选Allow remote computers to connect 2)配置手机 注:手机和电脑需要在同一局域网下 手机进入网络详情,将代理改为手动 设置主机名、端口 主机…

Python中的变量与常量

变量:在程序运行过程中,值会发生变化的量, 常量:在程序运行过程中,值不会发生变化的量。 无论是变量还是常量,在创建时都会在内存中开辟一块空间,用于保存它的值。 Python 中的变量不需要声明…

基于yolo-world与mobile_sam实现类似lang-segment-anything

lang-segment-anything基于segment-anything 和 GroundingDINO 实现基于语言分割出任意对象,但是segment-anything 模型与GroundingDINO 都是运算量比较大的模型。而mobile_sam号称是sam的同等性能替代品,而yolo-world同样是号称比GroundingDINO 更快更准…

那如何解决信创设配问题呢?怎么成为信创产品?

信创也好、国产化也好都是国家部署的重点工作,所有涉及到的相关行业和部门都必须坚持执行和并且要执行好的重点任务,这一点无容置疑。在信息化层面,随着我国基础水平(芯片、OS、DB、中间件)的提升,信创工作…

vscode c++环境配置

1.基础软件安装 安装Visual Studio Code. 安装C拓展。点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrlshiftX),搜索“C/C”,点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下…

KingSCADA|如何实现文本显示设备的实时通讯状态?

哈喽,你好啊,我是雷工! 在SCADA项目中,有些要求在界面上实时显示SCADA系统与设备的实时通讯状态,来及时了解PLC或其他设备与SCADA系统的通讯状态是否正常,以及简单的通讯异常分析,在KingSCADA中该如何实现通讯状态的文本显示呢? 接下来用简单的样例介绍KingSCADA如何实…