Redis数据结构:散列
当存储相关联的一组数据,比如文章(标题、内容、创建时间等),使用字符串键需要加之相同的前缀(article::001::title、article::001::content、article::001::createtime),不利于维护(删除文章)且存储键名也会浪费内存空间。而散列,是一种能够把相关联的数据打包存储的数据结构。
数据结构
- 散列
散列(hash)
散列键会将一个键和一个散列在数据库中关联起来,可以在散列中为任意多个字段(field)设置值。
使用散列存储文章数据时,结构如下图:
-
为字段设置值
1.hset命令 格式:hset hash field value [field value …]
若给定字段不存在于散列,命令关联后返回成功执行的字段个数,否则执行更新操作返回0。
hset hash field value [field value ...]
2.hsetnx命令 格式:hsetnx hash field value
只在字段不存在时为其设置值,成功返回1,字段已经存在时返回0且不执行设置值。
hsetnx hash field value
3.hmset命令 格式:hmset hash field value [field value …]
一次为散列中多个字段设置值,若已存在字段则更新值,设置成功返回OK。
hmset hash field value [field value ...]
注意:
散列包含的字段也是以无序方式排列的。 -
获取字段的值
1.hget命令 格式:hget hash field
若字段不存在或散列不存在,将返回一个空值nil。
hget hash field
2.hmget命令 格式:hmget hash field [field …]
返回一个列表作为结果。列表按照用户执行命令时给定字段的顺序排列值。若给定的字段或散列不存在,将返回空值nil。
hmget hash field [field ...]
-
获取散列
1.hkeys命令 格式:hkeys hash
获取所有字段,散列不存在时返回empty array。
hkeys hash
2.hvals命令 格式:hvals hash
获取所有值,散列不存在时返回empty array。
hvals hash
3.hgetall命令 格式:hgetall hash
获取所有字段和值,返回列表中奇数位为字段偶数位为值,散列不存在时返回empty array。
hgetall hash
-
获取字段值长度
1.hstrlen命令 格式:hstrlen hash field
获取字段值的字节长度,对于不存在的字段或散列将返回0。
hstrlen hash field
-
检查字段是否存在
1.hexists命令 格式:hexists hash field
若散列包含字段则返回1,否则返回0。
hexists hash field
-
删除字段
1.hdel命令 格式:hdel hash field [field …]
若散列包含字段且成功删除则返回成功删除的字段个数,否则返回0。
hdel hash field [field ...]
-
获取散列中字段数量
1.hlen命令 格式:hlen hash
获取散列包含的字段数量,若散列不存在返回0。
hlen hash
-
数字计算
当字段存储的值能被Redis解释为数字时,就可执行加法或减法操作。
1.hincrby命令 格式:hincrby hash field increment
用于为字段值加上指定的整数增量,返回加法操作之后的值。
hincrby hash field increment
2.hincrbyfloat命令 格式:hincrbyfloat hash field increment
用于为字段值加上指定的浮点数增量,返回加法操作之后的值。
hincrbyfloat hash field increment
注意:
1)hincrby命令,当值不能被Redis解释为整数时将返回error。
2)散列或字段不存在时,会先将字段初始化为0,然后执行加减操作。 -
常见用法
1.短网址映射
2.用户令牌,散列分别为登录token和过期时间戳,以用户id作为字段存储。