十五品黄山 發表於 2025-12-9 10:58:33

Redis中Hash类型相关命令介绍

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、简介</a></li><li><a href="#_label1">二、相关命令</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">2.1 hset 和 hget</a></li><li><a href="#_lab2_1_1">2.2 hexists</a></li><li><a href="#_lab2_1_2">2.3 hdel</a></li><li><a href="#_lab2_1_3">2.4 hkeys</a></li><li><a href="#_lab2_1_4">2.5 hvals</a></li><li><a href="#_lab2_1_5">2.6 hgetall</a></li><li><a href="#_lab2_1_6">2.7 hmget</a></li><li><a href="#_lab2_1_7">2.8 hlen</a></li><li><a href="#_lab2_1_8">2.9 hsetnx</a></li><li><a href="#_lab2_1_9">2.10 hincrby</a></li><li><a href="#_lab2_1_10">2.11 hincrbyfloat</a></li><li><a href="#_lab2_1_11">2.12 小结</a></li></ul><li><a href="#_label2">三、编码方式</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">四、应用场景</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_12">4.1 作为缓存</a></li></ul><li><a href="#_label4">总结&nbsp;</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、简介</h2>
<p>在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如 key = &ldquo;key&rdquo;,value = { { field1, value1 }, &hellip;, {fieldN, valueN} },在Redis中为了与key - value作区分,将Hash类型键值对结构表示为filed - value。</p>
<p>String与Hash对比图:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322813.png" /></p>
<p class="maodian"><a name="_label1"></a></p><h2>二、相关命令</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>2.1 hset 和 hget</h3>
<p><code>hset</code>: 设置 hash 中指定的字段(field)的值(value)。</p>
<p>语法:<code>hset key field value </code><br />命令有效版本:2.0.0 之后</p>
<p>时间复杂度:插⼊⼀组 field 为 O(1), 插⼊ N 组 field 为 O(N)</p>
<p>返回值:添加的字段的个数。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322839.png" /></p>
<p>也可以当修改字段的效果:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322892.png" /></p>
<p><code>hget</code>:获取 hash 中指定字段的值。</p>
<p>语法:<code>hget key filed</code></p>
<p>命令有效版本:2.0.0 之后</p>
<p>时间复杂度:O(1)</p>
<p>返回值:字段对应的值或者 nil。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322830.png" /></p>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.2 hexists</h3>
<p><code>hexists</code>判断 hash 中是否有指定的字段。</p>
<p>语法:<code>hexists key filed</code></p>
<p>命令有效版本:2.0.0 之后</p>
<p>时间复杂度:O(1)</p>
<p>返回值:1 表⽰存在,0 表⽰不存在。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322899.png" /></p>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>2.3 hdel</h3>
<p><code>hdel</code>删除 hash 中指定的字段。</p>
<p>语法:<code>hdel key field </code></p>
<p>命令有效版本:2.0.0之后</p>
<p>时间复杂度:删除⼀个元素为 O(1). 删除 N 个元素为 O(N).</p>
<p>返回值:本次操作删除的字段个数。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322836.png" /></p>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2.4 hkeys</h3>
<p><code>hkeys</code>获取 hash 中的所有字段。</p>
<p>语法:<code>hkeys key</code></p>
<p>命令有效版本:2.0.0 之后</p>
<p>时间复杂度:O(N), N 为 field 的个数.</p>
<p>返回值:字段列表。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322867.png" /></p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>2.5 hvals</h3>
<p><code>hvals</code> 获取 hash 中的所有的值。</p>
<p>语法:<code>hvals key</code></p>
<p>命令有效版本:2.0.0 之后</p>
<p>时间复杂度:O(N), N 为 field 的个数.</p>
<p>返回值:Hash所有value列表。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322866.png" /></p>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>2.6 hgetall</h3>
<p><code>hgetall</code>获取 hash 中的所有的字段和值。</p>
<p>语法:<code>hgetall key</code></p>
<p>命令有效版本:2.0.0 之后</p>
<p>时间复杂度:O(N), N 为 field 的个数.</p>
<p>返回值:Hash所有字段和对应的值。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322865.png" /></p>
<p class="maodian"><a name="_lab2_1_6"></a></p><h3>2.7 hmget</h3>
<p><code>hmget</code>⼀次获取 hash 中多个字段的值。</p>
<p><code>hmget key field </code></p>
<p>命令有效版本:2.0.0 之后</p>
<p>时间复杂度:只查询⼀个元素为 O(1), 查询多个元素为 O(N), N 为查询元素个数.</p>
<p>返回值:字段对应的值或者 nil。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322891.png" /></p>
<p class="maodian"><a name="_lab2_1_7"></a></p><h3>2.8 hlen</h3>
<p><code>hlen</code>获取 hash 中的所有字段的个数。</p>
<p>语法:<code>hlen key </code></p>
<p>命令有效版本:2.0.0 之后</p>
<p>时间复杂度:O(1)</p>
<p>返回值:字段个数。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322810.png" /></p>
<p class="maodian"><a name="_lab2_1_8"></a></p><h3>2.9 hsetnx</h3>
<p><code>hsetnx</code>在字段不存在的情况下,设置 hash 中的字段和值。</p>
<p>语法:<code>hsetnx key field value</code></p>
<p>命令有效版本:2.0.0 之后</p>
<p>时间复杂度:O(1)</p>
<p>返回值:1表⽰设置成功,0 表⽰失败。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322865.png" /></p>
<p class="maodian"><a name="_lab2_1_9"></a></p><h3>2.10 hincrby</h3>
<p><code>hincrby</code>将 hash 中字段对应的数值(必须是整数)添加指定的值。</p>
<p>语法: <code>hincrby key field increment</code></p>
<p>命令有效版本:2.0.0之后</p>
<p>时间复杂度:O(1)</p>
<p>返回值:该字段变化之后的值。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322875.png" /></p>
<p class="maodian"><a name="_lab2_1_10"></a></p><h3>2.11 hincrbyfloat</h3>
<p><code>hincrbyfloat</code>hincrby的浮点数版本, 将 hash 中字段对应的数值(可以是整数和浮点数)添加指定的值。</p>
<p>语法: <code>hincrbyfloat key field increment</code></p>
<p>命令有效版本:2.6.0之后</p>
<p>时间复杂度:O(1)</p>
<p>返回值:该字段变化之后的值。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322823.png" /></p>
<p class="maodian"><a name="_lab2_1_11"></a></p><h3>2.12 小结</h3>
<table><thead><tr><th>命令</th><th>执⾏效果</th><th>时间复杂度</th></tr></thead><tbody><tr><td>hset key field value</td><td>设置值</td><td>O(1)</td></tr><tr><td>hget key field</td><td>获取值</td><td>O(1)</td></tr><tr><td>hdel key field </td><td>删除 field</td><td>O(k), k 是 field 个数</td></tr><tr><td>hlen key</td><td>计算 field 个数</td><td>O(1)</td></tr><tr><td>hgetall key</td><td>获取所有的 field-value</td><td>O(k), k 是 field 个数</td></tr><tr><td>hmget key field </td><td>批量获取 field-value</td><td>O(k), k 是 field 个数</td></tr><tr><td>hmset key field value </td><td>批量获取 field-value</td><td>O(k), k 是 field 个数</td></tr><tr><td>hexists key field</td><td>判断 field 是否存在</td><td>O(1)</td></tr><tr><td>hkeys key</td><td>获取所有的 field</td><td>O(k), k 是 field 个数</td></tr><tr><td>hvals key</td><td>获取所有的 value</td><td>O(k), k 是 field 个数</td></tr><tr><td>hsetnx key field value</td><td>设置值,但必须在 field 不存在时才能设置成功</td><td>O(1)</td></tr><tr><td>hincrby key field n</td><td>对应 field-value +n</td><td>O(1)</td></tr><tr><td>hincrbyfloat key field n</td><td>对应 field-value +n</td><td>O(1)</td></tr><tr><td>hstrlen key field</td><td>计算 value 的字符串⻓度</td><td>O(1)</td></tr></tbody></table>
<p class="maodian"><a name="_label2"></a></p><h2>三、编码方式</h2>
<p>哈希的内部编码有两种:</p>
<ul><li>ziplist(压缩列表):当哈希类型元素个数⼩于 hash-max-ziplist-entries 配置(默认 512 个)、同时所有值都⼩于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使⽤ ziplist 作为哈希的内部实现,ziplist 使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存⽅⾯⽐ hashtable 更加优秀。</li><li>hashtable(哈希表):当哈希类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,⽽ hashtable 的读写时间复杂度为 O(1)。</li></ul>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322849.png" /></p>
<p class="maodian"><a name="_label3"></a></p><h2>四、应用场景</h2>
<p class="maodian"><a name="_lab2_3_12"></a></p><h3>4.1 作为缓存</h3>
<p>存储结构化的数据的时候,使用 hash 更加合适。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322859.png" /></p>
<p>使用hash表示:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025120910322819.png" /></p>
<p class="maodian"><a name="_label4"></a></p><h2>总结&nbsp;</h2>
頁: [1]
查看完整版本: Redis中Hash类型相关命令介绍