前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Redis交响乐】Redis中的数据类型/内部编码/单线程模型

【Redis交响乐】Redis中的数据类型/内部编码/单线程模型

作者头像
xxxflower
发布于 2024-01-04 00:37:06
发布于 2024-01-04 00:37:06
1590
举报
文章被收录于专栏:《数据结构》《数据结构》
文章目录
  • 一. Redis中的数据类型和内部编码
  • 二. Redis的单线程模型
    • 面试题: redis是单线程模型,为什么效率之高,速度之快呢?

在上一篇博客中我们讲述了Redis中的通用命令,本篇博客中我们将围绕每个数据结构来介绍相关命令.

一. Redis中的数据类型和内部编码

type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构.如下图所示:

(上述有序集合,相当于是除了存储member之外,还需要存储一个score(权重 分数)) 实际上Redis针对每种数据结构都有自己的底层内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码.

数据结构: value的数据类型. 编码方式: redis内部底层的实现. 在同一个数据结构中,背后的编码方式的实现可能是不同的.会根据特定场景进行优化.

数据类型

内部编码

解释说明

string

raw

最基本的字符(底层是一个byte数组(Java))

int

redis通常也可以用来实现一些计数功能,当value是一个整数的时候,此时可能redis会直接使用int来保存

embstr

针对短字符串进行的特殊优化

hash

hashtable

最基本的哈希表,redis内部的哈希表的实现

ziplist

在哈希表里面的元素比较少时,可能就优化成ziplist 因为压缩列表能够节省空间

list

linkedlist

链表

ziplist

压缩列表

set

hashtable

intset

集合中存的都是整数

zset

skiplist

跳表

ziplist

查看key 对应的 value 的实际编码方式命令为 :object encoding key

总的来说,redis会根据当前的实际情况选择内部的编码方式自适应.

二. Redis的单线程模型

假设此时有多个客户端,同时操作同一个redis服务器:

那么此时,这两个客户端相当于并发处理 value 值,同时使得 value 值+1,那么在这种情况下会不会出现线程安全的问题呢?

不会. 因为redis是单线程模型,就保证了当前收到的多个请求是串行执行的.也就是说,多个请求同时到达redis 服务器,也是要先在队列中排队的,再等待redis服务器一个一个取出里面的命令再执行,微观上讲,redis服务器是串行/顺序执行这多个命令的.

redis能够使用单线程模型很好地工作,原因主要在于redis的核心业务逻辑,都是短平快的,不消耗cpu资源.

单线程的弊端: 使用 redis 必须要特别小心,某个操作占用时间长,就会阻塞其他命令的执行.

面试题: redis是单线程模型,为什么效率之高,速度之快呢?

值得注意的是,在此面试题中的参考是像 MySQL,oracle,sql server这样的数据库.

  1. redis 访问内存,数据库则是访问硬盘.
  2. redis 核心功能,比数据库的核心功能更简单. 数据库对于数据的插入删除查询,都会有更复杂的功能支持.这样的功能势必要花费更多的开销.比如针对插入删除,数据库中的各种约束,都会使数据库做额外的工作.
  3. 单线程模型,避免了一些不必要的线程竞争开销. redis 每个基本操作,都是短平快的,即简单操作内存数据,不是什么特别消耗cpu的操作.
  4. 处理网络IO的时候,使用了 epoll这样的IO多路复用机制. IO 多路复用: 一个线程可以管理多个 socket ,针对TCP来说,服务器这边每次要服务一个客户端,都需要给这个客户端安排一个 socket .一个服务器服务多个客户端,同时就有很多个 socket .但是很多情况下,每个客户端和服务器之间的通信不是很频繁. 也就是说,同一时刻,只有少数socket是活跃的.此时我们就可以使用 IO多路复用.即一个线程来处理多个socket. Linux上提供的IO多路复用,主要有三套API : select poll epoll …

举个例子: 晚饭时间到,ABC三人决定晚上在夜市点饭吃.A想吃肠粉,B想吃蛋炒饭,C想吃羊杂. 于是有三种可执行方案: a) A去. 先买肠粉,等待; 再买蛋炒饭,等待; 再买羊杂,等待;(效率最低) b) ABC一起去. 各买各的.(效率大大提升,但是系统开销大) c) A去. 先去买肠粉,等待的过程中买蛋炒饭,等待的过程中买羊杂.这三份饭,哪个先做好了,哪个老板就喊一声饭好了.(喊一声就相当于epoll 事件通知/回调机制)

可以看到c方案的效率是最高的.此时A就能同时完成三件事.且三件事的交互不频繁,大部分时间都在等待.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【redis】redis的单线程模型为什么效率高?
Redis 只使用一个线程,处理所有的命令请求。不是说一个 Redis 服务器进程内部只有一个线程,其实也有多个线程,多个线程是在处理网络IO
椰椰椰耶
2025/03/12
890
【redis】redis的单线程模型为什么效率高?
redis缓存重要特性单线程模型
所有的客户端对服务端请求socket连接,服务端都会专门建立一个socket与其连接。
Tim在路上
2020/08/04
3620
Redis是单线程?
单线程指的是Redis的网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,网络请求模块之外的其他模块仍用了多个线程。
黑洞代码
2021/07/14
9940
Redis是单线程?
redis的线程模型
(1)纯内存访问。数据存放在内存中,内存的响应时间大约是100纳秒,这是Redis每秒万亿级别访问的重要基础。 (2)非阻塞I/O多路复用,Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了时间,不在I/O上浪费过多的时间。 (3)单线程避免了线程切换和竞态产生的消耗。 (4)单线程操作,避免了不必要的上下文切换和竞争条件。也没有加解锁的操作。
Java技术债务
2022/08/09
6850
redis的线程模型
《【面试突击】— Redis篇》--Redis的线程模型了解吗?为啥单线程效率还这么高?
《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高?
编程大道
2020/02/14
7120
Redis 单线程模型介绍
redis 将所有数据放在内存中,内存的响应时长大约为 100 纳秒,这是 redis 的 QPS 过万的重要基础。
CoderJed
2019/03/15
3.9K0
Redis 单线程模型介绍
redis单线程为什么慢
本文分为以下几个部分说明介绍redis单线程 1.redis为何使用单线程 2.redis使用单线程为何性能那么高 3.redis哪些功能不是单线程
灬沙师弟
2023/03/07
5660
redis单线程为什么慢
Redis为什么这么快?Redis是单线程还是多线程?
Redis是基于内存运行的高性能 K-V 数据库,官方提供的测试报告是单机可以支持约10w/s的QPS
全栈程序员站长
2022/06/29
8610
Redis为什么这么快?Redis是单线程还是多线程?
高性能IO模型:为什么单线程Redis能那么快?
Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程。但Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
Java程序猿阿谷
2020/11/24
8650
高性能IO模型:为什么单线程Redis能那么快?
Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么 Redis 单线程却能支撑高并发
Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么 Redis 单线程却能支撑高并发?
MickyInvQ
2022/05/06
5110
Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么 Redis 单线程却能支撑高并发
Redis线程模型
Redis是一个开源的远程内存型数据库(Remote Dictionary Server(远程字典服务器)),它不仅性能强劲,而且提供了5 种不同类型的数据结构,我们项目实践中可能会遇到的大部分问题都可以很自然地映射到这些数据结构上。除此之外,Redis通过复制、持久化(persistence)、Redis Sentinel、客户端分片(client-side sharding)等特性,让用户可以很方便地将Redis 扩展成一个高可用能够包含数百GB 数据、每秒处理上百万次请求的系统。
加多
2021/11/24
8410
Redis线程模型
Redis6.0为何引入多线程?单线程不香吗?
作者简介:曾任职于阿里巴巴,每日优鲜等互联网公司,任技术总监。15年电商互联网经历。
用户7927337
2020/11/04
1.7K0
Redis6.0为何引入多线程?单线程不香吗?
Redis 单线程模型工作原理
文章链接:https://cloud.tencent.com/developer/article/2466311
一杯茶Ja
2024/11/17
1740
Redis 线程模型
【1】Redis 是基于 Reactor 模式开发的网络事件处理器:这个处理器被称为文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型: ■ 文件事件处理器使用 I/O 多路复用(multiplexing)机制监听多个套接字 Socket,根据 Socket 上的事件来选择对应的事件处理器进行处理。 ■ 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时。与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。 【2】虽然文件事件处理器以单线程的方式运行,但其使用 I/O 多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与 Redis 服务器中其他同样以单线程方式运行的模块进行对接,这保持了 Redis 内部单线程设计的简单性。
Java架构师必看
2021/04/25
5470
Redis 线程模型
深度解析Redis线程模型设计原理
我们通常说Redis是单线程,主要指Redis的网络I/O和KV对读写是由一个线程完成,是Redis对外提供KV存储服务的主要流程。 但Redis其它功能如持久化、异步删除、集群数据同步等,是由额外线程执行的。
JavaEdge
2021/12/07
3400
深度解析Redis线程模型设计原理
【Redis破障之路】三:Redis单线程架构
众所周知,Redis是一个单线程架构的NoSQL数据库,但是是单线程模型的Redis为什么性能如此之高?这就是我们接下来要探究学习的内容。 1、Redis的单线程架构 1.1、Redis单线程简介 首
三分恶
2021/04/28
7940
【Redis破障之路】三:Redis单线程架构
面试官:你确定 Redis 是单线程的进程吗?
上周发了一篇:3 万字 + 40 张图 | 突击 40 道 Redis 常见面试题 ,由于文章很长,可能有的小伙伴很难吸收,所以决定拆开分开发,这样大家每天学几道面试题就行,压力不会那么大。
小林coding
2022/10/27
7490
面试官:你确定 Redis 是单线程的进程吗?
Redis 核心篇:唯快不破的秘密
学习一个技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架和架构体系,没有系统观。这样会很吃力,而且会出现一看好像自己会,过后就忘记,一脸懵逼。
码哥字节
2021/02/24
6560
Redis 核心篇:唯快不破的秘密
了解redis的单线程模型工作原理?一篇文章就够了
1、首先redis是单线程的,为什么redis会是单线程的呢? 从redis的性能上进行考虑,单线程避免了上下文频繁切换问题,效率高; 从redis的内部结构设计原理进行考虑,redis是基于Reactor模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler)。而这个文件事件处理器是单线程的,所以才叫redis的单线程模型,这也决定了redis是单线程的。 2、聊一聊redis的单线程模型构造部分? redis单线程模型中最为核心的就是文件事件处理器 而文件事件处理器结构包含5个部分,其实真正包含为4个部分(不包含socket队列,加上主要方便后面理解):多个socket、IO多路复用程序、socket队列、文件事件分派器、以及事件处理器。而事件处理器又分为3个部分为:连接应答处理器、命令请求处理器、命令回复处理器。如图:
HUC思梦
2020/09/03
3.6K0
了解redis的单线程模型工作原理?一篇文章就够了
为什么 redis 单线程却能支撑高并发
redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?
用户1148526
2020/02/13
1.2K0
为什么 redis 单线程却能支撑高并发
相关推荐
【redis】redis的单线程模型为什么效率高?
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文