Redis - 基本使用

Python 客户端安装

pip install redis

存储简单键值对数据 - strings 类型

  • 应用场景

    • 缓存: 如缓存关系数据库中的查询结果, 依此来避免重复查询

    • 简单分布式锁: SETNX (set if not exist), 这条命令是原子操作, 成功返回 1, 否则返回 0, 因此可以实现简单分布式锁

    • 简单计数器: INCR, INCRBY 可以对数值进行操作

    • 设置set 获取 get

      # 设置一个key
      r.set("test_key", "test_value")
      
      # 获取
      r.get("test_key")
      # >>> test_value
      
    • 设置过期时间 expire

      r.expire("test_key", 1) # 单位 秒
      
    • 数值操作 incrby

      r.set("num", 3)
      r.incrby(name="num", amount=3)
      # >>> 6
      

存储哈希表数据 - hashs 类型

  • 应用场景

    • 存储一些绑定在一起的数据, 如用户信息

      这个数据类型类似 python 中的 dict类似, 但不能像python那样可以嵌套多层, 只能有 1 层,
      而且每次操作都需要显式通过哈希表的名字来进行

    • 写入 hset 读取所有 hgetall

      # 写入整个 哈希表
      r.hset('user-session:123', mapping={
          'name': "walker",
          "surname": 'Smith',
          "company": 'Redis',
          "age": 29
      })
      
      # 读取整个 哈希表 O(n)
      r.hgetall("user-session:123")
      # >>> {'age': '29', 'company': 'Redis', 'name': 'walker', 'surname': 'Smith'}
      
    • 读取单个属性 hget, 设置属性 hset

      # 读取
      r.hget("user-session:123", "name")
      # >>> walker
      
      # 设置单个也是 hset
       r.hset('user-session:123', mapping={
          "name": "walker3"
      })
      
    • 对 哈希表 中某个属性做数值操作 hincrby

      r.hincrby("user-session:123", key="age", amount=2)
      # >>> 31 返回操作后的值
      r.hincrby("user-session:123", key="age", amount=-3)
      # >>> 28
      
    • 列举出 哈希表 中的所有的 key 或者 value hkeys

      r.hkeys('user-session:123')
      # >>> ['name', 'surname', 'company', 'age']
      r.hvals('user-session:123')
      # >>> ['walker3', 'Smith', 'Redis', '29']
      

存储队列数据 - list 类型

  • 应用场景

    • 简单消息队列: redis 中 list 数据类型是通过 双向链表 实现的, 因此其支持并提供了一套操作方法 如 头插, 尾插, 头出, 尾出 的方法, 可以支持 消息队列 的实现

    • 最新记录实现: 可以通过 LTRIM 来修剪 list 的长度, 以此最新的记录

    • 浏览足迹(事件/活动追踪): 借助其有序性, 可以将某用户的一系列操作活动/事件都记录其中

  • 头插lpush 尾插rpush 头出lpop 尾出rpop 查看 lrange

    # 头插
    r.lpush("test_list0", 0)
    # >>> 1  返回目前 list 长度
    
    # 尾插
    r.rpush("test_list0", 1)
    # >>> 2
    
    # 从头至尾查看数据
    r.lrange("test_list0", 0, -1)
    # >>> ['0', '1']
    
    # 头出
    r.lpop("test_list0")
    # >>> '0'  返回 pop 的数据
    
    # 尾出
    r.rpop("test_list0")
    # >>> '1'
    
    # 查看
    r.lrange("test_list", 0, -1)
    # >>> []
    
  • 修剪 list 长度 ltrim

    # 头插入 5 个数据
    for i in range(5):
        r.lpush("test_list1", i + 1)
    
    # 查看
    r.lrange("test_list1", 0, -1)
    # >>> ['5', '4', '3', '2', '1']
    
    # 修建 list 大小 , 保留最新的 3 个, 由于我们是头插, 因此, index 设置 0 至 2
    r.ltrim("test_list1", 0, 2)
    # >>> True
    
    # 查看
    r.lrange("test_list1", 0, -1)
    # >>> ['5', '4', '3']
    
  • 查看 list 长度 llen

    r.llen("test_list1")
    
  • 阻塞方式获取list 数据 blpop brpop

    其中 bblocking 的意思, 如果队列为空, 那么这两条命名会一直阻塞, 除非指定了 timeout

    # test_list2 不存在
    r.blpop("test_list2", timeout=1)
    # >> 1 秒后, 返回 None
    

存储需要去重的数据 - Set 类型

这个一个是无序且不重复的数据结构类型, 可以在有去重需要的场景中使用, 如 所有在线用户, 所有投票用户 这样的

  • 添加sadd 查看数量scard 查看成员smembers

    SET_KEY = "test_set:online_users"
    
    # 添加 一个成员
    r.sadd(SET_KEY, "user1")
    
    # 添加多个成员
    r.sadd(SET_KEY, "user1", "user2", "user3")
    
    # 查看成员数量
    r.scard(SET_KEY)
    # >>> 2
    
    # 查看所有成员
    r.smembers(SET_KEY)
    # >>> {'user3', 'user2', 'user1'}
    
  • 检查成员是否在 sismember 移除成员 srem

    # 检查成员是否在集合中
    r.sismember(SET_KEY, "user2")
    # >>> 1 在则返回 1, 否则返回 0
    
    # 移除一个/多个成员
    r.srem(SET_KEY, "user1", "user2")
    
    # 查看
    r.smembers(SET_KEY)
    # >>> {'user3'}
    

存储有序去重数据 - Sorted Set 类型

这个类型相比 Set, 不一样的是, 每个元素都都一个权重分数 属性, 因此可以实现有序

  • 应用场景

    适用于很多需要权重排名的场景, 如排行榜, 用户兴趣权重排行 之类的

  • 添加 zadd 查看 zrange

    
    # 往有序集合中加入 5 个用户 以及他们的 权重
    r.zadd(name="test_sorted_set", mapping={
        "user1": 20,
        "user2": 60,
        "user3": 30,
        "user4": 70,
        "user5": 500,
    })
    
    # 升序查看集合, 带权重分数
    r.zrange("test_sorted_set", 0, -1, withscores=True)
    # >>> [('user1', 20.0), ('user3', 30.0), ('user2', 60.0), ('user4', 70.0), ('user5', 500.0)]
    
    # 降序查看集合,
    r.zrange("test_sorted_set", 0, -1, withscores=True, desc=True)
    # >>> [('user5', 500.0), ('user4', 70.0), ('user2', 60.0), ('user3', 30.0), ('user1', 20.0)]
    
    
  • 增加用户权重 zincrby 获取用户权重 zscore

    # 增加用户 "user3" 的权重, +50
    r.zincrby("test_sorted_set", amount=50, value="user3")
    
    # 获取用户 user3 的权重
    r.zscore("test_sorted_set", "user3")
    
  • 查看用户排名 zrank 删除用户 zrem

    # 查询用户的排名
    r.zrank("test_sorted_set", "user3")
    # >>> 3
    
    # 删除一个用户
    r.zrem("test_sorted_set", "user3")
    
  • 查询指定范围内的用户 zrangebyscore

    # 查询分数范围在 负无穷 至 70 的用户
    r.zrangebyscore("test_sorted_set", "-inf", 70, withscores=True)
    # >>> [('user1', 20.0), ('user2', 60.0), ('user4', 70.0)]