Redis数据类型之hash
上篇文章:
Redis数据类型之Stringhttps://blog.csdn.net/sniper_fandc/article/details/149139418?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139418&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
目录
1 hset和hget
2 hexists和hdel
3 hkeys和hvals
4 hgetall、hmget和hlen
5 hincrby和hincrbyfloat
6 hash的使用场景
hash数据结构中键叫field,值是value。键名不叫key是为了和redis的键值对结构区分。相关命令是h系列的命令,需要保证value是hash类型的。
1 hset和hget
命令:hset key field value
设置key的value为hash类型,field为键,value是field对应的值。可以同时设置多个field-value,因此返回值是设置hash中键值对的个数。时间复杂度O(1)。
命令:hget key field
获取key的value中键为field的value。时间复杂度O(1)。
2 hexists和hdel
命令:hexists key field
判断key的value中field的键值对是否存在。返回值1表示存在,0表示不存在。时间复杂度O(1)。
命令:hdel key field1 field2 ...
批量删除多个field。返回值为成功删除的个数。时间复杂度O(N),N表示删除的个数。
3 hkeys和hvals
命令:hkeys key
查询key对应的hash中所有的键field。返回值为key对应的所有的field。时间复杂度O(N),N表示field的个数。
命令:hvals key
查询key对应的hash中所有的value。返回值为key对应的所有的field的value。时间复杂度O(N),N表示value的个数。
4 hgetall、hmget和hlen
命令:hgetall key
获取key的hash类型的值的所有field和value。时间复杂度O(N),N表示field的个数。返回值每两行为一对键值对。
命令:hmget key field1 field2 ...
获取key的hash类型的指定field(可以同时获取多个)的值。时间复杂度O(N),N表示field的个数。返回值field对应的值。
命令:hlen key
获取key的hash类型的长度。时间复杂度O(1)。
5 hincrby和hincrbyfloat
命令:hincrby key field number
对hash类型的field的value进行加减number(整数,正数是加,负数是减)。时间复杂度O(1)。
命令:hincrbyfloat key field float
对hash类型的field的value进行加减float(浮点数,正数是加,负数是减)。时间复杂度O(1)。
6 hash的使用场景
hash主要用于存储结构化的数据(关系型数据库更适合,完全结构化的数据),比如在Java中经常使用user类似的对象存储用户的信息,并且会经常访问(热点数据),就可以把经常访问的用户信息放在redis中。
即把user:id作为key,user具体的信息作为hash来存储,uid:1、name:zhangsan、age:18、gender:man等等,这里的uid、name、age和gender是field,对应的值是value。当缓存未命中时,就去数据库查询user信息,查询到了就写入redis并设置过期时间;否则就直接hget key获取对应的user信息返回。
对于结构化数据存储有三种方式:
- string类型存储,set user:1:name zhangsan。优点是灵活简单,缺点是key太多了,并且很分散(低内聚)。
- JSON类型存储,set user:1 json。优点针对总是以整体作为操作的信息比较合适,编程也简单。同时,如果序列化方案选择合适,内存的使用效率很高。缺点是修改属性不灵活,序列化和反序列化需要开销。
- hash类型存储,这个不必多说。但是缺点是底层编码需要转换(ziplist和hashtable),对内存消耗可能较大。
下篇文章: