【Redis】基本命令
1. 字符串操作
import redis
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 设置单个值
r.set('name', '张三')
r.set('age', '25')
# 获取单个值
name = r.get('name')
age = r.get('age')
print(f"姓名: {name}, 年龄: {age}")
# 设置多个值
r.mset({'city': '北京', 'job': '工程师'})
# 获取多个值
values = r.mget(['name', 'age', 'city', 'job'])
print("多个值:", values)
# 设置值并设置过期时间(单位:秒)
r.setex('temp_data', 60, '临时数据') # 60秒后自动删除
2. 数值操作
import redis
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 设置初始值
r.set('counter', '0')
# 自增操作
r.incr('counter') # +1
print("自增后:", r.get('counter'))
r.incrby('counter', 5) # +5
print("增加5后:", r.get('counter'))
# 自减操作
r.decr('counter') # -1
print("自减后:", r.get('counter'))
r.decrby('counter', 3) # -3
print("减少3后:", r.get('counter'))
3. 哈希操作
- field-value 键值对;数据结构如下:
key = user:1001
field: name → 张三
field: age → 25
field: sex → 男
-
底层编码:
-
ziplist 压缩列表(默认)
- 条件:field 数量 < 512 且 所有field / value 长度都小于64字节
- 特点:省内存、紧凑、读写快。
-
【注意】hashtable 字典结构
- 超出上面任意一个条件,自动转换成hashtable
- 特点:查询快,内存占用更高。
- 查询编码命令:object encoding key名
-
-
业务场景
- 存储对象实体:用户、商品、订单信息
- 代替多个 String,减少 key 数量,更整洁
- 局部更新字段,不用改整条数据
-
缺点:
HGETALL一次性查所有字段,字段多就是 BigKey- 大量 field 极易造成慢查询、阻塞主线程
- 字段过多建议拆分 Hash
import redis
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 设置哈希字段
r.hset('user:1001', 'name', '李四')
r.hset('user:1001', 'age', '30')
r.hset('user:1001', 'city', '上海')
# 获取单个字段
name = r.hget('user:1001', 'name')
print(f"用户名: {name}")
# 获取所有字段
user_info = r.hgetall('user:1001')
print("用户信息:", user_info)
# 设置多个字段
r.hmset('user:1002', {
'name': '王五',
'age': '28',
'city': '广州'
})
# 获取多个字段
fields = r.hmget('user:1002', ['name', 'age'])
print("指定字段:", fields)
# 获取所有字段名
field_names = r.hkeys('user:1001')
print("字段名:", field_names)
# 获取所有字段值
field_values = r.hvals('user:1001')
print("字段值:", field_values)
# 删除字段
r.hdel('user:1001', 'city')
print("删除后:", r.hgetall('user:1001'))
4. 列表操作
import redis
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 从左侧添加元素
r.lpush('tasks', 'task1', 'task2', 'task3')
# 从右侧添加元素
r.rpush('tasks', 'task4', 'task5')
# 获取列表长度
length = r.llen('tasks')
print(f"列表长度: {length}")
# 获取列表元素
all_tasks = r.lrange('tasks', 0, -1)
print("所有任务:", all_tasks)
# 获取指定范围的元素
first_three = r.lrange('tasks', 0, 2)
print("前三个任务:", first_three)
# 从左侧弹出元素
left_task = r.lpop('tasks')
print(f"左侧弹出: {left_task}")
# 从右侧弹出元素
right_task = r.rpop('tasks')
print(f"右侧弹出: {right_task}")
print("剩余任务:", r.lrange('tasks', 0, -1))
5. 集合(Set)操作
import redis
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 添加元素
r.sadd('tags', 'python', 'redis', 'database', 'cache')
# 获取所有元素
all_tags = r.smembers('tags')
print("所有标签:", all_tags)
# 判断元素是否存在
is_member = r.sismember('tags', 'python')
print("python是否存在:", is_member)
# 获取集合元素数量
tag_count = r.scard('tags')
print(f"标签数量: {tag_count}")
# 随机弹出一个元素
random_tag = r.spop('tags')
print(f"随机弹出: {random_tag}")
# 移除指定元素
r.srem('tags', 'database')
print("移除后:", r.smembers('tags'))
# 集合运算
r.sadd('set1', 'a', 'b', 'c')
r.sadd('set2', 'b', 'c', 'd')
# 交集
intersection = r.sinter('set1', 'set2')
print("交集:", intersection)
# 并集
union = r.sunion('set1', 'set2')
print("并集:", union)
# 差集
difference = r.sdiff('set1', 'set2')
print("差集:", difference)
6. 有序集合(Sorted Set)操作
import redis
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 添加带分数的元素
r.zadd('leaderboard', {
'player1': 1000,
'player2': 1500,
'player3': 800,
'player4': 2000
})
# 按分数升序获取
asc_players = r.zrange('leaderboard', 0, -1, withscores=True)
print("升序排名:", asc_players)
# 按分数降序获取
desc_players = r.zrevrange('leaderboard', 0, -1, withscores=True)
print("降序排名:", desc_players)
# 获取元素分数
score = r.zscore('leaderboard', 'player2')
print(f"player2的分数: {score}")
# 增加元素分数
r.zincrby('leaderboard', 500, 'player1')
print("增加后player1分数:", r.zscore('leaderboard', 'player1'))
# 获取排名
rank = r.zrevrank('leaderboard', 'player4') # 从0开始的排名
print(f"player4的排名: {rank + 1}") # 转换为从1开始的排名
# 按分数范围获取
high_scores = r.zrangebyscore('leaderboard', 1000, 3000, withscores=True)
print("高分玩家:", high_scores)
7. 键操作和过期时间
import redis
import time
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 设置键值对
r.set('session:user123', 'user_data')
# 检查键是否存在
exists = r.exists('session:user123')
print("键是否存在:", exists)
# 设置过期时间(秒)
r.expire('session:user123', 300) # 5分钟后过期
# 获取剩余生存时间
ttl = r.ttl('session:user123')
print(f"剩余生存时间: {ttl}秒")
# 设置键值对并指定过期时间
r.setex('temp:code', 60, '123456') # 60秒后过期
# 移除过期时间,使键永久存在
r.persist('session:user123')
# 查找匹配模式的键
all_keys = r.keys('*')
print("所有键:", all_keys)
session_keys = r.keys('session:*')
print("会话键:", session_keys)
# 删除键
r.delete('session:user123')
print("删除后是否存在:", r.exists('session:user123'))

浙公网安备 33010602011771号