如何遍历Redis键与对象并获取对应值?
嘿,我来帮你搞定这两个Redis遍历的问题,这些操作在日常开发里挺常用的,我分情况给你讲清楚,还附了实际场景示例~
方式一:用KEYS命令(测试环境用,生产谨慎)
KEYS可以匹配指定模式的所有键,然后你可以逐个获取对应的值。不过注意,KEYS会阻塞Redis实例,数据量大的时候千万别在生产环境用!
举个例子:
假设Redis里有这些键值对:user:1001 → "Alice",user:1002 → "Bob",order:2001 → "paid"
先执行:
KEYS user:*
会返回:1) "user:1001" 2) "user:1002"
然后遍历这些键,用GET获取值:
GET user:1001 # 返回 "Alice" GET user:1002 # 返回 "Bob"
方式二:用SCAN命令(生产环境推荐)
SCAN是渐进式遍历,不会阻塞Redis,生产环境推荐。它每次返回一部分键,你需要循环调用直到返回的游标为0。
示例操作(redis-cli里的交互):
# 第一次调用,游标0,匹配user:* SCAN 0 MATCH user:* # 返回类似:1) "123" 2) 1) "user:1001" 2) "user:1002" # 然后用返回的游标123继续调用,直到游标变成0 SCAN 123 MATCH user:* # 直到返回游标0,说明遍历完成
拿到每个键之后,同样用GET(如果是字符串类型)或者对应类型的命令获取值。
这里的“对象”应该指Redis的复合数据类型(Hash、List、Set、Sorted Set),每种类型有对应的命令直接获取所有值,不用手动遍历键:
情况1:Hash类型(键值对集合)
用HGETALL命令可以直接获取Hash的所有字段和值,返回结果是字段和值交替的列表。如果只想获取所有值,用HVALS命令更直接。
示例场景:
假设Redis里有一个Hash对象user:profile:1001,包含:name → "Alice",age → "28",city → "New York"
执行HGETALL:
HGETALL user:profile:1001
返回结果:
1) "name" 2) "Alice" 3) "age" 4) "28" 5) "city" 6) "New York"
执行HVALS:
HVALS user:profile:1001
返回:1) "Alice" 2) "28" 3) "New York"
情况2:List类型(有序列表)
用LRANGE命令,指定起始索引0和结束索引-1(代表最后一个元素),就能获取所有值。
示例场景:
Redis里有一个Listuser:favorites:1001,元素是"book"、"movie"、"music"
执行:
LRANGE user:favorites:1001 0 -1
返回:1) "book" 2) "movie" 3) "music"
情况3:Set类型(无序唯一集合)
用SMEMBERS命令直接获取所有元素,返回顺序不固定(因为Set是无序的)。
示例场景:
Redis里有一个Setuser:tags:1001,元素是"tech"、"travel"、"food"
执行:
SMEMBERS user:tags:1001
返回:1) "tech" 2) "travel" 3) "food"
情况4:Sorted Set类型(有序唯一集合)
用ZRANGE命令,指定0到-1,加上WITHSCORES可以同时获取分数和值,不加就只获取值(按分数从小到大排序)。
示例场景:
Redis里有一个Sorted Setrank:user,值和分数:"Alice" → 95,"Bob" → 88,"Charlie" → 92
执行不带分数的命令:
ZRANGE rank:user 0 -1
返回:1) "Bob" 2) "Charlie" 3) "Alice"
执行带分数的命令:
ZRANGE rank:user 0 -1 WITHSCORES
返回:
1) "Bob" 2) "88" 3) "Charlie" 4) "92" 5) "Alice" 6) "95"
内容的提问来源于stack exchange,提问作者Jenia Be Nice Please




