Redis核心数据类型解析
Redis 是一个开源的高性能键值对(Key-Value)内存数据库,同时支持数据持久化到磁盘。它支持多种复杂数据结构,具有原子性操作、高并发、低延迟等特点,广泛应用于缓存、会话存储、消息队列、实时排行榜等场景。
1. 字符串(String)
特点:最基本的键值类型,可存储文本、数字或二进制数据,最大 512MB。
常用命令:
SET name "Alice" # 设置键值
GET name # 获取值 → "Alice"
INCR counter # 数字自增(初始为0)→ 1
DECR counter # 数字自减 → 0
APPEND name " Smith" # 追加字符串 → "Alice Smith"
Python 应用:
import redis
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)r.set('name', 'Alice')
print(r.get('name')) # 输出: Alicer.incr('counter') # 计数器自增
print(r.get('counter')) # 输出: 1
2. 列表(List)
特点:有序字符串集合,支持两端插入/删除,底层是双向链表。
常用命令:
LPUSH fruits "apple" # 左侧添加元素
RPUSH fruits "banana" # 右侧添加元素
LRANGE fruits 0 -1 # 获取所有元素 → ["apple", "banana"]
LPOP fruits # 左侧弹出元素 → "apple"
LLEN fruits # 获取长度 → 1
Python 应用:
r.lpush('fruits', 'apple')
r.rpush('fruits', 'banana', 'cherry')
print(r.lrange('fruits', 0, -1)) # 输出: ['apple', 'banana', 'cherry']
r.lpop('fruits')
print(r.llen('fruits')) # 输出: 2
3. 集合(Set)
特点:无序、唯一元素集合,支持交集、并集等运算。
常用命令:
SADD tags "python" "redis" # 添加元素
SMEMBERS tags # 获取所有元素 → ["python", "redis"]
SISMEMBER tags "java" # 判断是否存在 → 0(不存在)
SINTER set1 set2 # 求交集
SUNION set1 set2 # 求并集
Python 应用:
r.sadd('tags', 'python', 'redis', 'django')
print(r.smembers('tags')) # 输出: {'python', 'redis', 'django'}
print(r.sismember('tags', 'java')) # 输出: False
4. 有序集合(Sorted Set)
特点:类似 Set,但每个元素关联一个分数(score),可按分数排序。
常用命令:
ZADD ranking 80 "Alice" 90 "Bob" # 添加元素及分数
ZRANGE ranking 0 -1 WITHSCORES # 按分数升序排列 → ["Alice", "80", "Bob", "90"]
ZREVRANGE ranking 0 0 # 取分数最高的1个 → ["Bob"]
ZSCORE ranking "Alice" # 获取分数 → "80"
Python 应用:
r.zadd('ranking', {'Alice': 80, 'Bob': 90, 'Charlie': 85})
# 按分数升序取所有元素
print(r.zrange('ranking', 0, -1, withscores=True))
# 输出: [('Alice', 80.0), ('Charlie', 85.0), ('Bob', 90.0)]
5. 哈希(Hash)
特点:键值对的集合(类似字典),适合存储对象(如用户信息)。
常用命令:
HSET user:1 name "Alice" age "25" # 设置多个字段
HGET user:1 name # 获取字段值 → "Alice"
HGETALL user:1 # 获取所有字段 → ["name", "Alice", "age", "25"]
HDEL user:1 age # 删除字段
Python 应用:
r.hset('user:1', mapping={'name': 'Alice', 'age': '25', 'city': 'Beijing'})
print(r.hget('user:1', 'name')) # 输出: Alice
print(r.hgetall('user:1')) # 输出: {'name': 'Alice', 'age': '25', 'city': 'Beijing'}
6. 消息队列(Stream)
特点:持久化消息队列,支持消费者组、消息确认等功能。
常用命令:
XADD logs * level "error" msg "Failed" # 发送消息(* 自动生成ID)
XREAD COUNT 1 STREAMS logs 0 # 读取消息(从ID=0开始)
XGROUP CREATE logs group1 0 # 创建消费者组
XREADGROUP GROUP group1 consumer1 COUNT 1 STREAMS logs > # 消费者组读取消息
Python 应用:
# 发送消息
r.xadd('logs', {'level': 'error', 'msg': 'Failed to connect'})# 读取消息
messages = r.xread(streams={'logs': 0}, count=1)
print(messages) # 输出: [('logs', [('1694567890000-0', {'level': 'error', 'msg': 'Failed to connect'})])]
7. 地理空间(Geospatial)
特点:存储地理位置(经纬度),支持距离计算、范围查询。
常用命令:
GEOADD cities 116.40 39.90 "Beijing" # 添加地理位置(经度、纬度、名称)
GEODIST cities "Beijing" "Shanghai" km # 计算距离 → 约1318.38km
GEORADIUS cities 116.40 39.90 1000 km # 查找1000km内的城市
Python 应用:
r.geoadd('cities', (116.40, 39.90, 'Beijing'), (121.47, 31.23, 'Shanghai'))
distance = r.geodist('cities', 'Beijing', 'Shanghai', unit='km')
print(distance) # 输出: 1318.3851
8. HyperLogLog
特点:用于基数统计(不重复元素数量),占用空间极小(约12KB)。
常用命令:
PFADD unique_visitors "user1" "user2" "user3" # 添加元素
PFCOUNT unique_visitors # 统计基数 → 3
PFMERGE merged_visitors log1 log2 # 合并两个HyperLogLog
Python 应用:
r.pfadd('unique_visitors', 'user1', 'user2', 'user3', 'user1')
print(r.pfcount('unique_visitors')) # 输出: 3(去重后数量)
9. 位图(Bitmap)
特点:按位存储数据,适合记录开关状态(如用户签到、在线状态)。
常用命令:
SETBIT sign_in 0 1 # 第0天签到(1表示签到,0表示未签)
SETBIT sign_in 2 1 # 第2天签到
GETBIT sign_in 0 # 检查第0天是否签到 → 1
BITCOUNT sign_in # 统计签到总天数 → 2
Python 应用:
r.setbit('sign_in', 0, 1) # 第0天签到
r.setbit('sign_in', 2, 1) # 第2天签到
print(r.getbit('sign_in', 0)) # 输出: 1
print(r.bitcount('sign_in')) # 输出: 2
10. 位域(Bitfield)
特点:对 bitmap 进行多比特位操作,支持自定义位宽的整数读写。
常用命令:
BITFIELD stats SET u4 0 15 # 从偏移量0开始,存储4位无符号整数15(二进制1111)
BITFIELD stats GET u4 0 # 读取4位无符号整数 → 15
BITFIELD stats INCRBY i4 4 1 # 从偏移量4开始,对4位有符号整数+1
Python 应用:
r.bitfield('stats', 'SET', 'u4', 0, 15) # 存储4位无符号整数15
result = r.bitfield('stats', 'GET', 'u4', 0)
print(result) # 输出: [15]
以上是 Redis10 种核心数据类型的典型操作。实际使用中,redis-py
客户端的方法名与 Redis 命令基本一致,通过类型提示和返回值自动转换(如设置 decode_responses=True
可将字节转为字符串),大幅简化了 Python 开发。