redis的几种数据类型

本文深入解析Redis的五种主要数据类型:String、Hash、List、Set及Sorted Set。详细介绍每种类型的特点、应用场景及常用命令,如HSET、LRANGE、ZADD等,帮助读者全面理解Redis数据结构。

redis 主要有以下几种数据类型:

  • string
  • hash
  • list
  • set
  • sorted set

string

这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。

set college szu

hash

这个是类似 map 的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在 redis 里,然后每次读写缓存的时候,可以就操作 hash 里的某个字段

hset person name bingo
hset person age 20
hset person id 1
hget person name
person = {
    "name": "bingo",
    "age": 20,
    "id": 1
}

list

list 是有序列表,这个可以玩儿出很多花样。

比如可以通过 list 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西。

比如可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 list 实现分页查询,这个是很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。

# 0开始位置,-1结束位置,结束位置为-1时,表示列表的最后一个位置,即查看所有。
lrange mylist 0 -1

比如可以搞个简单的消息队列,从 list 头怼进去,从 list 尾巴那里弄出来。

lpush mylist 1
lpush mylist 2
lpush mylist 3 4 5

# 1
rpop mylist

set

set 是无序集合,自动去重。

直接基于 set 将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,你当然也可以基于 jvm 内存里的 HashSet 进行去重,但是如果你的某个系统部署在多台机器上呢?得基于 redis 进行全局的 set 去重。

可以基于 set 玩儿交集、并集、差集的操作,比如交集吧,可以把两个人的粉丝列表整一个交集,看看俩人的共同好友是谁?对吧。

把两个大 V 的粉丝都放在两个 set 中,对两个 set 做交集。

#-------操作一个set-------
# 添加元素
sadd mySet 1

# 查看全部元素
smembers mySet

# 判断是否包含某个值
sismember mySet 3

# 删除某个/些元素
srem mySet 1
srem mySet 2 4

# 查看元素个数
scard mySet

# 随机删除一个元素
spop mySet

#-------操作多个set-------
# 将一个set的元素移动到另外一个set
smove yourSet mySet 2

# 求两set的交集
sinter yourSet mySet

# 求两set的并集
sunion yourSet mySet

# 求在yourSet中而不在mySet中的元素
sdiff yourSet mySet

sorted set

sorted set 是排序的 set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。

zadd board 85 zhangsan
zadd board 72 lisi
zadd board 96 wangwu
zadd board 63 zhaoliu

# 获取排名前三的用户(默认是升序,所以需要 rev 改为降序)
zrevrange board 0 3

# 获取某用户的排名
zrank board zhaoliu
<think>我们首先需要明确用户的问题:用户询问Redis支持哪些数据类型以及如何查询这些数据类型。根据引用内容,Redis支持多种数据类型,包括核心数据类型和基于核心类型实现的特殊类型。 核心数据类型(根据引用[2]): 1. 字符串(string) 2. 哈希(hash) 3. 列表(list) 4. 集合(set) 5. 有序集合(zset) 其他类型(同样引用[2]): 6. Bitmap(位图,基于字符串实现) 7. HyperLogLog(基于字符串实现) 8. Geo(地理空间,基于有序集合实现) 9. Streams(5.0版本新增,消息队列) 另外,引用[1]和[3]也提到了字符串类型,引用[4]则提到了数据库操作命令,其中包含一些查询命令。 关于如何查询这些数据类型,我们主要使用Redis命令。引用[4]提供了一些基础命令: - 查看当前库所有key: `keys *` - 判断某个键是否存在: `exists key` - 查看key的数据类型: `type key` 因此,我们可以这样组织回答: 1. 列出Redis支持的数据类型(核心5种+其他4种)。 2. 重点介绍如何查询数据类型:使用`type key`命令。 注意:引用[4]中提到的其他命令(如删除、设置过期时间等)虽然有用,但用户当前问题集中在数据类型查询,所以重点在`type`命令。 同时,我们可以给出一个简单的示例,展示如何使用`type`命令。 另外,由于引用[4]中提到了数据库切换等命令,如果用户需要,我们也可以简要提及,但主要回答数据类型和查询方法。 最后,生成相关问题。 注意:在回答中,我们引用的内容需要标注引用标记,例如[^2]。</think>### Redis 支持的数据类型及查询方法 Redis 提供多种数据类型,每种类型有特定的使用场景和查询命令。以下是核心数据类型及查询操作详解: #### 一、Redis 支持的数据类型 1. **字符串(String)** - **用途**:存储文本、二进制数据(如图片)、数值等。 - **底层实现**:动态字符串(SDS)[^1]。 - **示例值**:`set name "Redis"` 2. **哈希(Hash)** - **用途**:存储字段-值对,适合表示对象(如用户信息)。 - **底层实现**:压缩列表(小数据)或哈希表(大数据)[^1]。 - **示例值**:`hset user:1 name "Alice" age 30` 3. **列表(List)** - **用途**:有序元素集合,支持双向操作(队列/栈)。 - **底层实现**:压缩列表或双向链表[^1]。 - **示例值**:`lpush tasks "task1" "task2"` 4. **集合(Set)** - **用途**:无序唯一元素集合,支持交并差运算。 - **底层实现**:整数集合(小数据)或哈希表[^1]。 - **示例值**:`sadd tags "java" "python"` 5. **有序集合(ZSet)** - **用途**:带权重的唯一元素集合(如排行榜)。 - **底层实现**:压缩列表或跳表(SkipList)[^1]。 - **示例值**:`zadd rank 90 "Alice" 85 "Bob"` 6. **扩展类型**(基于核心类型实现) - **Bitmap**(位图):基于 String 的位操作。 - **HyperLogLog**:基于 String 的基数统计。 - **Geo**(地理空间):基于 ZSet 的位置存储。 - **Streams**(消息队列):5.0+ 新增的持久化流[^2]。 --- #### 二、数据类型查询操作 通过 Redis 命令直接查询键(Key)的数据类型和内容: 1. **查看键的数据类型** ```bash TYPE key_name # 返回键对应的数据类型 ``` **示例**: ```bash TYPE user:1 # 若存储哈希数据,返回 "hash" ``` 2. **检查键是否存在** ```bash EXISTS key_name # 返回 1(存在)或 0(不存在) ``` 3. **查询键的值**(按类型) - **String**:`GET key_name` - **Hash**:`HGETALL key_name`(获取所有字段) - **List**:`LRANGE key_name 0 -1`(获取全部元素) - **Set**:`SMEMBERS key_name` - **ZSet**:`ZRANGE key_name 0 -1 WITHSCORES` 4. **其他实用命令** - 查看所有键:`KEYS *`(慎用,可能阻塞服务) - 删除键:`DEL key_name` - 设置过期时间:`EXPIRE key_name 10`(10秒后过期)[^4] --- ### 示例流程 ```bash # 1. 存储哈希数据 HSET product:1001 name "Laptop" price 1200 # 2. 查询数据类型 TYPE product:1001 # 返回 "hash" # 3. 查询具体值 HGETALL product:1001 # 返回:1) "name" 2) "Laptop" 3) "price" 4) "1200" ``` > **注意**: > - 生产环境避免使用 `KEYS *`,改用 `SCAN` 分页查询[^4]。 > - 数据类型由底层自动转换(如小数据用压缩列表,大数据转哈希表)。 --- ### 相关问题 1. 如何高效查询 Redis 中所有符合特定模式的键? 2. Redis 的 String 类型如何存储序列化对象? 3. 有序集合(ZSet)的跳表实现原理是什么? 4. Redis Streams 与其他消息队列(如 Kafka)有何区别?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值