文章目录

  • 概述
  • 一、对象的类型和编码
  • 二、五种数据结构
    • 五种数据结构的底层实现结构
    • 1、字符串(String)
      • 1)int 编码
      • 2)embstr 编码
      • 3)raw 编码
    • 2、列表(List)
      • 1)ziplist 编码
      • 2)linkedlist 编码
    • 3、哈希(Hash)
      • 1)ziplist 编码
      • 2)hashtable 编码
    • 4、集合(Set)
      • 1)intset 编码
      • 2)hashtable 编码
    • 5、有序集合(Sorted Set)
      • 1)ziplist 编码
      • 2)skiplist 编码

概述

Redis的五种数据结构也叫五种不同类型的对象(字符串对象、列表对象、哈希对象、集合对象和有序集合对象),是由六种底层数据结构(简单动态字符串,双端链表,字典,压缩列表,整数集合)实现的,每种对象都用到至少一种底层数据结构。

如果对六种底层数据结构不熟悉,可以先看看这篇文章:
Redis六种底层数据结构

一、对象的类型和编码

每次在Redis的数据库中新创建一个键值对时,至少会创建两个对象,一个用做键值对的键,另一个用做键值对的值。
Redis中的每个对象都由一个redisObject结构表示,该结构有三个属性:type、encoding和ptr属性。

  • type属性记录了对象的类型(字符串、列表、哈希、集合、有序集合);
  • encoding属性记录了对象所使用的底层实现结构(简单动态字符串(SDS),双端链表,字典,压缩列表,整数集合)
  • ptr属性是指向底层数据结构的指针。

二、五种数据结构

五种数据结构的底层实现结构

数据结构 底层实现结构
字符串(String) int、embstr(连续的SDS内存结构)或者raw(不连续的SDS内存结构)
列表(List) ziplist(压缩列表) 或者 linkedlist (双向链表)
哈希(Hash) ziplist(压缩列表) 或者 hashtable(哈希表)
集合(Set) intset(整数集合) 或者 hashtable(哈希表)
有序集合(Sorted Set) ziplist(压缩列表) 或者 skiplist(跳跃表)

1、字符串(String)

字符串对象的编码可以是intembstr(连续的SDS内存结构)或者raw(不连续的SDS内存结构)。

1)int 编码

如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,则ptr属性指向一个整数值,并将字符串对象的编码设置为int。

2)embstr 编码

如果字符串对象保存的是一个字符串值,并且这个字符串值对的长度小于等于32字节,那么字符串对象将使用embstr编码的方式来保存这个字符串值。

使用embstr编码的字符串对象来保存短字符串值有如下好处:

  • embstr编码将创建字符串对象所需的内存分配次数从raw编码的两次降低为一次;
  • 释放embstr编码的字符串对象只需要调用一次内存释放函数;
  • embstr编码的字符串对象能够更好地利用缓存带来的优势。

3)raw 编码

如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节,那么字符串对象将使用一个简单东阿泰字符串(SDS)来保存这个字符串值,并将对象的编码设置为raw。

注:
在Redis中,int、long和double类型都作为字符串保存。

2、列表(List)

列表对象的编码可以使 ziplist 或者 linkedlist。

1)ziplist 编码

ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点保存了一个列表元素。

2)linkedlist 编码

linkedlist编码的列表对象使用双端链表作为底层实现,每个双端链表节点都保存了一个字符串对象,而每个字符串对象都保存了一个列表元素。

3、哈希(Hash)

哈希对象的编码可以是 ziplist 或者 hashtable。

1)ziplist 编码

ziplist编码的哈希对象使用压缩列表作为底层实现。每当有新的键值对要加入到哈希对象时,程序会将保存了键的节点推入到压缩列表表尾,然后再将保存了值的节点推入到压缩列表表尾,所以:

  • 保存了同一键值对的两个节点总是紧挨在一起,保存键的节点在前,保存值的节点在后;
  • 先添加到哈希对象中的键值对会被放在压缩列表的表头方向,而后来添加的会被放在表尾方向。

2)hashtable 编码

hashtable编码的哈希对象使用字典作为底层实现,哈希对象中的每个键值对都是用一个字典键值对来保存:
字典中的每个键、每个值都是一个字符串对象,对象中分别保存了键值对的键和值。

4、集合(Set)

集合对象的编码可以是 intset 或者 hashtable。

1)intset 编码

intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。

2)hashtable 编码

hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含一个集合元素,而字典的值则全部被设置为NULL。

5、有序集合(Sorted Set)

有序集合的编码可以使 ziplist 或者 skiplist 。

1)ziplist 编码

ziplist编码的压缩列表对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,而第二个元素则保存元素的分值。

压缩列表内的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的方向,而分值较大的元素责备放置在靠近表尾的方向。

2)skiplist 编码

skiplist编码的有序集合对象使用zset结构作为底层实现,一个zset结构包含一个字典和一个跳跃表:

redis五种常见的数据结构相关推荐

  1. 万字长文的Redis五种数据结构详解(理论+实战),建议收藏。

    本文脑图 前言 Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库.缓存.消息中间件,这么优秀的东西一定要一点一点的吃透它. 关于Redis的文章之前也写过三篇,阅读量和读者的反映都还 ...

  2. Redis五种数据结构详解

    Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库.缓存.消息中间件,这么优秀的东西一定要一点一点的吃透它. Redis的五种数据结构包括以下五种: String:字符串类型 List ...

  3. Redis五种数据结构

    对redis来说,所有的key(键)都是字符串,所谓的5种数据结构是指针对value而言 1.Redis五种数据结构如下: 数据结构类型 说明 使用场景 常用方法 其他链接 String字符串类型 1 ...

  4. 图解 Redis 五种数据结构底层实现

    Redis 是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.Redis 支持五种常见对象类型:字符串(String).哈希(Hash).列表(List).集合(Set)以及有序集 ...

  5. redis五种数据类型及其常见操作

    redis五种数据类型及其常见操作 Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). 1.strin ...

  6. 硬核资源!Redis 五种数据结构以及三种高级数据结构解析(详解)

    上一篇分享的是<深入理解JVM>,这篇给大家分享<Redis 五种数据结构以及三种高级数据结构解析>. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis ...

  7. Redis五种数据结构及其使用场景

    Redis五种数据结构及其使用场景 先有个概念,redis 数据库其实就是一个大的 map,它容纳了所有的 key, key 都是 string 类型,而 value 则有 string, list, ...

  8. Redis五种数据结构应用场景

    文章目录 前言 二.字符串String 2.1.常用操作 2.2.应用场景 2.2.1.单值缓存(最常用) 2.2.2.对象缓存 2.2.3.分布式锁 2.2.4.计数器 三.哈希hash 3.1.常 ...

  9. 字符动图_图解redis五种数据结构底层实现(动图哦)

    redis有五种基本数据结构:字符串.hash.set.zset.list.但是你知道构成这五种结构的底层数据结构是怎样的吗?今天我们来花费五分钟的时间了解一下.(目前redis版本为3.0.6) 动 ...

最新文章

  1. JavaScript对象数组示例
  2. vue.js 多图上传,并可预览
  3. spring MVC cors跨域实现源码解析
  4. linux c 得到指定进程内存占用
  5. python3+scapy扫描获取局域网主机ip和mac
  6. python基础语法合集-Python基础语法合集.zip
  7. UVA11100旅行(大包装小包,问最少多少个包)
  8. Winform中实现ZedGraph滚轮缩放后自动重新加载数据
  9. 《Linux》解决Linux端口被占用
  10. 嵌入式linux系统中设备驱动程序
  11. [渝粤题库]陕西师范大学《幼儿园社会教育》作业
  12. mysql 建表时建立索引_mysql 分享建表和索引的几点规范
  13. java 执行机制_Java类的执行机制
  14. WebApiThrottle限流框架
  15. java foreach 赋值_java foreach 使用
  16. 介绍两款代码自动生成器,帮助提升工作效率
  17. python使用长ping命令_python实现ping命令小程序
  18. Android Gallery 3D 特效精华
  19. 使用CyberController来将旧手机改造成电脑外挂------手机交互翻译、人脸解锁、语音识别....各个功能等你来探索
  20. 广告联盟中CPC CPA CPM CPS CPV分别是什么意思

热门文章

  1. Hbuilder开发HTML5 APP之图标和启动页制作
  2. HDU4628+状态压缩DP
  3. WCF 第十二章 对等网 使用自定义绑定实现消息定向
  4. How do I select an ITEM from a combobox?
  5. 报错:content type application/x-www-form-urlencoded;
  6. Windows服务器管理(3)——IIS服务器误删了Default Web Site 网站 解决方法
  7. 千字搞定数据产品选型!报表、BI、大数据平台、中台都在这了
  8. php array walk 效率,php代码优化系列(二) -- array_walk 和 foreach, for 的效率的比较...
  9. 火狐浏览器走局域网中的代理ip
  10. java死锁怎么用jvm调试_性能测试之JVM的故障排查-死锁