高级程序员必须精通的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的界面监控程序