Redis五大类型及方法详细介绍
Redis作为一款高性能的键值对存储数据库,支持多种数据类型,每种类型都有其独特的特性和应用场景。以下将详细介绍Redis的五大基本数据类型:字符串(String)、列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset)。
1、String类型
1.1 String类型简介
- String类型是Redis最基础的数据类型。在Redis中,一个字符串值最大可达512M。
- 该类型是二进制安全的,这意味着它可以包含任何数据,无论是普通文本、数字,甚至是如jpg图片数据或者序列化后的对象。
- String的数据结构是简单动态字符串(SDS,Simple Dynamic String),这是一种可修改的字符串结构,其内部结构类似于Java中的ArrayList,在进行字符串操作时能高效地管理内存。
1.2 常用命令
命令 | 含义 |
---|
keys * | 查看所有的键 |
set key value | 添加键值对 |
mset key1 value1 key2 value2 … | 同时设置多个键值对 |
get key | 查询对应键的键值对 |
append key value | 将指定的value追加到key原值的末尾(例如,原值为“abc”,追加值为“def”,执行后结果为“abcdef”) |
strlen key | 获取key值的长度 |
setnx key value | 仅当key不存在时,才设置key的值为value |
getrange key start end | 获取值的指定范围(例如,“0 - 2”表示获取从下标0到2的字符) |
setrange key offset value | 从指定的起始位置(offset)开始,用value替换原有值的相应部分 |
setex key seconds value | 设置带过期时间(单位为秒)的键值对 |
getset key value | 用新的value替换对应key的旧value,并返回旧value |
msetnx key1 value1 key2 value2 … | 同时设置多个键值对,只有所有key都不存在时才成功,只要有一个失败则全部失败 |
incr key | 将key中储存的数字值增1,仅能对数字值操作,如果key为空则新增值为1 |
decr key | 将key中储存的数字值减1,仅能对数字值操作,如果key为空则新增值为 - 1 |
incrby key increment | 将key中储存的数字增加指定的步长值(例如,原value值为500,步长为20,结果为520) |
decrby key decrement | 将key中储存的数字减少指定的步长值(例如,原value值为500,步长为20,结果为480) |
2、List类型(列表)
2.1 List类型简介
- Redis列表是简单的字符串列表,按照元素插入顺序排序,支持在列表的头部(左边)或尾部(右边)添加元素。
- 其底层数据结构实际上是一个双向链表,这使得对列表两端的操作性能极高,但通过索引下标的方式操作中间节点时,性能相对较差。
- List的数据结构为快速链表(quickList)。在列表元素较少的情况下,Redis会使用一块连续内存来存储,这种结构称为压缩列表(ziplist)。当数据量增大时,才会转换为quickList结构。
2.2 常用命令
命令 | 含义 |
---|
lpush key value1 value2 … | 从左边插入一个或多个值 |
rpush key value1 value2 … | 从右边插入一个或多个值 |
lpop key | 从左边取出一个值(当列表中没有值时,对应的key也会被删除) |
rpop key | 从右边取出一个值(当列表中没有值时,对应的key也会被删除) |
rpoplpush source_key destination_key | 从source_key的右边取出一个值,插入到destination_key的左边 |
lrange key start end | 按照下标范围获取对应key的元素(从左到右,“0”到“ - 1”代表获取所有元素) |
lindex key index | 获取对应key中指定下标的元素 |
llen key | 获取key对应列表的长度 |
linsert key after value new_value | 在指定value之后插入一个新的new_value值 |
linsert key before value new_value | 在指定value之前插入一个新的new_value值 |
lrem key count value | 从左边开始删除count个指定的value值 |
lset key index value | 将列表key中下标为index的值替换为value |
3、Set类型(集合)
3.1 Set类型简介
- Redis的Set类型对外提供的功能与List有相似之处,也是用于存储列表数据。其特殊之处在于Set能自动对插入的元素进行去重。当需要存储一个不包含重复数据的列表时,Set是一个理想选择。
- Set提供了判断某个成员是否在集合内的重要接口,这是List所不具备的功能。
- Redis的Set是String类型的无序集合。其底层实现实际上是一个value为null的哈希表,因此添加、删除、查找操作的时间复杂度均为O(1)。
- Set结构基于dict字典实现,而字典是通过哈希表来实现的。这与Java中HashSet的内部实现原理类似,Java的HashSet内部使用HashMap,只不过所有的value都指向同一个对象,Redis的Set结构也是如此。
3.2 常用命令
命令 | 含义 |
---|
sadd key value1 value2 … | 将一个或多个元素加入到集合key中 |
smembers key | 取出集合key中的所有值 |
sismember key value | 判断集合key是否包含指定的value值,若包含返回1,否则返回0 |
scard key | 返回集合的元素个数 |
srem key value1 value2 … | 删除集合中的指定元素 |
spop key | 随机从集合中弹出一个值(当集合中没有值时,对应的key也会被删除) |
srandmember key count | 随机从集合中取出count个值,取出的值不会从集合中删除 |
smove source_key destination_key value | 将source_key集合中的value元素移动到destination_key集合中 |
sinter key1 key2 | 返回两个集合的交集元素 |
sunion key1 key2 | 返回两个集合的并集元素 |
sdiff key1 key2 | 返回两个集合的差集元素(以key1为基准) |
4、Hash类型(哈希)
4.1 Hash类型简介
- Redis的Hash是一个键值对集合。
- 它是一个String类型的field和value的映射表,特别适合用于存储对象,类似于Java中的Map<String, Object>结构。
- Hash类型对应的数据结构有两种:压缩列表(ziplist)和哈希表(hashtable)。当field - value的长度较短且个数较少时,Redis会使用ziplist结构存储;否则,将使用hashtable结构。
4.2 常用命令
命令 | 含义 |
---|
hset key field value | 给key对应的哈希集合中的field设置值为value |
hget key field | 从key对应的哈希集合中的field获取值 |
hmset key field1 value1 field2 value2 … | 批量设置哈希集合中的多个field - value对 |
hexists key field | 查看哈希表key中是否存在指定的field |
hkeys key | 列出哈希集合key中的所有field |
hvals key | 列出哈希集合key中的所有value |
hincrby key field increment | 给哈希表key中的field值增加指定的增量increment(例如,field原值为2,增量为2,执行后结果为4) |
hsetnx key field value | 仅当哈希表key中的field不存在时,才将其值设置为value |
5、Zset类型(有序集合)
5.1 Zset类型简介
- Redis的有序集合Zset与普通的Set类似,也是一个不包含重复元素的字符串集合。
- 不同之处在于,有序集合的每个成员都关联了一个评分(score),Redis会根据评分从最低分到最高分的顺序对集合中的成员进行排序。集合成员必须唯一,但评分可以重复。
- 由于元素是有序的,因此可以根据评分(score)或元素次序(position)快速获取指定范围的元素。同时,访问有序集合的中间元素也非常高效。
- Zset底层使用了两个数据结构:
- hash:其作用是关联元素value和权重score,确保元素value的唯一性,并可以通过value快速找到对应的score值。
- 跳跃表:用于对元素的value按照score进行排序,方便根据score范围获取元素列表。
5.2 常用命令
命令 | 含义 |
---|
zadd key score1 value1 score2 value2 … | 将一个或多个元素及其对应的score值加入到有序集合key中 |
zrange key start stop | 返回有序集合key中下标在start与stop之间的元素 |
zrange key start stop withscores | 返回有序集合key中下标在start与stop之间的元素及其对应的score值 |
zrangebyscores key min max | 返回有序集合key中,所有score值介于min和max之间的成员(包括等于min和max的成员) |
zrangebyscores key min max withscores | 返回有序集合key中,所有score值介于min和max之间的成员及其对应的score值(包括等于min和max的成员) |
zrevrangebyscores key max min | 返回有序集合key中,所有score值介于max和min之间的成员,按从大到小排序 |
zincrby key increment value | 为有序集合key中的指定元素的score增加指定的增量increment |
zrem key value | 删除有序集合key中指定的value元素 |
zcount key min max | 统计有序集合key中,score值在min与max范围内的元素个数 |
zrank key value | 返回指定value在有序集合key中的排名,排名从0开始 |