Redis数据库支持的数据类型
Redis 数据库支持五种数据类型。
- 字符串(string)
- 哈希(hash)
- 列表(list)
- 集合(set)
- 有序集合(sorted set)
- 位图 ( Bitmaps )
- 基数统计 ( HyperLogLogs )
String 是一组字节。在 Redis 数据库中,字符串是二进制安全的。这意味着它们具有已知长度,并且不受任何特殊终止字符的影响。可以在一个字符串中存储最多 512 兆字节的内容。
使用SET命令储存字符串命令如下
1 2 3 4 |
127.0.0.1:6379> set keyjsg "www.jsgang.top" OK 127.0.0.1:6379> get keyjsg "www.jsgang.top" |
哈希是键值对的集合。在 Redis 中,哈希是字符串字段和字符串值之间的映射。因此,它们适合表示对象。
让我们存储一个用户的对象,其中包含用户的基本信息。示例如下
1 2 3 4 5 6 7 8 9 10 11 |
127.0.0.1:6379> hmset user:1 uname jsgang pwd jsgang sex 1 OK 127.0.0.1:6379> hget user:1 uname "jsgang" 127.0.0.1:6379> hgetall user:1 1) "uname" 2) "jsgang" 3) "pwd" 4) "jsgang" 5) "sex" 6) "1" |
这里,HMSET、HGET 和 HGETALL 是 Redis 的命令,而user:1是键。
1 |
每个哈希可以存储多达2<sup>32</sup> – 1个字段-值对。 |
Redis 列表定义为字符串列表,按插入顺序排序。可以将元素添加到 Redis 列表的头部或尾部。
列表的示例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
127.0.0.1:6379> LPUSH list jsgang (integer) 1 127.0.0.1:6379> RPUSH list right (integer) 2 127.0.0.1:6379> LPUSH list mid (integer) 3 127.0.0.1:6379> LPUSH list top (integer) 4 127.0.0.1:6379> LRANGE list 0 3 1) "top" 2) "mid" 3) "jsgang" 4) "right" 127.0.0.1:6379> LRANGE list 1 2 1) "mid" 2) "jsgang" |
这里,LPUSH、RPUSH 和 LRANGE 是 Redis 的命令,而list是键。
列表的最大长度为 232 – 1 个元素(超过 40 亿个元素)。
集合(set)是 Redis 数据库中的无序字符串集合。在 Redis 中,添加,删除和查找的时间复杂度是 O(1)。
集合的示例如下
1 2 3 4 5 6 7 8 9 10 11 12 |
127.0.0.1:6379> SADD lists se (integer) 1 127.0.0.1:6379> SADD lists sql (integer) 1 127.0.0.1:6379> SADD lists se (integer) 0 127.0.0.1:6379> SADD lists jsgang (integer) 1 127.0.0.1:6379> SMEMBERS lists 1) "se" 2) "jsgang" 3) "sql" |
这里,SADD 和 SMEMBERS 是 Redis 的命令,而lists是键。
在上面的示例中,您可以看到 se被添加了两次,但由于该集的唯一属性,它只添加一次。
集合中的最大成员数为 232-1 个元素(超过 40 亿个元素)。
有序集合类似于 Redis 集合,也是一组非重复的字符串集合。但是,排序集的每个成员都与一个分数相关联,该分数用于获取从最小到最高分数的有序排序集。虽然成员是独特的,但可以重复分数。
命令示例如下
1 2 3 4 5 6 7 8 9 10 11 12 |
127.0.0.1:6379> zadd xlist 0 redis (integer) 1 127.0.0.1:6379> zadd xlist 1 jsgang (integer) 1 127.0.0.1:6379> zadd xlist 0 jsgang (integer) 0 127.0.0.1:6379> zadd xlist 0 jsg (integer) 1 127.0.0.1:6379> ZRANGEBYSCORE xlist 0 10 1) "jsg" 2) "jsgang" 3) "redis" |
Redis Bitmap 通过类似 map 结构存放 0 或 1 ( bit 位 ) 作为值。
Redis Bitmap 可以用来统计状态,如日活是否浏览过某个东西。
Redis setbit 命令
Redis setbit 命令用于设置或者清除一个 bit 位。示例如下
1 |
SETBIT key offset value |
Redis HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值
- 基数
集合中不同元素的数量,比如 {'apple', 'banana', 'cherry', 'banana', 'apple'} 的基数就是 3
- 估算值
算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合 理的范围之内
HyperLogLog 的优点是:即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 264 个不同元素的基数。
这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
代码示例如下
1 2 3 4 |
127.0.0.1:6379> PFADD hlogs 'jsgang' 'haoming' 'redis' 'jsgang' (integer) 1 127.0.0.1:6379> PFCOUNT hlogs (integer) 3 |