(二)Redis 数据类型与结构
1、值的数据类型
Redis “快”取决于两方面,一方面,它是内存数据库,另一方面,则是高效的数据结构。
Redis 键值对中值的数据类型,也就是数据的保存形式有5种:String(字符串)、List(列表)、Hash(哈希)、Set(集合)和 Sorted Set(有序集合)。这5种数据类型由6种底层结构实现:简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。
String 类型的底层实现只有一种数据结构,简单动态字符串,而 List、Hash、Set 和 Sorted Set 这四种数据类型,都有两种底层实现结构,这四种类型称为集合类型,它们的特点是一个键对应了一个集合的数据。

2、键值对数据结构
Redis 使用哈希表来保存所有键值对,实现从键到值的快速访问。哈希表就是一个数组,每个元素称为一个哈希桶,哈希桶中的元素保存的并不是值本身,而是指向具体值的指针。哈希表保存了所有的键值对,也称为全局哈希表,时间复杂度为O(1)
当 Redis 中写入大量数据后,哈希表的冲突问题和 rehash 可能导致操作变慢。
哈希冲突是指,两个 key 的哈希值落在了同一个哈希桶中,毕竟,哈希桶的个数通常要少于 key 的数量。
Redis 通过链式哈希解决哈希冲突,就是指同一个哈希桶中的多个元素用一个链表来保存,它们之间依次用指针连接。
随着数据量增大,哈希冲突可能也会越来越多,这就会导致某些哈希冲突链过长,链上的元素只能通过指针逐一查找再操作,进而导致查询效率降低。
Redis 会对哈希表做 rehash 操作来解决这个问题,也就是增加现有的哈希桶数量,让逐渐增多的 entry 元素能在更多的桶之间分散保存,减少单个桶中的元素数量,从而减少单个桶中的冲突。
Redis 会将哈希表的数据拷贝到另一个容量更大的哈希表,清空原来的准备下一次 rehash,这样依然会有问题,因为在数据量大的基础上拷贝会造成 Redis 线程阻塞。为了避免这个问题,Redis 采用了渐进式 rehash,就是将拷贝过程的开销分摊到每次请求时进行,从而保证查询效率。

3、集合数据操作效率
对于 String 类型来说,找到哈希桶就能直接增删改查了,所以,哈希表的 O(1) 操作复杂度也就是它的复杂度了。对于集合类型来说,找到哈希桶后,增删改查都是对集合操作的,不同的集合类型时间复杂度是不一样的。
哈希表的特点上面提到了,复杂度是O(1),整数数组和双向链表也很常见,通过数组下标或者链表的指针逐个元素访问,操作复杂度基本是 O(N),操作效率比较低。压缩列表和跳表是 Redis 重要的数据结构,下面介绍一下。
压缩列表类似于一个数组,不同之处在于表头有三个字段 zlbytes、zltail 和 zllen,分别表示列表长度、列表尾的偏移量和列表中的 entry 个数,压缩列表在表尾还有一个 zlend,表示列表结束。
查找第一个元素和最后一个元素,可以通过表头三个字段的长度直接定位,复杂度是 O(1)。而查找其他元素时,复杂度就是 O(N) 了
跳表在链表的基础上,增加了多级索引,通过索引位置的几个跳转,实现数据的快速定位,当数据量很大时,跳表的查找复杂度就是 O(logN)
按照查找的时间复杂度,这些数据结构分类如下:

(二)Redis 数据类型与结构的更多相关文章
- 二.redis 数据类型
本文介绍下redis支持的各种数据类型包括string,list ,set ,sorted set 和hash 1. keysredis本质上一个key-value db,所以我们首先来看看他的key ...
- Redis之(二)数据类型及存储结构
Redis支持五中数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sortedset:有序集合). Redis定义了丰富的原语命令,可以直接与Redis ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- redis详解(二)-- 数据类型详解
Redis常用数据类型详解 1,Redis最为常用的数据类型主要有以下: String Hash List Set Sorted set pub/sub Transactions 在具体描述这几种数据 ...
- Redis 数据类型分析 字符串 哈希 列表 集合 有序集合 优缺点 分析 注意事项 存储结构
一.提高Redis使用性能秘诀 KEY尽量少的原则,能放在1个KEY的就放入1个KEY,KEY开销很大尽量减少与Redis发生的交互次数,能批量的就批量,能事务.管道的就事务.管道从业务架构分析确定使 ...
- 二:Redis数据类型
一.nosql(非关系性数据库): mongoDB hbase redis nulch hive pig mahout zookeeper 二:redis 数据类型 1.存储string: 常用命令 ...
- Redis系列(二)—— 数据类型及其使用
Redis数据类型及其使用 参考:http://www.cnblogs.com/jackluo/p/3173436.html Redis支持五种数据类型:string(字符串),hash(哈希),li ...
- Redis笔记(二):Redis数据类型
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- redis数据类型及使用场景
Redis数据类型 String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令: set,get,decr,incr,mge ...
- redis 数据类型详解 以及 redis适用场景场合
1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...
随机推荐
- 部署solr服务
前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 一.Sorl单机部署 准备:solr5.5.tomcat8.5.jdk1.8 1.解压 solr-5.5.0.zip压缩包 2.复制./ ...
- HMS Core Discovery第16期直播预告|与虎墩一起,玩转AI新“声”态
[导读] 随着人工智能不断发展,机器学习技术也开始被广泛地应用到教育.金融.零售.交通.医疗等各个领域,给我们的生活带来巨大的便利.本期Discovery直播以<与虎墩一起,玩转AI新" ...
- HarmonyOS Connect认证测试
原文链接:https://mp.weixin.qq.com/s/zRG97PWPqfDo0vfwQWSUew,点击链接查看更多技术内容: 在HarmonyOS Connect生态产品的认证测试过 ...
- 常用注解使用总结系列: @Order 注解
@Order 注解 @Order注解主要用来控制配置类的加载顺序示例代码: package com.runlion.tms.admin.constant; public class AService ...
- Linux_aarch64_head.S到main.c的环境建立
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 无 前言 最开始,我仅仅是对linux比较感兴 ...
- 第一次blog
前言:我在大一上学期学习了c语言,然后在下学期学习了第二门语言java,因为之前c语言学的挺一般的,然后在这学期学习java感觉还是挺不简单的,要自学很多东西,在这段时间里,我学习了JAVA的基本语法 ...
- vue 商品sku添加,笛卡尔算法,商品添加。动态生成table,table添加值后 再生成的table 不改变table之前输入的值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 剑指offer39(Java)-数组中出现次数超过一半的数字(简单)
题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, ...
- 从0到1使用Webpack5 + React + TS构建标准化应用
简介: 本篇文章主要讲解如何从一个空目录开始,建立起一个基于webpack + react + typescript的标准化前端应用. 作者 | 刘皇逊(恪语)来源 | 阿里开发者公众号 前言 本篇文 ...
- MaxCompute 公共云多租户设计的技术要点详解及产品实现特色
简介:公共云大数据平台在多租户的设计和实现方式上有所差异.本文主要介绍在公共云大数据平台的多租实现方案中需要考虑的问题和挑战,重点介绍了MaxCompute在计算和存储多租实现上的特点.期望通过这些 ...