Redis---hash类型
value类型为hash类型H系列的命令必须要保证value得是hash类型如图所示HSET设置value为hash类型的键值对操作格式hset key field value [field value...]举个例子//对key1的value设置多组键值对 hset key1 f1 111 f2 222 f3 333返回值设置成功的键值对个数HGET操作格式hget key field返回值该field对应的value找不到返回空(nil)HEXISTS操作格式hexists key field返回值1表示存在0表示不存在举个例子//设置一个键值对 hset key1 field1 value1 //查找field对应的value hexists key1 field1HDEL删除hash中的指定字段注意del删除的是keyhdel删除的是field操作格式hdel key field [field...]返回值本次操作删除字段的个数举个例子hset key1 field1 value1 hdel key1 field1HKEYS获取hash中key对应的所有field字段操作格式hkeys key举个例子hset key1 field1 value1 hkeys key1时间复杂度O(N)N为key设置的field的个数这种情况我们可以将其看作O(1)HVALUES获取hash中key对应的所有value字段操作格式hvalues key举个例子hset key1 field1 values1 hvalues key1时间复杂度O(N)注意hkeys/hvalues如果查询到的数据量过大可能导致redis长时间执行不完该命令导致阻塞其它请求进而导致大量请求去请求mysql导致搞崩溃mysql与keys *差不多HGETALL获取该key对应的全部field和valueHMGET一次查询多个field操作格式hmget field [field...]hekeyshvalueshgetall均存在一定风险可能将服务器搞崩想要全部遍历更推荐hscanHSCAN它属于渐进式遍历意思是敲一次遍历一小部分多敲几次也可以遍历完全部数据HLEN获取values对应的哈希结构存储多少个元素操作格式hlen key时间复杂度O(1)因为拿取个数时是不需要遍历的而是选择存储其现有个数并将其返回所以时间复杂度是O(1)举个例子hset key1 f1 111 f2 222 f3 333 hlen key1HSTENX类似于stenx不存在的时候才能设置成功如果存在则失败HINCRBY/HINCRBYFLOAThincrby增加n个整数hincrbyfloat增加n个小数注意value为hash类型并没有提供incrdecr等操作格式hincrby key field number举个例子hset key1 field1 10 hincrby key1 field1 -10时间复杂度O(1)哈希编码方式ziplist压缩列表当哈希类型元素个数小于hash-max-ziplist-entries配置默认512个同时所有值大小都小于hash-max-ziplist-value配置默认64字节时redis会使用ziplist作为哈希的内部实现ziplist使用更加紧凑的结构实现多个元素的连续存储所以在节省空间方面上比hashtable更加优秀hashtable正常的哈希结构压缩的本质压缩的本质就是对数据仅从重新的编码不同的数据有不同的特点在进行精妙的设计后重新编码就能够缩小体积举个例子对abbcccddddeeeee重新编码1a2b3c4d5eziplist也是同理内部数据结构也是经过精心设计的所以在哈希中元素个数比较少value的值长度都比较短的情况下会使用ziplist结构修改这两个配置文件hash-max-ziplist-entries/hash-max-ziplist-value可以修改大小为多少在进行容器的切换这部分知识在进行比较精细的调优工作时还是比较有意义的使用场景1.可以存储一些表结构