【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'))
posted @ 2026-05-21 20:47  静心笃行。  阅读(12)  评论(0)    收藏  举报