高级程序员必须精通的Redis,第三篇之——hash(散列)

Posted 李子捌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级程序员必须精通的Redis,第三篇之——hash(散列)相关的知识,希望对你有一定的参考价值。

1、简介

Redis中所有的的数据结构都是通过一个唯一的字符串key来获取相应的value数据。
Redis有5种基础数据结构,分别是:

  • string(字符串)
  • list(列表)
  • hash(字典)
  • set(集合)
  • zset(有序集合)

其中list、set、hash、zset这四种数据结构是容器型数据结构,它们共享下面两条通用规则:

  • create if not exists:容器不存在则创建
  • drop if no elements:如果容器中没有元素,则立即删除容器,释放内存

本文讲述的是Redis的5种基础数据结构中的hash(字典)

2、hash(字典)相关介绍

2.1 hash(字典)的内部结构

Redis的hash(字典)相当于Java语言中的HashMap,它是根据散列值分布的无序字典,内部的元素是通过键值对的方式存储。
在这里插入图片描述

hash(字典)的实现与Java中的HashMap(JDK1.7)的结构也是一致的,它的数据结构也是数组+链表组成的二维结构,节点元素散列在数组上,如果发生hash碰撞则使用链表串联在数组节点上。
在这里插入图片描述

2.2 hash(字典)扩容

Redis中的hash(字典)存储的value只能是字符串值,此外扩容与Java中的HashMap也不同。Java中的HashMap在扩容的时候是一次性完成的,而Redis考虑到其核心存取是单线程的性能问题,为了追求高性能,因而采取了渐进式rehash策略。
渐进式rehash指的是并非一次性完成,它是多次完成的,因此需要保理旧的hash结构,所以Redis中的hash(字典)会存在新旧两个hash结构,在rehash结束后也就是旧hash的值全部搬迁到新hash之后,新的hash在功能上才会完全替代以前的hash。
在这里插入图片描述

2.3 hash(字典)的相关使用场景

hash(字典)可以用来存储对象的相关信息,一个hash(字典)代表一个对象,hash的一个key代表对象的一个属性,key的值代表属性的值。hash(字典)结构相比字符串来说,它无需将整个对象进行序列化后进行存储。这样在获取的时候可以进行部分获取。所以相比之下hash(字典)具有如下的优缺点:

  • 读取可以部分读取,节省网络流量
  • 存储消耗的高于单个字符串的存储

3 hash(字典)相关指令

3.1 hash(字典)常用指令

hset -> hash(字典)插入值,字典不存在则创建 key代表字典名称,field 相当于 key,value是key的值

hset key field value

hmset -> 批量设值

hmset key field value [field value …]

示例:

7.0.0.1:6379> hset book java "Thinking in Java"		# 字符串包含空格需要""包裹
(integer) 1
127.0.0.1:6379> hset book python "Python code"
(integer) 1
127.0.0.1:6379> hset book c "The best of c"
(integer) 1
127.0.0.1:6379> hmset book go "concurrency in go" mysql "high-performance MySQL" # 批量设值
OK

hget -> 获取字典中的指定key的value

** hget key field**

hgetall -> 获取字典中所有的key和value,换行输出

hgetall key

示例:

127.0.0.1:6379> hget book java
"Thinking in Java"
127.0.0.1:6379> hgetall book
1) "java"
2) "Thinking in Java"
3) "python"
4) "Python code"
5) "c"
6) "The best of c"

hlen -> 获取指定字典的key的个数

hlen key

举例:

127.0.0.1:6379> hlen book
(integer) 5

3.2 hash(字典)使用小技巧

在string(字符串)中可以使用incr和incrby对value是整数的字符串进行自加操作,在hash(字典)结构中如果单个子key是整数也可以进行自加操作。
hincrby -> 增对hash(字典)中的某个key的整数value进行自加操作

hincrby key field increment

127.0.0.1:6379> hset liziba money 10
(integer) 1
127.0.0.1:6379> hincrby liziba money -1
(integer) 9
127.0.0.1:6379> hget liziba money
"9"

注意如果不是整数会报错。

127.0.0.1:6379> hset liziba money 10.1
(integer) 1
127.0.0.1:6379> hincrby liziba money 1
(error) ERR hash value is not an integer

以上是关于高级程序员必须精通的Redis,第三篇之——hash(散列)的主要内容,如果未能解决你的问题,请参考以下文章

高级程序员必须精通的Redis,第五篇之——zset(有序集合)

FRP第三篇之Linux服务器配置内网WEB服务+FRP的界面监控程序

FRP第三篇之Linux服务器配置内网WEB服务+FRP的界面监控程序

好玩的ES--第三篇之过滤查询,整合SpringBoot

第三篇之消息的收发

MySQL还能这样玩---第三篇之索引也可以如此easy