2024-04-13 18:29:33
从Redis中读取所有key对应的值可以通过以下两种方法实现,具体选择取决于数据规模和性能需求:
方法一:KEYS命令(适合小规模数据)KEYS *特点:
代码示例(Python):
import redisr = redis.Redis()all_keys = r.keys('*') # 获取所有keykey_values = {k: r.get(k) for k in all_keys} # 批量获取值方法二:SCAN命令(推荐生产环境使用)SCAN 0 MATCH * COUNT 100特点:
完整代码示例(Python):
import redisr = redis.Redis()cursor = 0all_data = {}while True: cursor, keys = r.scan(cursor=cursor, count=100) for key in keys: # 根据数据类型选择对应方法 if r.type(key) == b'hash': all_data[key] = r.hgetall(key) elif r.type(key) == b'list': all_data[key] = r.lrange(key, 0, -1) else: all_data[key] = r.get(key) if cursor == 0: # 游标归零表示遍历结束 break关键注意事项:数据类型处理:
Redis支持多种数据类型(String/Hash/List等),需用对应方法获取:
GET → 字符串
HGETALL → 哈希
LRANGE → 列表
性能优化建议:
生产环境禁用KEYS命令,优先使用SCAN
调整COUNT参数(通常100-1000)平衡网络开销和迭代次数
考虑使用PIPELINE批量获取值减少RTT
模式匹配:
可通过MATCH参数过滤key(如user:*)
复杂场景建议结合业务前缀迅世设计key
内存警告:
大key(如超大列表)可能导致客户端内存溢出
建议分批次处理并设置超时机制
对于需要原子性操作的场景,可使用Lua脚本:
-- 获取所有key-value(小数据集)local result = {}local keys = redis.call('KEYS', '*')for i=1,#keys,1 do result[keys[i]] = redis.call('GET', keys[i])endreturn result选择依据: