合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 3.4.2 HASH-字典 在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也 不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而 Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。 `hset` ­­ 设置hash field为指定值,如果key不存在,则先创建。 ```bash > hset myhash field1 Hello ``` `hsetnx` ­­ 设置hash field为指定值,如果key不存在,则先创建。如果field已经存在,返回0,nx是not exist的意思。 ```bash > hsetnx myhash field "Hello" (integer) 1 > hsetnx myhash field "Hello" (integer) 0 ``` 第一次执行是成功的,但第二次执行相同的命令失败,原因是field已经存在了。 `hmset` ­­ 同时设置hash的多个field。 ```bash > hmset myhash field1 Hello field2 World > OK ``` `hget` ­­ 获取指定的hash field。 ```bash > hget myhash field1 "Hello" > hget myhash field2 "World" > hget myhash field3 (nil) ``` 由于数据库没有field3,所以取到的是一个空值nil. `hmget` ­­ 获取全部指定的hash filed。 ```bash > hmget myhash field1 field2 field3 1) "Hello" 2) "World" 3) (nil) ``` ` hincrby` ­­ 指定的hash filed 加上给定值。 ```bash > hset myhash field3 20 (integer) 1 > hget myhash field3 "20" > hincrby myhash field3 -8 (integer) 12 > hget myhash field3 "12 ``` `hexists` ­­ 测试指定field是否存在。 ```bash > hexists myhash field1 (integer) 1 > hexists myhash field9 (integer) 0 通过上例可以说明field1存在,但field9是不存在的。 ``` `hlen` ­­ 返回指定hash的field数量。 ```bash > hlen myhash (integer) 4 ``` `hkeys` ­­ 返回hash的所有field。 ```bash > hkeys myhash > 1) "field2" > 2) "field" > 3) "field3" ``` 说明这个hash中有3个field。 `hvals` ­­ 返回hash的所有value。 ```bash > hvals myhash 1) "World" 2)"Hello" 3)"12" ``` 说明这个hash中有3个field。 `hgetall` ­­ 获取某个hash中全部的filed及value。 ```bash > hgetall myhash 1) "field2" 2) "World" 3) "field" 4) "Hello" 5) "field3" 6) "12" ```