Redis(四) - 使用Python操作Redis详解

news2025/5/30 14:49:21

文章目录

  • 前言
  • 一、下载Python插件
  • 二、创建项目
  • 三、安装 redis 库
  • 四、新建python软件包
  • 五、键操作
  • 六、字符串操作
  • 七、列表操作
  • 八、集合操作
  • 九、哈希表操作
  • 十、有序集合操作
  • 十一、完整代码
    • 1. 完整代码
    • 2. 项目下载


前言

本文是基于 Python 操作 Redis 数据库的实战指南,旨在通过分步教程与代码示例,帮助开发者掌握 Redis 常见数据类型(字符串、列表、集合、哈希表、有序集合)的操作方法。内容覆盖开发环境搭建、库安装、项目结构创建及核心功能代码实现,适合 Python 初学者及 Redis 入门开发者参考。


一、下载Python插件

打开设置菜单:首先,点击左上角的“文件”菜单,然后选择“设置”选项。这将打开一个新窗口,显示各种设置选项。
进入插件管理:在设置窗口左侧的导航栏中,找到并点击“插件”选项。这将带你进入插件管理页面。
搜索Python插件:在插件管理页面顶部的搜索框中输入“python”,然后按回车键进行搜索。这将列出与Python相关的所有插件。
选择Python插件:从搜索结果中找到名为“Python”的插件,并点击它。确保该插件旁边的复选框被勾选,表示已启用。
应用更改:完成上述步骤后,点击右下角的“应用(A)”按钮,然后点击“确定”按钮以保存更改并关闭设置窗口。

具体步骤如下图所示:

在这里插入图片描述


二、创建项目

项目创建是 Python 开发的起始点,规范且合理地创建项目有助于组织代码结构、管理项目资源。在开发与 Redis 交互的 Python 项目时,明确项目名称、路径以及选择合适的环境类型,如 Virtualenv 虚拟环境,能有效隔离项目依赖,避免不同项目间的依赖冲突,为项目开发营造稳定的运行环境。下面详细介绍创建 Python 项目的具体流程。

点击“文件”菜单–>选择“新建(N)”–>点击“项目…”–>选择“Python”项目类型–>输入项目名称和路径–>选择环境类型为“Virtualenv”–>指定虚拟环境路径–>选择基础解释器版本–>点击“创建©”按钮。

具体步骤如下图所示:

在这里插入图片描述


三、安装 redis 库

Redis 库是 Python 与 Redis 数据库交互的桥梁。通过终端执行 pip install redis 命令(推荐使用阿里云镜像源加速下载),可快速安装官方提供的 Redis 客户端库。安装完成后,需验证库是否导入成功(如在 Python 中执行 import redis 无报错),确保后续代码能够调用 Redis 相关接口。

打开终端,执行如下命令安装redis库。

pip install redis -i https://mirrors.aliyun.com/pypi/simple/

具体步骤如下图所示:

在这里插入图片描述


四、新建python软件包

在 Python 项目中,软件包用于组织相关的模块,有助于构建清晰的代码结构,提高代码的可维护性与复用性。当项目涉及复杂的功能模块时,合理创建软件包能够更好地管理代码逻辑。以下介绍在项目中新建 Python 软件包的操作方法。

在项目视图中找到并点击项目名称–>右键点击项目名称–>选择“新建(N)”–>选择“Python 软件包”–>输入软件包名称–>点击“确定”按钮。

具体步骤如下图所示:

在这里插入图片描述

创建完成如下图所示:

在这里插入图片描述


五、键操作

键操作是 Redis 数据管理的基础,涉及键的创建、查询、修改与删除。核心方法包括:

  • SET/MSET:设置单个或多个键值对;
  • KEYS:按模式匹配查询键(如 k* 匹配以 k 开头的键);
  • EXPIRE/TTL:设置键的生存时间及查询剩余存活时间;
  • RENAME:重命名键;
  • DELETE:删除单个或多个键。

通过这些操作,可高效管理 Redis 中的数据生命周期。

def key_operation():
    print("===========键操作===========")
    # 示例:给school键设置值为dy。
    set_result = r.set("school", "dy")
    print(set_result)
    print("===============")
    # 示例:给k1键设置值为v1,k2键设置值为v2,k3键设置值为v3。
    set_result1 = r.mset({"k1": "v1", "k2": "v2", "k3": "v3"})
    print(set_result1)
    print("===============")
    # 示例1:查看所有键。
    keys = r.keys("*")
    for key in keys:
        print(key.decode())
    print("===============")
    # 示例2:查看所有以k开头的键。
    keys1 = r.keys("k*")
    for key in keys1:
        print(key.decode())
    print("===============")
    # 示例:查看scool键的值。
    school = r.get("school")
    print(school.decode() if school else None)
    print("===============")
    # 示例:查看k1、k2、k3键的值。
    mget = r.mget("k1", "k2", "k3")
    for s in mget:
        print(s.decode() if s else None)
    print("===============")
    # 示例:查看k1键的值的序列化版本。
    k1s = r.dump("k1")
    print(k1s)
    print("===============")
    # 示例1:查看school键是否存在。
    exists = r.exists("school")
    print(exists)
    # print(bool(exists))
    print("===============")
    # 示例2:查看k1、k2、k3、k4、k5键是否存在。
    exists1 = r.exists("k1", "k2", "k3", "k4", "k5")
    print(exists1)
    print("===============")
    # 示例:查看school键的值的类型。
    type_ = r.type("school").decode()
    print(type_)
    print("===============")
    # 示例:把school键重命名为new_school键。
    rename = r.rename("school", "new_school")
    print(rename)
    print("===============")
    # 示例:把k3键的生存时间设置为600秒。
    expire = r.expire("k3", 600)
    print(expire)
    print("===============")
    # 示例:查看k3键的剩余存活时间。
    ttl = r.ttl("k3")
    print(ttl)
    print("===============")
    # 示例:删除k3键的存活时间。
    persist = r.persist("k3")
    print(persist)
    print("===============")
    # 示例1:删除new_school键。
    del_ = r.delete("new_school")
    print(del_)
    print("===============")
    # 示例2:删除k1、k2、k3键。
    del1 = r.delete("k1", "k2", "k3")
    print(del1)
    print("===============")

六、字符串操作

字符串是 Redis 最基础的数据类型,支持原子性操作。核心方法包括:

  • GET/MGET:获取单个或多个字符串值;
  • GETSET:先获取旧值再设置新值;
  • STRLEN:获取字符串长度;
  • SETRANGE:按索引替换字符串内容;
  • APPEND:向字符串末尾追加内容。

这些操作适用于缓存简单数据(如用户信息、配置项)场景。

def string_operation():
    print("===========字符串操作===========")
    # 示例:给字符串键str1设置值为value1。
    set_result = r.set("str1", "value1")
    print(set_result)
    print("===============")
    # 示例:给字符串键str2、str3、str4分别设置值为value2、value3、value4。
    mset_result = r.mset({"str2": "value2", "str3": "value3", "str4": "value4"})
    print(mset_result)
    print("===============")
    # 示例:获取字符串键str1的值。
    str1 = r.get("str1")
    print(str1.decode() if str1 else None)
    print("===============")
    # 示例:获取字符串键str2、str3、str4的值。
    mget = r.mget("str2", "str3", "str4")
    for s in mget:
        print(s.decode() if s else None)
    print("===============")
    # 示例:获取字符串键str1的旧值,并设置新值为new_value1。
    get_set = r.getset("str1", "new_value1")
    print(get_set.decode() if get_set else None)
    # 查看设置后的新值。
    str11 = r.get("str1")
    print(str11.decode() if str11 else None)
    print("===============")
    # 示例:获取字符串键str1的值的长度。
    strlen = r.strlen("str1")
    print(strlen)
    print("===============")
    # 示例:获取字符串键str1的索引0-5的值的内容。
    getrange = r.getrange("str1", 0, 5)
    print(getrange.decode() if getrange else None)
    print("===============")
    # 示例:把字符串键str1从索引2开始的后面三个字母的内容替换为aaa。
    setrange = r.setrange("str1", 2, "aaa")
    print(setrange)
    # 查看设置后的新值。
    str12 = r.get("str1")
    print(str12.decode() if str12 else None)
    print("===============")
    # 示例:向字符串键str1的结尾追加内容bbb。
    append = r.append("str1", "bbb")
    print(append)
    # 查看设置后的新值。
    str13 = r.get("str1")
    print(str13.decode() if str13 else None)

七、列表操作

列表(List)是 Redis 中有序、可重复的链表结构,支持两端插入与删除。核心方法包括:

  • LPUSH/RPUSH:左 / 右端插入元素;
  • LRANGE:按索引范围获取列表元素(如 0 -1 表示所有元素);
  • LPOP/RPOP:左 / 右端弹出并删除元素;
  • LREM:按条件删除元素(如删除指定数量或方向的元素)。

列表适用于队列、栈、历史记录等有序数据场景。

def list_operation():
    print("===========列表操作===========")
    # 示例:在列表右端向列表color中添加多个值。
    rpush = r.rpush("color", "blue", "green", "purple", "red", "white")
    print(rpush)
    print("===============")
    # 示例:在列表左端向列表color中添加多个值。
    lpush = r.lpush("color", "blue2", "green2", "purple2", "red2", "white2")
    print(lpush)
    print("===============")
    # 示例1:获取列表color中索引0-5的元素。
    color = r.lrange("color", 0, 5)
    for s in color:
        print(s.decode())
    print("===============")
    # 示例2:获取列表color中的所有元素。
    color1 = r.lrange("color", 0, -1)
    for s in color1:
        print(s.decode())
    print("===============")
    # 示例:获取列表color中索引为2的元素。
    color2 = r.lindex("color", 2)
    print(color2.decode() if color2 else None)
    print("===============")
    # 示例:移除并获取列表color中的最后一个(最右端)元素。
    rpop = r.rpop("color")
    print(rpop.decode() if rpop else None)
    print("===============")
    # 示例:移除并获取列表color中的第一个(最左端)元素。
    lpop = r.lpop("color")
    print(lpop.decode() if lpop else None)
    print("===============")
    # 示例:获取列表color的长度。
    llen = r.llen("color")
    print(llen)
    print("===============")
    # 示例1:从列表开头开始搜索移除列表color中1个red元素。
    lrem = r.lrem("color", 1, "red")
    print(lrem)
    print("===============")
    # 示例2:从列表结尾开始搜索移除列表color中3个blue元素。
    lrem1 = r.lrem("color", -3, "blue")
    print(lrem1)
    print("===============")
    # 示例3:移除列表color中所有blue2元素。
    lrem2 = r.lrem("color", 0, "blue2")
    print(lrem2)
    print("===============")

八、集合操作

集合(Set)是 Redis 中无序、唯一的元素集合,支持交集、并集、差集运算。关键操作包括:

  • SADD:添加成员(自动去重);
  • SMEMBERS:获取所有成员;
  • SISMEMBER:判断成员是否存在;
  • SMOVE:移动成员至其他集合。

集合常用于标签管理、用户去重、交集查询(如共同好友)等场景。

def set_operation():
    print("===========集合操作===========")
    # 示例:给集合键set1添加多个成员。
    sadd = r.sadd("set1", "mem1", "mem2", "mem3")
    print(sadd)
    print("===============")
    # 示例:查看集合键set1中成员的数量。
    scard = r.scard("set1")
    print(scard)
    print("===============")
    # 示例:查看集合键set1中的所有成员。
    set1 = r.smembers("set1")
    for s in set1:
        print(s.decode())
    print("===============")
    # 示例:检查成员mem1是否在集合set1中。
    sismember = r.sismember("set1", "mem1")
    print(sismember)
    print("===============")
    # 示例:移除集合set1中成员mem3。
    srem = r.srem("set1", "mem3")
    print(srem)
    print("===============")
    # 示例:把集合set1中成员mem2移动到集合set2中。
    smove = r.smove("set1", "set2", "mem2")
    print(smove)
    print("===============")

九、哈希表操作

哈希表(Hash)用于存储键值对的集合,适合存储结构化数据(如用户详情)。核心方法包括:

  • HSET:设置单个字段值或批量设置(通过 mapping 参数);
  • HGET/HMGET:获取单个或多个字段值;
  • HGETALL:获取所有字段和值;
  • HDEL:删除指定字段。

哈希表可减少键的数量,提升数据读写效率,适用于存储对象属性场景。

def hash_operation():
    print("===========哈希表操作===========")
    # 示例:给哈希表student添加一个学生信息。
    hset = r.hset("student:1", "name", "zhangsan")
    print(hset)
    hset1 = r.hset("student:1", "age", "19")
    print(hset1)
    hset2 = r.hset("student:1", "address", "yunnan")
    print(hset2)
    print("===============")
    # 示例:给哈希表student添加一个学生信息。
    # 修复:使用 hset 替代 hmset,传入映射字典
    hmset = r.hset("student:2", mapping={"name": "lisi", "age": "20", "address": "guizhou"})
    print(hmset)
    print("===============")
    # 示例:获取hash键student:2中name字段的值。
    hget = r.hget("student:2", "name")
    print(hget.decode() if hget else None)
    print("===============")
    # 示例:获取hash键student:2中name、age和address字段的值。
    hget1 = r.hmget("student:2", ["name", "age", "address"])
    for s in hget1:
        print(s.decode() if s else None)
    print("===============")
    # 示例:获取hash键student:2中的所有字段和值。
    student2 = r.hgetall("student:2")
    for key, value in student2.items():
        print(f"{key.decode()}: {value.decode()}")
    print("===============")
    # 示例:获取hash键student:2中的所有字段。
    hkeys = r.hkeys("student:2")
    for s in hkeys:
        print(s.decode())
    print("===============")
    # 示例:获取hash键student:2中的所有值。
    hvals = r.hvals("student:2")
    for s in hvals:
        print(s.decode())
    print("===============")
    # 示例:删除hash键student:2中的age和address字段。
    hdel = r.hdel("student:2", "age", "address")
    print(hdel)
    print("===============")

十、有序集合操作

有序集合(Sorted Set)通过分数(Score)实现元素的有序排列,支持按分数或索引范围查询。核心方法包括:

  • ZADD:添加成员与分数;
  • ZCOUNT:统计指定分数范围内的成员数量;
  • ZRANGE:按索引范围获取成员(默认按分数升序);
  • ZSCORE:获取成员的分数。

有序集合适用于排行榜、实时数据排序(如点赞数、访问量)等场景。

def order_set_operation():
    print("===========有序集合操作===========")
    # 示例:给有序集合salary添加多个分数和成员。
    zadd = r.zadd("salary", {"zhangsan": 5000, "lisi": 4500, "wangwu": 6000})
    print(zadd)
    print("===============")
    # 示例:获取有序集合salary中的成员数量。
    zcard = r.zcard("salary")
    print(zcard)
    print("===============")
    # 示例:计算有序集合中分数在5000-6500之间的成员数量。
    zcount = r.zcount("salary", 5000, 6500)
    print(zcount)
    print("===============")
    # 示例:根据索引范围获取有序集合salary中的成员。
    salary = r.zrange("salary", 0, 1)
    for s in salary:
        print(s.decode())
    print("===============")
    # 示例:获取有序集合salary中成员wangwu的分数。
    zscore = r.zscore("salary", "wangwu")
    print(zscore)
    print("===============")
    # 示例:移除有序集合salary中成员wangwu。
    zrem = r.zrem("salary", "wangwu")
    print(zrem)
    print("===============")

十一、完整代码

本章提供完整的 Python 代码示例,整合前文各模块功能。代码通过 redis.Redis 类连接本地 Redis 服务(默认端口 6379,数据库 1),包含以下核心逻辑:

  • flush_db():清空数据库,确保测试环境干净;
  • 各数据类型操作函数(如 key_operation()、string_operation()):封装具体功能逻辑;
  • __main__ 入口:按顺序调用各操作函数,实现完整的 Redis 交互流程。
    运行前需确保 Redis 服务已启动,且代码中的连接参数与实际环境一致。

1. 完整代码

import redis

# 连接到本地 Redis 服务
r = redis.Redis(host='127.0.0.1', port=6379, db=1)


def flush_db():
    # 清空数据库
    r.flushdb()


def key_operation():
    print("===========键操作===========")
    # 示例:给school键设置值为dy。
    set_result = r.set("school", "dy")
    print(set_result)
    print("===============")
    # 示例:给k1键设置值为v1,k2键设置值为v2,k3键设置值为v3。
    set_result1 = r.mset({"k1": "v1", "k2": "v2", "k3": "v3"})
    print(set_result1)
    print("===============")
    # 示例1:查看所有键。
    keys = r.keys("*")
    for key in keys:
        print(key.decode())
    print("===============")
    # 示例2:查看所有以k开头的键。
    keys1 = r.keys("k*")
    for key in keys1:
        print(key.decode())
    print("===============")
    # 示例:查看scool键的值。
    school = r.get("school")
    print(school.decode() if school else None)
    print("===============")
    # 示例:查看k1、k2、k3键的值。
    mget = r.mget("k1", "k2", "k3")
    for s in mget:
        print(s.decode() if s else None)
    print("===============")
    # 示例:查看k1键的值的序列化版本。
    k1s = r.dump("k1")
    print(k1s)
    print("===============")
    # 示例1:查看school键是否存在。
    exists = r.exists("school")
    print(exists)
    # print(bool(exists))
    print("===============")
    # 示例2:查看k1、k2、k3、k4、k5键是否存在。
    exists1 = r.exists("k1", "k2", "k3", "k4", "k5")
    print(exists1)
    print("===============")
    # 示例:查看school键的值的类型。
    type_ = r.type("school").decode()
    print(type_)
    print("===============")
    # 示例:把school键重命名为new_school键。
    rename = r.rename("school", "new_school")
    print(rename)
    print("===============")
    # 示例:把k3键的生存时间设置为600秒。
    expire = r.expire("k3", 600)
    print(expire)
    print("===============")
    # 示例:查看k3键的剩余存活时间。
    ttl = r.ttl("k3")
    print(ttl)
    print("===============")
    # 示例:删除k3键的存活时间。
    persist = r.persist("k3")
    print(persist)
    print("===============")
    # 示例1:删除new_school键。
    del_ = r.delete("new_school")
    print(del_)
    print("===============")
    # 示例2:删除k1、k2、k3键。
    del1 = r.delete("k1", "k2", "k3")
    print(del1)
    print("===============")


def string_operation():
    print("===========字符串操作===========")
    # 示例:给字符串键str1设置值为value1。
    set_result = r.set("str1", "value1")
    print(set_result)
    print("===============")
    # 示例:给字符串键str2、str3、str4分别设置值为value2、value3、value4。
    mset_result = r.mset({"str2": "value2", "str3": "value3", "str4": "value4"})
    print(mset_result)
    print("===============")
    # 示例:获取字符串键str1的值。
    str1 = r.get("str1")
    print(str1.decode() if str1 else None)
    print("===============")
    # 示例:获取字符串键str2、str3、str4的值。
    mget = r.mget("str2", "str3", "str4")
    for s in mget:
        print(s.decode() if s else None)
    print("===============")
    # 示例:获取字符串键str1的旧值,并设置新值为new_value1。
    get_set = r.getset("str1", "new_value1")
    print(get_set.decode() if get_set else None)
    # 查看设置后的新值。
    str11 = r.get("str1")
    print(str11.decode() if str11 else None)
    print("===============")
    # 示例:获取字符串键str1的值的长度。
    strlen = r.strlen("str1")
    print(strlen)
    print("===============")
    # 示例:获取字符串键str1的索引0-5的值的内容。
    getrange = r.getrange("str1", 0, 5)
    print(getrange.decode() if getrange else None)
    print("===============")
    # 示例:把字符串键str1从索引2开始的后面三个字母的内容替换为aaa。
    setrange = r.setrange("str1", 2, "aaa")
    print(setrange)
    # 查看设置后的新值。
    str12 = r.get("str1")
    print(str12.decode() if str12 else None)
    print("===============")
    # 示例:向字符串键str1的结尾追加内容bbb。
    append = r.append("str1", "bbb")
    print(append)
    # 查看设置后的新值。
    str13 = r.get("str1")
    print(str13.decode() if str13 else None)


def list_operation():
    print("===========列表操作===========")
    # 示例:在列表右端向列表color中添加多个值。
    rpush = r.rpush("color", "blue", "green", "purple", "red", "white")
    print(rpush)
    print("===============")
    # 示例:在列表左端向列表color中添加多个值。
    lpush = r.lpush("color", "blue2", "green2", "purple2", "red2", "white2")
    print(lpush)
    print("===============")
    # 示例1:获取列表color中索引0-5的元素。
    color = r.lrange("color", 0, 5)
    for s in color:
        print(s.decode())
    print("===============")
    # 示例2:获取列表color中的所有元素。
    color1 = r.lrange("color", 0, -1)
    for s in color1:
        print(s.decode())
    print("===============")
    # 示例:获取列表color中索引为2的元素。
    color2 = r.lindex("color", 2)
    print(color2.decode() if color2 else None)
    print("===============")
    # 示例:移除并获取列表color中的最后一个(最右端)元素。
    rpop = r.rpop("color")
    print(rpop.decode() if rpop else None)
    print("===============")
    # 示例:移除并获取列表color中的第一个(最左端)元素。
    lpop = r.lpop("color")
    print(lpop.decode() if lpop else None)
    print("===============")
    # 示例:获取列表color的长度。
    llen = r.llen("color")
    print(llen)
    print("===============")
    # 示例1:从列表开头开始搜索移除列表color中1个red元素。
    lrem = r.lrem("color", 1, "red")
    print(lrem)
    print("===============")
    # 示例2:从列表结尾开始搜索移除列表color中3个blue元素。
    lrem1 = r.lrem("color", -3, "blue")
    print(lrem1)
    print("===============")
    # 示例3:移除列表color中所有blue2元素。
    lrem2 = r.lrem("color", 0, "blue2")
    print(lrem2)
    print("===============")


def set_operation():
    print("===========集合操作===========")
    # 示例:给集合键set1添加多个成员。
    sadd = r.sadd("set1", "mem1", "mem2", "mem3")
    print(sadd)
    print("===============")
    # 示例:查看集合键set1中成员的数量。
    scard = r.scard("set1")
    print(scard)
    print("===============")
    # 示例:查看集合键set1中的所有成员。
    set1 = r.smembers("set1")
    for s in set1:
        print(s.decode())
    print("===============")
    # 示例:检查成员mem1是否在集合set1中。
    sismember = r.sismember("set1", "mem1")
    print(sismember)
    print("===============")
    # 示例:移除集合set1中成员mem3。
    srem = r.srem("set1", "mem3")
    print(srem)
    print("===============")
    # 示例:把集合set1中成员mem2移动到集合set2中。
    smove = r.smove("set1", "set2", "mem2")
    print(smove)
    print("===============")


def hash_operation():
    print("===========哈希表操作===========")
    # 示例:给哈希表student添加一个学生信息。
    hset = r.hset("student:1", "name", "zhangsan")
    print(hset)
    hset1 = r.hset("student:1", "age", "19")
    print(hset1)
    hset2 = r.hset("student:1", "address", "yunnan")
    print(hset2)
    print("===============")
    # 示例:给哈希表student添加一个学生信息。
    # 修复:使用 hset 替代 hmset,传入映射字典
    hmset = r.hset("student:2", mapping={"name": "lisi", "age": "20", "address": "guizhou"})
    print(hmset)
    print("===============")
    # 示例:获取hash键student:2中name字段的值。
    hget = r.hget("student:2", "name")
    print(hget.decode() if hget else None)
    print("===============")
    # 示例:获取hash键student:2中name、age和address字段的值。
    hget1 = r.hmget("student:2", ["name", "age", "address"])
    for s in hget1:
        print(s.decode() if s else None)
    print("===============")
    # 示例:获取hash键student:2中的所有字段和值。
    student2 = r.hgetall("student:2")
    for key, value in student2.items():
        print(f"{key.decode()}: {value.decode()}")
    print("===============")
    # 示例:获取hash键student:2中的所有字段。
    hkeys = r.hkeys("student:2")
    for s in hkeys:
        print(s.decode())
    print("===============")
    # 示例:获取hash键student:2中的所有值。
    hvals = r.hvals("student:2")
    for s in hvals:
        print(s.decode())
    print("===============")
    # 示例:删除hash键student:2中的age和address字段。
    hdel = r.hdel("student:2", "age", "address")
    print(hdel)
    print("===============")


def order_set_operation():
    print("===========有序集合操作===========")
    # 示例:给有序集合salary添加多个分数和成员。
    zadd = r.zadd("salary", {"zhangsan": 5000, "lisi": 4500, "wangwu": 6000})
    print(zadd)
    print("===============")
    # 示例:获取有序集合salary中的成员数量。
    zcard = r.zcard("salary")
    print(zcard)
    print("===============")
    # 示例:计算有序集合中分数在5000-6500之间的成员数量。
    zcount = r.zcount("salary", 5000, 6500)
    print(zcount)
    print("===============")
    # 示例:根据索引范围获取有序集合salary中的成员。
    salary = r.zrange("salary", 0, 1)
    for s in salary:
        print(s.decode())
    print("===============")
    # 示例:获取有序集合salary中成员wangwu的分数。
    zscore = r.zscore("salary", "wangwu")
    print(zscore)
    print("===============")
    # 示例:移除有序集合salary中成员wangwu。
    zrem = r.zrem("salary", "wangwu")
    print(zrem)
    print("===============")


if __name__ == "__main__":
    flush_db()
    key_operation()
    string_operation()
    list_operation()
    set_operation()
    hash_operation()
    order_set_operation()

2. 项目下载

下载地址:https://download.csdn.net/download/zcs2312852665/90889723

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2386996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器并发实现的五种方法

文章目录 前言一、单线程 / 进程二、多进程并发三、多线程并发四、IO多路转接(复用)select五、IO多路转接(复用)poll六、IO多路转接(复用)epoll 前言 关于网络编程相关知识可看我之前写过的文章&#xff1…

新能源汽车移动充电服务:如何通过智能调度提升充电桩可用率?

随着新能源汽车的普及,充电需求激增,但固定充电桩的布局难以满足用户灵活补能的需求,尤其在高峰时段或偏远地区,"充电难"问题日益凸显。移动充电服务作为新兴解决方案,通过动态调度充电资源,有望…

SpringCloud Alibaba微服务-- Sentinel的使用(笔记)

雪崩问题: 小问题引发大问题,小服务出现故障,处理不当,可能导致整个微服务宕机。 假如商品服务出故障,购物车调用该服务,则可能出现处理时间过长,如果一秒几十个请求,那么处理时间过…

PARSCALE:大语言模型的第三种扩展范式

----->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<----- 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为推动机器智能向通用人工智能&#xff08;AGI&#xff09;迈进的核心驱动力。然而&#xff0c;传统的…

在Windows上,将 Ubuntu WSL 安装并迁移到 D 盘完整教程(含 Appx 安装与迁移导入)

&#x1f4bb; 将 Ubuntu WSL 安装并迁移到 D 盘完整教程&#xff08;含 Appx 安装与迁移导入&#xff09; 本文记录如何在 Windows 系统中手动启用 WSL、下载 Ubuntu 安装包、安装并迁移 Ubuntu 到 D 盘&#xff0c;避免默认写入 C 盘&#xff0c;提高系统性能与可维护性。 ✅…

企微获取会话内容,RSA 解密函数

企微获取会话内容&#xff0c;RSA 解密函数 企微获取会话内容下载SDKSDK配置解密过程解密代码参考SDK文件上传到服务器最后 企微获取会话内容 官方文档&#xff1a; https://developer.work.weixin.qq.com/document/path/91774 下载SDK 根据自己的环境下载对应的SDK。 SDK配置…

MyBatis入门:快速搭建数据库操作框架 + 增删改查(CRUD)

一、创建Mybatis的项目 Mybatis 是⼀个持久层框架, 具体的数据存储和数据操作还是在MySQL中操作的, 所以需要添加MySQL驱动 1.添加依赖 或者 手动添加依赖 <!--Mybatis 依赖包--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactI…

离线安装Microsoft 照片【笔记】

实验环境为&#xff1a;Windows 10 企业版 LTSC。 1.下载好相关离线依赖包和安装包。 2.管理员身份运行powershell&#xff0c;输入以下命令行&#xff1a; Add-AppPackage .\Microsoft.UI.Xaml.2.4_2.42007.9001.0_x64__8wekyb3d8bbwe.Appx Add-AppPackage .\Microsoft.NET…

【后端高阶面经:Elasticsearch篇】39、Elasticsearch 查询性能优化:分页、冷热分离与 JVM 调优

一、索引设计优化:构建高效查询的基石 (一)分片与副本的黄金配置 1. 分片数量计算模型 # 分片数计算公式(单分片建议30-50GB) def calculate_shards(total_data_gb, single_shard_gb=30):return max

基于 ZU49DR FPGA 的无线电射频数据采样转换开发平台核心板

无线电射频数据采样转换开发板及配套开发平台的核心板&#xff0c;该SOM核心板是一个最小系统&#xff0c;包括AMD公司的 Zynq UltraScale RFSOC 第3代系列XCZU49DR-2FFVF1760I FPGA、时钟、电源、内存以及 Flash。与其配套的底板是标准的全高全长Gen4.0 x8的PCIE卡&#xff0c…

软考 系统架构设计师系列知识点之杂项集萃(69)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;68&#xff09; 第114题 若对关系R(A&#xff0c;B&#xff0c;C&#xff0c;D)和S(C&#xff0c;D&#xff0c;E)进行关系代数运算&#xff0c;则表达式 与&#xff08;&#xff09;等价。 A.…

leetcode 83和84 Remove Duplicates from Sorted List 和leetcode 1836

目录 83. Remove Duplicates from Sorted List 82. Remove Duplicates from Sorted List II 1836. Remove Duplicates From an Unsorted Linked List 删除链表中的结点合集 83. Remove Duplicates from Sorted List 代码&#xff1a; /*** Definition for singly-linked l…

【LeetCode 热题 100】买卖股票的最佳时机 / 跳跃游戏 / 划分字母区间

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;LeetCode 热题 100 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 买卖股票的最佳时机跳跃游戏跳跃游戏 II划分字母区间 买卖股票的最佳时机 买卖股票的最佳时机 class Solution { pu…

万亿参数背后的算力密码:大模型训练的分布式架构与自动化运维全解析

目录 一、技术融合的时代背景 二、深度学习在 AI 大模型中的核心作用 2.1 预训练与微调机制 2.2 多模态深度学习的突破 三、分布式计算&#xff1a;大模型训练的基础设施 3.1 分布式训练核心原理 3.2 数据并行实战&#xff08;PyTorch DDP&#xff09; 3.3 模型并行与混…

Linux10正式版发布,拥抱AI了!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…

在离线 OpenEuler-22.03 服务器上升级 OpenSSH 的完整指南

当然可以&#xff01;以下是一篇结构清晰、语言通俗易懂的技术博客草稿&#xff0c;供你参考和使用&#xff1a; 在离线 OpenEuler-22.03 服务器上升级 OpenSSH 的完整指南 背景介绍 最近在对一台内网的 OpenEuler-22.03 服务器进行安全扫描时&#xff0c;发现其 SSH 版本存在…

全能邮箱全能邮箱:实现邮件管理的自动化!

全能邮箱全能邮箱&#xff1a;实现邮件管理的自动化&#xff01; 全能邮箱全能邮箱的配置教程&#xff1f;如何注册烽火域名邮箱&#xff1f; 全能邮箱全能邮箱作为一种创新的邮件管理解决方案&#xff0c;正逐渐改变我们处理邮件的方式。蜂邮EDM将围绕全能邮箱全能邮箱&…

mysql-tpcc-mysql压测工具使用

在Linux系统上安装和配置tpcc-mysql进行MySQL的TPC-C基准测试&#xff0c;通常涉及以下几个步骤。请注意&#xff0c;由于tpcc-mysql不是一个官方工具&#xff0c;它可能需要从第三方仓库获取&#xff0c;如Percona提供的版本。 前置条件 确保MySQL或MariaDB已安装&#xff1…

Qt找不到windows API报错:error: LNK2019: 无法解析的外部符号 __imp_OpenClipboard

笔者在开发中出现的bug完整报错如下&#xff1a; spcm_ostools_win.obj:-1: error: LNK2019: 无法解析的外部符号 __imp_OpenClipboard&#xff0c;函数 "void __cdecl spcmdrv::vCopyToClipboard(char const *,unsigned __int64)" (?vCopyToClipboardspcmdrvYAXPE…

OpenCv高阶(十七)——dlib库安装、dlib人脸检测

文章目录 前言一、dlib库简介二、dlib库安装1、本地安装&#xff08;离线&#xff09;2、线上安装 三、dlib人脸检测原理1、HOG 特征提取2、 SVM 分类器训练3、 滑动窗口搜索4、非极大值抑制&#xff08;NMS&#xff09; 四、dlib人脸检测代码1、导入OpenCV计算机视觉库和dlib机…