Redis的数据类型和内部编码详解

 更新时间:2024年04月18日 11:22:04   作者:机智的土拨鼠  
Redis是通过Key-Value的形式来组织数据的,而Key的类型都是String,而Value的类型可以有很多,在Redis中最通用的数据类型大致有这几种:String、List、Set、Hash、Sorted Set,下面通过本文介绍Redis数据类型和内部编码,感兴趣的朋友一起看看吧

前言

为了后续能更好的讲解Redis的各种数据类型,我们需要学习一点前置知识。

数据类型

Redis是通过Key-Value的形式来组织数据的,而Key的类型都是String,而Value的类型可以有很多。

在Redis中最通用的数据类型大致有这几种:String、List、Set、Hash、Sorted Set。

不过,Redis底层在实现这些数据结构(类型)的时候,会在源码层面进行优化,以达到节省时间/节省空间的效果,而对于内部数据结构也称之为内部编码。

Ps:有点指鹿为马的感觉。Redis告诉你,我的类型就是一个字符串,但自己背后却给优化成了整形,指着整形说是字符串,然后咱也只能老老实实用~

String

在String类型中有三种内部编码方式:raw、int、embstr。

raw:最基本的字符串,底层就类似是Java中的byte数组。

int:在特定场景下,会优化成整数,方便进行数值计算。

embstr:针对短字符串进行的优化。

Hash

在Hash类型中有两种内部编码方式:hashtable、ziplist。

hashtable:最基本的哈希表(不同于Java标准库中的HashTable)。

ziplist:压缩列表,当哈希表中的元素比较少的时候,就进行了优化,节省空间。

List

在List类型中有两种内部编码方式:linkedlist、ziplist。

linkedlist:链表的形式

ziplist:压缩列表

不过从redis3.2开始,就引入了新的实现方式:quicklist。

quicklist:集成了链表和压缩列表的优势。本质上就是一个链表,而每个元素又是一个压缩列表。当元素很多的时候,如果全是链表,就会出现很多节点,而每个节点都需要使用指针域,这也会大大增加开销。

Set

在Set类型中有两种内部编码方式:hashtable、intset。

intset:存储的都是整数的集合。

Zset

在Set类型中有两种内部编码方式:skiplist、ziplist。

skiplist:跳表,跳表也是链表,不同于普通链表的是,跳表的每个节点上有很多指针域,巧妙利用这个特性,查询速度能调高到O(logn).

查询内部编码方式指令

#基本语法
object encoding key
#查询key的内部编码

Redis会自动根据当前的实际情况选择内部的编码方式~~真香!

Redis的单线程模型

此处的单线程模型并非是真的说在Redis内部只有一个线程在工作,说的是Redis只用一个线程来处理命令请求,在Redis内部还有其他一些线程是用来处理网络IO的,毕竟是作为一个服务器来使用的~~

正是由于Redis的单线程模型,以至于当多个客户端并发的对Redis服务器进行操作的时候,不会有线程安全的问题,多个请求来的时候就使用放到一个队列里,串行的去处理里面的命令。而且Redis的主要核心业务逻辑也都是一些“短频快”的操作,不太消耗CPU,所以单线程模型才能很好的工作,但也有弊端:当一个指令执行的时间太长,就会阻塞其他指令!!!

面试题:

Redis虽然是单线程模型,为啥效率这么高呢?

1.Redis访问的是内存中的数据,相较于数据库访问的是硬盘数据,会快很多。

2.Redis的核心功能,比数据库简单(数据库支持各种各样的约束,功能很强大,势必会带来更多开销)。

3.单线程模型避免了一些不必要的线程竞争开销。

4.处理网络IO的时候,使用了epoll这样的IO多路复用机制。

到此这篇关于Redis的数据类型和内部编码的文章就介绍到这了,更多相关Redis数据类型和内部编码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用redis实现高效分页的项目实践

    使用redis实现高效分页的项目实践

    在很多场景下,我们需要对大量的数据进行分页展示,本文主要介绍了使用redis实现高效分页的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Redis连接被拒绝(Connection refused)问题的完整解决指南

    Redis连接被拒绝(Connection refused)问题的完整解决指南

    这篇文章主要介绍了Redis连接被拒绝问题的诊断和解决流程,涵盖了服务未运行、配置限制、防火墙阻挡、资源不足等常见原因,并提供了相应的解决方案和安全配置建议,需要的朋友可以参考下
    2025-11-11
  • redis中token失效引发的一次生产事故

    redis中token失效引发的一次生产事故

    项目再测试的时候发现不定时token失效,本文主要介绍了redis中token失效引发的一次生产事故,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • NestJS+Redis实现缓存步骤详解

    NestJS+Redis实现缓存步骤详解

    这篇文章主要介绍了NestJS+Redis实现缓存,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Python的Flask框架使用Redis做数据缓存的配置方法

    Python的Flask框架使用Redis做数据缓存的配置方法

    Redis数据库依赖于主存,在关系型数据库以外再配套Redis管理缓存数据将对性能会有很大的提升,这里我们就来看一下Python的Flask框架使用Redis做数据缓存的配置方法
    2016-06-06
  • 浅析Redis底层数据结构Dict

    浅析Redis底层数据结构Dict

    Redis是一个键值型的数据库,我们可以根据键实现快速的增删改查,而键与值的映射关系正是通过Dict来实现的,当然 Dict 也是 Set Hash 的实现方式,本文就详细带大家介绍一下Redis底层数据结构 Dict,,需要的朋友可以参考下
    2023-05-05
  • 使用Redis实现分布式锁的代码演示

    使用Redis实现分布式锁的代码演示

    edis作为一个高性能的内存数据库,提供了多种机制来实现分布式锁,本文将详细介绍如何使用Redis实现分布式锁,感兴趣的朋友一起看看吧
    2025-04-04
  • redis快速部署为docker容器的方法实现

    redis快速部署为docker容器的方法实现

    部署 Redis 作为 Docker 容器是一种快速、灵活且可重复使用的方式,特别适合开发、测试和部署环境,本文主要介绍了redis快速部署为docker容器的方法实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • Redis序列化反序列化不一致导致String类型值多了双引号问题

    Redis序列化反序列化不一致导致String类型值多了双引号问题

    这篇文章主要介绍了Redis序列化反序列化不一致导致String类型值多了双引号问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Redis实现验证码发送并限制每日发送次数的示例代码

    Redis实现验证码发送并限制每日发送次数的示例代码

    本文主要介绍了Redis实现验证码发送并限制每日发送次数的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论