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

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

作者头像
xxxflower
发布于 2024-01-04 00:37:06
发布于 2024-01-04 00:37:06
1610
举报
文章被收录于专栏:《数据结构》《数据结构》
文章目录
  • 一. 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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring AOP 实现 原
AOP(Aspect Orient Programming),我们一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务、日志、缓存、分布式锁等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。Spring的主要动态代理有CGLib和JDK自动代理。
chinotan
2019/04/03
4390
Spring AOP 实现
                                                                            原
Spring读源码系列之AOP--08--aop执行完整源码流程之自动代理创建器导入的两种方式
下面这篇文章讲过spring的标签解析过程,aop:aspectj-autoproxy严格来说属于自定义标签, spring默认和自定义标签的解析过程
大忽悠爱学习
2022/05/10
6650
Spring读源码系列之AOP--08--aop执行完整源码流程之自动代理创建器导入的两种方式
从@Async案例找到Spring框架的bug:exposeProxy=true不生效原因大剖析+最佳解决方案【享学Spring】
本文标题包含有'靓丽'的字眼:Spring框架bug。相信有的小伙伴心里小九九就会说了:又是一篇标题党文章。 鉴于此,此处可以很负责任的对大伙说:本人所有文章绝不哗众取宠,除了干货只剩干货。
YourBatman
2019/09/03
16K5
跨语言深入探讨如何实现方法增强:Java & Go的多策略实现
猫头虎博主在此!👋 大家好,我是一只始终对技术保持着无限热爱的猫头虎。今天,我将带大家深入探讨在Java和Go语言中的方法增强技术。你是否在搜索如何在类内部调用另一个有注解的方法?🔍 或是怎样在Go中通过不同的设计模式来实现方法的增强呢?不必再苦恼,这篇博文将为你提供一站式的解决方案!拿起你的☕️,一起来学习吧!
猫头虎
2024/04/09
1230
跨语言深入探讨如何实现方法增强:Java & Go的多策略实现
详细整理Spring事务失效的具体场景及解决方案
实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制;好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Spring事务失效的场景,希望开发过程尽量避免踩坑,造成时间精力的浪费。 溪源按照最基本的使用方式以及常见失效场景优先级整理,先简单介绍一下具体失效场景:
沁溪源
2020/09/02
1.2K0
SpringBoot中异步请求和异步调用(看这一篇就够了)
可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。
Java团长
2019/12/25
3.3K0
SpringBoot中异步请求和异步调用(看这一篇就够了)
SpringAop源码分析(基于注解)一
关于Aop的原理,简单来讲无非就是用代理模式为目标对象生产代理对象,对原有的方法进行增强。看上去挺简单,但在Spring中,有许多细节是要注意到的。比如:
周同学
2019/10/24
4910
Spring AOP注解为什么失效?90%Java程序员不知道
使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效。 如下面几种场景 1、Controller直接调用Service B方法:Controller > Service A 在Service A 上加@Transactional的时候可以正常实现AOP功能。 2、Controller调用Service A方法,A再调用B方法:Controller > Service A > Service B 在Service
Java技术栈
2018/03/30
1.4K0
完整剖析SpringAOP的自调用
spring全家桶帮助java web开发者节省了很多开发量,提升了效率。但是因为屏蔽了很多细节,导致很多开发者只知其然,不知其所以然,本文就是分析下使用spring的一些注解,不能够自调用的问题。因为本身这类文章很多,所以有些地方不会详述,直接引用其他文章。
方丈的寺院
2019/09/18
7270
完整剖析SpringAOP的自调用
事务没回滚?来,我们从现象到原理一起分析一波!
需求是有两个表,分别是订单表和订单附加信息表,其中订单表一定要落数据,订单附加信息表保存的时候如果有异常,则回滚,但是不能影响订单表的数据。
why技术
2019/09/18
6160
事务没回滚?来,我们从现象到原理一起分析一波!
阿里四面:你知道Spring AOP创建Proxy的过程吗?
Spring在程序运行期,就能帮助我们把切面中的代码织入Bean的方法内,让开发者能无感知地在容器对象方法前后随心添加相应处理逻辑,所以AOP其实就是个代理模式。 但凡是代理,由于代码不可直接阅读,也是初级程序员们 bug 的重灾区。
JavaEdge
2021/12/07
4850
阿里四面:你知道Spring AOP创建Proxy的过程吗?
Spring Aop标签解析原理详解
对于Spring Aop的实现,是非常复杂的,其实现过程主要包含xml标签的解析,切面表达式的解析,判断bean是否需要应用切面逻辑,以及使用Jdk代理或者是Cglib代理生成代理类,本文主要讲解Xml标签的解析的实现原理。
JavaQ
2019/05/30
5430
(六)Spring源码解析:Spring AOP源码解析
当我们对某些类有横切性的逻辑时,为了不破坏目标类,我们则可以使用AOP的方式将增强逻辑注入到目标类上。为了更清晰的了解AOP的用法,下面我们通过一个使用案例,实现一下面向切面编程。
爪哇缪斯
2023/09/06
7810
(六)Spring源码解析:Spring AOP源码解析
@Transactional 你真的用对了吗?
某天我在做自己的需求时,发现有一个同事写的老接口(Ps:此处真的是我有一个同事😶)里的一行代码IDE有个警告提示,本来也没在意,以为就是个格式检查,但是瞄了一眼,发现不对劲,提示的是:
别惹CC
2025/01/14
1730
SpringBoot - 优雅的处理【长事务】
在Spring体系中,在方法上加上注解@Transactional,Spring自动帮我们进行事务的开启、提交、回滚操作,真的是太方便了,以至于不分青红皂白,啥都搞上…
小小工匠
2022/03/10
2.1K0
SpringBoot - 优雅的处理【长事务】
Spring源码之AOP的使用
我们都知道 Java 是一门面向对象(OOP)的语言,所谓万物皆对象。但是它也存在着一些个弊端:当你需要给多个不具有继承关系的对象引入同一个公共的行为的时候,例如日志,安全检测等等,我们只能在每个对象中去引入这个公共行为,这样就产生了大量的重复代码,并且耦合度也会很高,不利于维护。正因如此就产生了面向切面(AOP)编程。可以说有了 AOP 使得面向对象更加完善,是对其的一个补充,AOP 所关注的方式是横向的,不同于 OOP 的纵向,接下来我们详细讲解一下 spring 中的 AOP。
@派大星
2023/06/28
1600
Spring源码之AOP的使用
SpringBoot 内部方法调用,事务不起作用的原因及解决办法
在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。
曾高飞
2022/08/15
2.6K0
基于注解的SpringAOP源码解析(一)
本文会分析Spring的AOP模块的整体流程,分析过程需要使用一个简单的demo工程来启动Spring,demo工程我以备好,需要的童鞋自行在下方链接下载:
Java学习录
2019/08/19
5680
@Transactional 自调用失效问题解析
”脏脏包“在技术群里问了一个问题:”大家有在项目中遇到这样的场景吗 在一个service层重写的方法中调用一个私有方法。 service重写的方法不加事务 私有方法想加入事务 他去调用私有方法时 私有方法需要被事务控制“ 。
明明如月学长
2021/08/31
1.2K0
@Transactional 自调用失效问题解析
aop:aspectj-autoproxy
因为AopDemo实现了AopDemoInter接口,但做实验的send方法又不在此接口里定义,所以只能用cglib的方式代理。
MickyInvQ
2021/10/18
8260
推荐阅读
相关推荐
Spring AOP 实现 原
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档