Redis
自身已经是键值对结构了
Redis
自身的键值对就是通过哈希的方式来组织的
把 key
这一层组织完成之后,到了 value
这一层,value
这一层也可以是哈希
field-value
,用于区分 Redis
整体的键值对(key-value
),注意这里的 value
是指 field
对应的值,不是 key 对应的值,注意 value
在不同上下文的作用设置/获取 hash
中指定的字段(field
)的值(value
)
语法:
HSET key field value [field value...]
HGET key field
HSET
的返回值是设置成功的键值对(field-value
)的个数判断 hash
中是否有指定的字段
语法:
HEXISTS key field
1
表示存在,0
表示不存在删除 hash
中指定的字段
del
删除的是 key
hdel
删除的是 field
语法:
HDEL key field [field...]
,删除
个位
(几十几百个就视为 1)
HDEL
是删除 key
对应的 value
(field-value
) 中的键值对 field
DEL
是直接删除 key
对应的 value
(里面所有的键值对全删)获取 hash
中的所有字段
语法:
HKEYS key
key
找到对应的 hash
(),然后再遍历 hash
(
,
为 hash
的元素个数)
谈到
,有的时候,
表示:
Redis
整体 key
的个数key
的个数 (因为我们一般不会弄太多 key
,所以一般可以直接看做 )
key
对应的 value
里面的元素个数获取 hash 中的所有的值
语法:
HVALS key
(
是哈希的元素个数,如果哈希非常大,这个操作就可能导致 Redis
服务器被阻塞住)
获取 hash
中的所有字段以及对应的值
HKEYS
和 HVALS
语法:
HGETALL key
(
是哈希的元素个数,如果哈希非常大,这个操作就可能导致 Redis
服务器被阻塞住)
这个操作,还是风险比较大。多数情况下,不需要查询所有的
field
,可能只查其中的几个key
一次获取 hash
中多个字段的值
语法:
HMGET key field [field...]
,删除
个位
(几十几百个就视为 1)
nil
HKEYS
、HVALS
、HGETALL
都是存在一定风险的。hash
元素个数太多,执行的时间就会比较长,从而阻塞 Redis
HSCAN
遍历 Redis
的 hash
,“渐进式遍历“ ConcurrentHashMap
线程安全的哈希表
获取 hash
中的所有字段的个数
语法:
HLEN key
在字段不存在的情况下,设置 hash
中的字段和值
语法:
HSETNX key field value
将 hash
中字段对应的数字添加指定的值
语法:
HINCRBY key field increment
HINCRBY
的浮点数版本
语法:
HINCRBYFLOAT key field increment
哈希的内部编码有两种:
ziplist
:压缩列表hashtable
:哈希表压缩:
rar
zip
gzip
7z
压缩的本质,是针对数据进行重新编码。不同的数据,有不同的特点,结合这些特点,进行精妙的设计,重新编码之后,就能够缩小体积
比如,现在有字符串:
abcccddddeeeee
1a2b3c4d5e
ziplist
内部的数据结构也是精心设计的(目的是节省内存空间)
hash
表,可能会浪费一定的空间(hash
首先是一个数组,数组上有些位置有元素,有些没有元素)如果:
ziplist
表示;元素较多,就用 hashtable
来表示value
的值,长度都比较短,使用 ziplist
表示;如果某个 value
的长度太长了,也会转换成 hashtable
redis。conf
文件中,调整 hash-max-ziplist-entries
配置和 hash-max-ziplist-value
配置