String
常用命令:
set,get,decr,incr,mget 等。
应用场景:
字符串是最常用的数据类型,他能够存储任何类型的字符串,当然也包括二进制、JSON化的对象、甚至是Base64编码之后的图片。在Redis中一个字符串最大的容量为512MB,可以说是无所不能了。
在 Redis 中字符串类型的内部编码有 3 种:
- int:8 个字节的长整型
- embstr:小于等于 44 个字节的字符串
- raw:大于 44 个字节的字符串(3.2之前是39)
Hash
常用命令:
hget,hset,hgetall 等。
Redis 哈希类型的内部编码有两种,它们分别是:
- ziplist(压缩列表):当哈希类型中元素个数小于 hash-max-ziplist-entries 配置(默认 512 个),同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现。
- hashtable(哈希表):当上述条件不满足时,Redis 则会采用 hashtable 作为哈希的内部实现。
List
常用命令:
lpush,rpush,lpop,rpop,lrange等。
Redis 列表类型的特点如下:
列表中所有的元素都是有序的,所以它们是可以通过索引获取的lindex 命令。并且在 Redis 中列表类型的索引是从 0 开始的。
列表中的元素是可以重复的,也就是说在 Redis 列表类型中,可以保存同名元素
列表中的内部编码有两种,它们分别是:
- ziplist(压缩列表):当列表中元素个数小于 512(默认)个,并且列表中每个元素的值都小于 64(默认)个字节时,Redis 会选择用 ziplist 来作为列表的内部实现以减少内存的使用。当然上述默认值也可以通过相关参数修改:list-max-ziplist-entried(元素个数)、list-max-ziplist-value(元素值)。
- linkedlist(链表):当列表类型无法满足 ziplist 条件时,Redis 会选择用 linkedlist 作为列表的内部实现。
Set
常用命令:
sadd,spop,smembers,sunion 等。
应用场景:
Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。
实现方式:
set 的内部实现是一个 value 永远为 null 的 HashMap,实际就是通过计算 hash 的方式来快速排重的,这也是 set 能提供判断一个成员是否在集合内的原因。
Redis 中的集合类型,也就是 set。在 Redis 中 set 也是可以保存多个字符串的,经常有人会分不清 list 与 set,下面我们重点介绍一下它们之间的不同:
- set 中的元素是不可以重复的,而 list 是可以保存重复元素的。
- set 中的元素是无序的,而 list 中的元素是有序的。
- set 中的元素不能通过索引下标获取元素,而 list 中的元素则可以通过索引下标获取元素。
除此之外 set 还支持更高级的功能,例如多个 set 取交集、并集、差集等
为什么 Redis 要提供 sinterstore、sunionstore、sdiffstore 命令来将集合的交集、并集、差集的结果保存起来呢?这是因为 Redis 在进行上述比较时,会比较耗费时间,所以为了提高性能可以将交集、并集、差集的结果提前保存起来,这样在需要使用时,可以直接通过 smembers 命令获取。
内部编码
- intset(整数集合):当集合中的元素都是整数,并且集合中的元素个数小于 512 个时,Redis 会选用 intset 作为底层内部实现。
- hashtable(哈希表):当上述条件不满足时,Redis 会采用 hashtable 作为底层实现。
备注:我们可以通过 set-max-intset-entries 参数来设置上述中的默认参数。
Sorted set
常用命令:
zadd,zrange,zrem,zcard等
使用场景:
Redis sorted set 的使用场景与 set 类似,区别是 set 不是自动有序的
有序集合类型的内部编码有两种,它们分别是:
- ziplist(压缩列表):当有序集合的元素个数小于 128 个(默认设置),同时每个元素的值都小于 64 字节(默认设置),Redis 会采用 ziplist 作为有序集合的内部实现。
- skiplist(跳跃表):当上述条件不满足时,Redis 会采用 skiplist 作为内部编码。
备注:上述中的默认值,也可以通过以下参数设置:zset-max-ziplist-entries 和 zset-max-ziplist-value。