1. 哈希
哈希(hash)类型是一种比较常用的数据类型,绝大多数的编程语言都提供了hash类型,它们的叫法可能是哈希、字典、关联数组。在redis中,哈希类型是指键(K)值本身又是一个键值对结构。
哈希的形式类似于这样:value={{field1,value1},...{fieldN,valueN}},redis键值对和哈希类型两者的关系如下图所示:
这里有个概念需要说明下,哈希类型中的映射关系叫作field-value,这里的value是指field对应的值,不是键(K)对应的值。
2. 操作命令
2.1 基本命令
由于篇幅所限,这里就简单的做个演示,如下图所示:
这里hgetall命令需要注意一下:在使用 hgetall 时,如果哈希元素个数比较多,会存在阻塞Redis的可能。如果开发人员只需要获取部分field,可以使用hmget,如果一定要获取全部 field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型。操作命令如下图所示:
2.2 不常用命令
这里也是因为篇幅所限,就简单的做个演示,如下图所示:
从图上看,hstrlen key field报错了,这个命令是有redis版本限制的,版本号必须不能低于3.2.0。
2.3 哈希类型命令的时间复杂度
下面是我这边整理的关于哈希类型命令的时间复杂度,如下表所示:
命令 | 时间复杂度 |
hset key field value | O(1) |
hget key field | O(1) |
hdel key field [field .....] | O(k),k是field个数 |
hlen key | O(1) |
hgetall key | O(n),n是field个数 |
hmget field [field ...] | O(k),k是field个数 |
hmset field value [field value ...] | O(k),k是field个数 |
hexists key field | O(1) |
hkeys key | O(n),n是field个数 |
hvals value | O(n),n是field个数 |
hsetnx key field value | O(1) |
hincrby key field increment | O(1) |
hincrbyfloat key field increment | O(1) |
hstrlen key field | O(1) |
3. 内部编码
哈希类型的内部编码有两种:压缩列表(ziplist),哈希表(hashtable)。
3.1 ziplist
当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
3.2 hashtable
当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为 O(1)。
下面的示例演示了哈希类型的内部编码,以及相应的变化。当field个数 比较少,且没有大的value时,内部编码为ziplist:
4. 应用场景
因为redis的hash数据结构和列表数据结构,是比较常用且重要的数据结构,以及篇幅所限,后面会有专门的篇幅研究这两种数据结构的应用场景,小伙伴们敬请期待。
相关推荐
Redis是一款开源的、高性能的...Redis的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,你可以执行原子操作
go&redis数据结构的底层实现.docx
针对Redis的高级数据结构PPT。该PPT一共14页,介绍了Zset的数据结构类型,以及跳表的数据结构。简单阐述了BitMap,HLL,Bloom Filter的原理以及一些常用的指令。针对Bloom Filter有一些自己的见解以及分析
自己整理的redis自定义的数据结构,对理解redis运行的内部原理会有所帮助
Redis数据结构与对象总结 数据结构与对象 简单动态字符串 SDS简介 SDS与C字符串的区别 常数复杂度获取字符串长度 O(n) O(1) 杜绝缓冲区溢出 修改字符串长度时内存重分配 空间预分配:对字符串进行增长操作时...
01-Redis核心数据结构实战与高性能原理剖析_ev.rar01-Redis核心数据结构实战与高性能原理剖析_ev.rar01-Redis核心数据结构实战与高性能原理剖析_ev.rar01-Redis核心数据结构实战与高性能原理剖析_ev.rar01-Redis核心...
Nginx也是采用IO多路复用原理解决C10K问题# 查看redis支持的最大连接数,在redis.conf文件中可修改,# maxclients 10000其
Redis数据结构和操作 redis不只是一个简单的键(key)-值(value)数据库,实际上它是一个数 据结构服务器,支持各种类型的值。也就是说,在传统的键-值数据库 中,你把字符串键与字符串值联系起来,而在redis,值不仅...
数据结构 数据结构Redis中数据类型对应的数据结构 中数据类型对应的数据结构 Redis Redis 是⼀种键值(Key-Value)数据库。相对于关系型数据库(⽐如 MySQL),Redis 也被叫作⾮关系型数据库。 像 MySQL 这样的关系...
十五分钟介绍-Redis数据结构
3.Redis数据类型之List类型
12.redis数据结构 – 哈希 13.聊聊redis持久化 – 两种方式 14.聊聊redis持久化 – RDB 15.聊聊redis持久化 – AOF 16.聊聊redis持久化 – AOF重写 17.聊聊redis持久化 – 如何选择RDB和AOF 18.聊聊主从 – 用法 19....
详细分析redis设计及实现原理 详细分析redis设计及实现原理
Redis 底层网络模型为单线程+epoll,也就是说,发送至 Redis 的命令是执的若采用直接扩容的方式,那么当遇到巨大的哈希表时,数据的复制将花费很长时间
详解redis数据结构之sds 字符串在redis中使用非常广泛,在redis中,所有的数据都保存在字典(Map)中,而字典的键就是字符串类型,并且对于很大一部分字典值数据也是又字符串组成的。以下是sds的具体存储结构: ...
redis数据结构基础知识及案列(每个数据结构一个案例)
例如: ./redis_to_json.py | gzip > redis_backup.json.gz这对于您正在使用但又不想丢失数据的应用程序也很不错,因为Redis RDB文件并不总是那么方便。注意事项和注意事项u()中的Unicode支持仅适用于Python2.x。...
详解redis数据结构之压缩列表 redis使用压缩列表作为列表键和哈希键的底层实现之一。当一个列表键只包含少量的列表项,并且每个列表项都是由小整数值或者是短字符串组成,那么redis就会使用压缩列表存储列表项;同理...
Redis从入门到精通高清,迅雷播放器组件可顺利播放