首页 > 数据库 >redis常用数据类型(转)

redis常用数据类型(转)

时间:2023-09-02 11:11:57浏览次数:34  
标签:常用 数据类型 ziplist redis 节点 跳表 hashtable 字符串 skiplist

转载:https://blog.csdn.net/u014453898/article/details/112292028

redis有5种常用数据类型,string,list,set,zset,hash

一、应用

string:缓存,限流,计数器,分布式锁,分布式session

hash:存储用户信息,用户主页访问量,组合查询

list:微博关注人时间轴列表,简单队列

set:赞,踩,标签,好友关系

zset:排行榜

二、数据类型的原理

1.string

string有三种方式,int,raw,embstr

如果string的value时一个整数,就采用int方式存储

如果value>39byte,就使用简单动态字符串存储,encoding=raw,此时redisobject和raw字符串时分开存储

 

如果value<39byte,encoding=embstr,因为字符串比较小,redisobject和字符串时内存连续存储,因此embstr更快

 

2.list

list有两种编码方式,ziplist(压缩列表)和linkedlist

当列表长度 少于 512且 每个元素都少于64个字节,那么就用ziplist存储。否则就用linkedlist存储

在ziplist中,结点之前有三个变量,分别是: zlbytes、zltail、zllen,分别代表字符串占用内存字节数,尾指针位置,压缩列表的节点数量

 

ziplist的每个节点存放节点长度和节点内容,如下

 linkedlist的编码格式如下

 3.hash

hash 的encoding 编码方式共有两种:ziplist、hashtable

 ziplist

当哈希对象保存的键值对数量少于512,且所有键值对的长度都少于64字节时,使用压缩列表保存

 

hashtable

若哈希对象保存的键值对个数大于512,并且其中有键值对大于64个字节,就使用hashtable 保存。如下

 

4.set

set 的encoding编码方式有:intset、hashtable

 4.1.intset

当 集合的长度少于 512 时,并且所有元素都是整数,使用 intset存储。否则使用 hashtable

 

4.2.hashtable

hashtable编码的底层实现是字典,字典的每个键是字符串对象,只不过值都是空(NULL)

 

5.zset

zset的encoding 编码有两种,分别是:ziplist、skiplist。

5.1 ziplist

当zset的长度少于128,并且所有元素的长度都少于64字节时,用ziplist存储。如下图:

我们可以看到,每个节点,前面是字符串,后面是分数值。分值小的靠近表头,大的靠近表尾。

 

5.2.skiplist

redis 的 skiplist 是由 字典dict 和 跳表构成的。

skiplist的字典dict 和 跳表。

刚刚说了 skiplist 是由 dict 和跳表组成的。

dict 用于记录 字符串对象和分数,即查询 字符串对象对应 分数。
跳表则用来,根据 分数查询对应字符串。
为什么 skiplist 编码要同时用字典和跳表来实现?

字典查询分值的时间复杂度是O(1)。但是无序。
跳表的优点是有序,但是查询的时间复杂度为O(logn)。
虽然采用两个结构,但是集合的元素成员和分值是共享的,两种结构都通过指针指向同一地址,所以不会存在内存浪费。
redis里的一个跳表的结构如下:

包含一个 头节点header 和 尾结点 tail。
length 表示节点数。
level 表示表示skiplist的总层数,即所有节点层数的最大值。

 

标签:常用,数据类型,ziplist,redis,节点,跳表,hashtable,字符串,skiplist
From: https://www.cnblogs.com/wangbin2188/p/17673349.html

相关文章

  • 常用的七大排序算法
    1.七大排序算法简述1.1选择排序算法思想:进行n轮操作在某一轮中,选择未排序的一个最小数组元素,与右侧未排序的第一个数组元素交换交换完之后,相当于向右扩大已排序的数组范围。重复2,3.直至所有数组元素已排序稳定性:不稳定假设在某一轮数组状态为:1,2,3,8,8,4。已排序的元......
  • Redis高可用集群之水平扩展(3.2)
    Redis3.0以后的版本虽然有了集群功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,今天就来带大家看看redis高可用集群如何做水平扩展,原始集群(见下图)由6个节点组成,6个节点分布在三台机器上,采用三主三从的模式1、启动集群#启动整个集群/usr......
  • Redis核心数据结构与高性能原理(1)
    Redis安装下载地址:http://redis.io/download安装步骤:#安装gccyuminstallgcc#把下载好的redis-5.0.3.tar.gz放在/usr/local文件夹下,并解压wgethttp://download.redis.io/releases/redis-5.0.3.tar.gztar-zxvfredis-5.0.3.tar.gzcdredis-5.0.3#进入到解压好的......
  • VIM中常用命令
    vim编辑器中常用的命令1、yy:复制当前行nyy:从当前行开始复制n行2、p:将复制的内容粘贴从当前行的下一行开始粘贴np:将复制的内容从当前行的下一行开始复制n份3、dd:剪切(删除)当前行(可以和粘贴功能合起来一起使用)ndd:从当前行开始剪切(删除)n行(可以和粘贴功能合起来一起使用)4......
  • Redis HyperLogLog与事务&Redis 7.0前瞻(7)
    Redis高级数据结构HyperLogLogHyperLogLog(Hyper[ˈhaɪpə(r)])并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等。如果你负责开发维护一个大型的网站,有一天产品经理要网站......
  • Redis队列Stream&Redis多线程详解(8)
    Redis目前最新版本为Redis-6.2.6,考虑到实际的情况,本次课程会以CentOS7下Redis-6.2.4版本进行讲解。下载地址:https://redis.io/download安装运行Redis很简单,在Linux下执行上面的4条命令即可,同时前面的课程已经有完整的视频讲解,请到网盘中下载观看,并自行安装。如安装过程出......
  • 手摸手4-springboot整合redis,实现自动文档
    (目录)手摸手4-springboot整合redis,实现自动文档引入依赖<!--redis相关--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><......
  • .Net6.0 Redis操作其一List篇
    今天在写字典表时为了优化就用了redis,然后其中就又用到了redis中的一个LIst添加和读取的操作首先Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sortedset:有序集合)。今天讲的是其中之一lIst(列表)Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加......
  • 为什么创建 Redis 集群时会自动错开主从节点?
    哈喽大家好,我是咸鱼在《一台服务器上部署Redis伪集群》这篇文章中,咸鱼在创建Redis集群时并没有明确指定哪个Redis实例将担任master,哪个将担任slave/usr/local/redis-4.0.9/src/redis-trib.rbcreate--replicas1192.168.149.131:6379192.168.149.131:26379192.168.1......
  • springboot 集成 redisson
    1.maven依赖<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.10.1</version> </dependency>2.添加配置和注入beanimportorg.redisson.Redisson;importorg.redisso......