当前位置: 首页 > news >正文

Redis常用数据库及单线程模式

数据结构和内部编码

type命令实际放回是当前键数据结构类型,有string,list,hash,set,zest。

redis底层实现上述数据,在源码层面会有优化,就可以节省空间和时间上的消耗,编码方式会有不同。

redis针对每种数据结构都有自己底层内部编码实现,有多种的形式,如hash表,进行查询,插入,删除操作都是O(1),但是背后的实现不一定是hash,但能保证时间复杂度是不变的。就像你买可乐,但是给你雪碧,虽然不一样,但是都有汽包。

示例

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> object encoding mylist
"quicklist"

“编码”(encoding)​​ 指的是 Redis 在底层存储数据时采用的具体实现方式或数据结构。

设计意义

可以进行内部编码,对外部数据结构没有任何影响,一旦开发出更优势的内部编码,就不需要改动外部数据结构和命令。

多种内部编码实现,就可以在不同场景下发挥各自优势,有的可以节省空间,有的可以提高效率,具体使用哪一个是看环境的,阈值不是不变的。

redis内部编码

raw:底层就是持有一个char数组。

int:Redis 通常也可以用来实现“计数”的功能 --- 点赞计数,当value就是一个整数的时候, Redis就会直接使用 int 来保存。

embstr:针对短字符串进行的特殊优化,这样占据的空间会比较小,大了就转成raw。

hashtable:这就是最基本的哈希表。

ziplist:压缩列表,针对特殊的场景下,就是在哈希表里面元素比较少的时候,可能就优化成了 ziplist 了,可以节省空间。遍历的过程因为量少也是O(1)的。

linkedlist:就是普通的链表。Redis 3.2 开始引入了 quicklist 来代替了 list 的上面这两种内部编码。

intset:集合中存放的都是整数,就会优化成intset

skiplist:跳表,每个节点上有多个指针域,巧妙的搭配这些指针域的指向,就可以做到从跳表上查询元素的时间复杂度是 O(logN)。

​跳表 = 电梯 + 楼梯​

  • ​第 1 层(L1)​​:每层都有楼梯(所有节点相连,相当于原始链表)。

  • ​第 2 层(L2)​​:每隔 2 层有一个电梯(比如 1→3→5→7→9),可以直接跳过中间楼层。

  • ​第 3 层(L3)​​:每隔 4 层有一个高速电梯(比如 1→5→9),跳过的楼层更多。

​查找过程(查询 Nike 在 7 楼)​​:

  • 先坐 ​​L3 高速电梯​​:1→5(因为 9 超过了 7,不下)。

  • 换乘 ​​L2 电梯​​:5→7(找到目标!)。

  • 总共只检查了 ​​1→5→7​​ 三个节点,而不是 1→2→...→7 的 7 次。

单线程架构

redis只是用一个线程,处理所有的命令请求,redis内部并不是只有一个线程,有多个线程,但是其它线程都是处理网络IO请求,这些线程会把数据都交给一个核心线程处理。

多个线程数据发送过去,但是因为单线程,所以是串行执行,所有请求的处理都是出一个进一个。

Redis单线程高效原因

通常来讲,单线程处理能力要比多线程差,例如有 10000 公斤货物,每辆车的运载能力是每次 200 公斤,那么要 50 次才能完成;但是如果有 50 辆车,只要安排合理,只需要依次就可以完成任务。那么为什么 Redis 使用单线程模型会达到每秒万级别的处理能力呢?

1.内存访问

redis的所有数据都在内存中,而内存响应时间短。

2.非阻塞IO

redis使用epoll作为IO多路复用技术实现,redis中事件处理模型将连接,读写,关闭都变为事件,就在网络IO上减少了时间,在业务逻辑不复杂情况下,这样就可以高效处理请求了,要是业务逻辑复杂,就会在处理业务上等待时间,就会阻塞住。

http://www.dtcms.com/a/461551.html

相关文章:

  • Subword-Based Tokenization策略之BPE与BBPE
  • 网站关键词用热门的还是冷门青岛天河小学网站建设
  • 个人域名备案 网站名称一元购网站建设流程图
  • 企业级灰度发布架构:基于Nginx的精细化流量治理与平滑演进实践
  • 【滑动窗口专题】第一讲:长度最小的子数组
  • 软考-系统架构设计师 基于架构的软件开发方法详细讲解
  • 电子电气架构 --- 操作系统的基本概念
  • 苏州做网站公司电话wordpress资源分享网
  • 手机能建设网站企业的做网站
  • Unity笔记(十一)——换装、Spine骨骼动画、3D动画相关
  • 面向汽车网络安全的轻量级加密技术
  • 《投资-114》价值投资者的认知升级与交易规则重构 - 从大规模分工的角度看,如何理解“做正确的事”,即满足下游正确的需求
  • 添加一路AXI总线对DDR进行读写时,XDMA测试不通过
  • 基于python的机器学习(十)—— 评估算法(三)
  • 男女做那个的的视频网站检察院门户网站建设成效
  • Oracle的SID是什么
  • Oracle大会临近,23ai 本地版会发布吗?
  • 【Python刷力扣hot100】11. Container With Most Water
  • 通信建设网站做网站主页上主要放哪些内容
  • 《常用 IDL(接口定义语言)详解与对比》
  • 做二手房产网站多少钱河南建设工程信息网站
  • K230基础-获取触摸坐标
  • Linux应用--网络编程
  • 鸟哥的Linux私房菜 第三部分: 学习shell与shell script
  • 鸿蒙中 UDP 数据包发不出去?一文教你从权限到代码彻底排查!
  • 前端小白学习路线(参考)
  • 大连工业大学图书馆网站建设优化培训班
  • 浅谈 富文本编辑器
  • 有手机网站了还要微网站吗设计平台兼职
  • **发散创新:状态函数在编程中的深度应用与实现**在编程领域,状态函数是一个核心概