使用Python操作Redis

        大家好,在当今的互联网时代,随着数据量和用户量的爆发式增长,对于数据存储和处理的需求也日益增加。Redis作为一种高性能的键值存储数据库,以其快速的读写速度、丰富的数据结构支持和灵活的应用场景而备受青睐。本文将介绍Redis数据库,并探讨在现代应用程序中如何使用Python操作Redis来提高应用程序的性能和可靠性。

关于Redis的安装,可以参考:使用Docker安装Redis

一、介绍

Redis简介:

        Redis(Remote Dictionary Server)是一个开源的内存数据库,它支持键值对、列表、集合、有序集合等多种数据结构,并提供了丰富的命令和功能,如事务、发布与订阅、持久化等。由于其内置的内存缓存和快速的持久化机制,Redis在处理大规模数据和高并发请求时表现出色,成为了许多互联网企业构建高性能应用的首选数据库之一。

Redis在现代应用程序中的重要性:

        在现代应用程序中,数据的快速访问和处理是至关重要的。随着用户数量的增加和业务规模的扩大,传统的关系型数据库往往难以满足高并发、大数据量的需求。而Redis作为一种内存数据库,具有低延迟、高并发和高可扩展性的特点,能够轻松应对大规模数据和高并发请求的挑战。因此,越来越多的企业和开发者选择使用Redis来构建高性能、可靠的应用程序。

本文的目的:

        本文旨在介绍如何使用Python操作Redis数据库,以提高应用程序的性能和可靠性。通过学习和掌握Python操作Redis的方法和技巧,开发人员可以更加高效地利用Redis数据库,实现数据的快速存储、读写和处理。本文将详细介绍Python中常用的Redis客户端库、连接到Redis数据库的方法、常见的数据操作、发布与订阅、事务、管道等高级功能,帮助读者全面了解和掌握Python操作Redis的技术。

二、Python中的Redis客户端库

        在Python中,有多个常用的Redis客户端库可供选择,每个库都有自己的特点和适用场景。下面将介绍两个主要的Redis客户端库,并对它们进行比较。

1、redis-py

特点:

  • redis-py 是 Redis 官方推荐的 Python 客户端库,由 Redis Labs 维护。
  • 具有稳定性高、功能丰富、文档完善等优点。
  • 提供了同步和异步两种方式的 API,支持通过 Redis 协议与 Redis 服务器通信。
  • 支持 Redis 服务器的所有命令和特性,包括事务、管道、发布与订阅等。

适用场景:

  • 适用于需要稳定性高、功能丰富的生产环境,对性能要求不是非常高的应用场景。
  • 适用于需要与 Redis 服务器进行直接交互的应用程序,如 Web 应用、后端服务等。

2、aioredis

特点:

  • aioredis 是一个基于 asyncio 的异步 Redis 客户端库,由 Redis Labs 开发。
  • 完全基于协程和异步 IO 模型,能够充分利用 Python 3.5+ 提供的异步编程能力。
  • 支持连接池管理、连接自动重连、支持 Pub/Sub 模式等特性。
  • 与 asyncio、aiohttp 等异步框架完美集成,适用于高并发、高性能的异步应用场景。

适用场景:

  • 适用于需要高并发、高性能、异步 IO 的应用场景,如网络服务器、实时通信系统等。
  • 适用于需要与其他异步框架(如 asyncio、aiohttp)配合使用的项目。

3、比较

  • redis-py 是一个成熟稳定的同步客户端库,适用于大多数应用场景,尤其适用于传统的同步 IO 模型。
  • aioredis 则是一个基于异步 IO 的客户端库,适用于需要高性能异步处理的场景,特别是在 asyncio 和 aiohttp 等异步框架中。

        选择合适的 Redis 客户端库取决于项目的需求和特点。如果项目采用传统的同步 IO 模型,并且对性能要求不是非常高,则可以选择 redis-py。而如果项目采用异步 IO 模型,并且对高并发、高性能有较高要求,则可以选择 aioredis

三、连接到Redis数据库

安装redis-py非常简单,可以通过 pip 包管理器来安装。在命令行中执行以下命令即可:

pip install redis

        连接到Redis数据库是使用Python操作Redis的第一步,下面演示如何使用Python代码连接到本地或远程Redis数据库,并展示连接参数的配置和错误处理。

import redis

# 连接本地Redis数据库,默认端口为6379
def connect_to_redis_local():
    try:
        # 创建Redis连接对象
        redis_client = redis.Redis(host='localhost', port=6379, db=0)
        # 测试连接是否成功
        redis_client.ping()
        print("Connected to local Redis database successfully!")
        return redis_client
    except Exception as e:
        print("Failed to connect to local Redis database:", e)
        return None

# 连接远程Redis数据库
def connect_to_redis_remote():
    try:
        # 创建Redis连接对象
        redis_client = redis.Redis(host='remote_host', port=6379, db=0, password='your_password')
        # 测试连接是否成功
        redis_client.ping()
        print("Connected to remote Redis database successfully!")
        return redis_client
    except Exception as e:
        print("Failed to connect to remote Redis database:", e)
        return None

# 测试连接本地Redis数据库
redis_local_client = connect_to_redis_local()
if redis_local_client:
    # 进行其他操作,如设置键值对、获取数据等
    pass

# 测试连接远程Redis数据库
redis_remote_client = connect_to_redis_remote()
if redis_remote_client:
    # 进行其他操作,如设置键值对、获取数据等
    pass

        在上面的示例中,定义了两个函数connect_to_redis_local()connect_to_redis_remote(),分别用于连接本地和远程的Redis数据库。在函数中,使用redis.Redis()创建了Redis连接对象,指定了连接参数,包括主机地址、端口号、数据库索引和密码等。然后使用ping()方法测试连接是否成功,如果连接成功,则返回Redis连接对象,否则打印错误信息并返回None。

        在测试连接的过程中,使用了异常处理机制,捕获可能出现的连接错误,并打印相应的错误信息。这样可以帮助及时发现连接问题,并进行相应的处理。

四、数据操作

        Python 中操作 Redis 的方法非常简单,主要通过 Redis 客户端库 redis-py 来实现。下面我将详细介绍一些常见的 Redis 操作,并给出相应的示例代码。

1、连接到 Redis 数据库

首先,需要连接到 Redis 数据库。通过创建 redis.Redis 对象并指定连接参数,就可以实现连接。

import redis

# 连接到本地 Redis 服务器
redis_client = redis.Redis(host='localhost', port=6379, db=0)

2、设置和获取键值对

Redis 是一种键值存储数据库,所以最基本的操作就是设置和获取键值对。

# 设置键值对
redis_client.set('key', 'value')

# 获取键对应的值
value = redis_client.get('key')
print(value)  # 输出 b'value',b 前缀表示字节字符串

3、操作列表

Redis 的列表是一个有序的字符串列表,可以向列表左端或右端添加元素,也可以获取列表的元素。

# 向列表右端添加元素
redis_client.rpush('list', 'element1', 'element2', 'element3')

# 获取列表的所有元素
elements = redis_client.lrange('list', 0, -1)
print(elements)  # 输出 [b'element1', b'element2', b'element3']

4、操作集合

Redis 的集合是一个无序的字符串集合,可以向集合添加元素,也可以获取集合的所有元素。

# 向集合添加元素
redis_client.sadd('set', 'element1', 'element2', 'element3')

# 获取集合的所有元素
elements = redis_client.smembers('set')
print(elements)  # 输出 {b'element1', b'element2', b'element3'}

5、操作有序集合

有序集合是 Redis 提供的一种特殊的数据结构,它是一个集合,但是每个元素都会关联一个分数,可以根据分数对元素进行排序。

# 添加成员和分数到有序集合
redis_client.zadd('sorted_set', {'member1': 10, 'member2': 20, 'member3': 30})

# 获取有序集合的所有成员及其分数
members_with_scores = redis_client.zrange('sorted_set', 0, -1, withscores=True)
print(members_with_scores)  # 输出 [(b'member1', 10.0), (b'member2', 20.0), (b'member3', 30.0)]

6、删除键

可以使用 delete() 方法删除指定的键。

# 删除键
redis_client.delete('key')

7、原子操作

Redis 支持原子操作,如增加、减少值等。

# 增加值
redis_client.incr('counter')  # 默认增加 1
redis_client.incrby('counter', 5)  # 增加指定的值

# 减少值
redis_client.decr('counter')  # 默认减少 1
redis_client.decrby('counter', 5)  # 减少指定的值

8、批量操作

Redis 支持批量操作,可以同时执行多个命令。

# 使用 pipeline 批量执行多个命令
with redis_client.pipeline() as pipe:
    pipe.set('key1', 'value1')
    pipe.set('key2', 'value2')
    pipe.execute()

9、过期时间

可以设置键的过期时间,使其在一定时间后自动删除。

# 设置键的过期时间(单位:秒)
redis_client.expire('key', 60)  # 在 60 秒后过期

10、分布式锁(Distributed Locks)

使用 Redis 可以实现分布式锁,防止多个客户端同时修改共享资源。

# 获取锁
lock_acquired = redis_client.set('lock_key', 'lock_value', nx=True, ex=10)  # 设置锁的过期时间为10秒

# 检查锁是否获取成功
if lock_acquired:
    # 执行操作
    pass
else:
    # 锁已被其他客户端占用,执行其他操作或等待
    pass

11、Lua 脚本执行

可以使用 Lua 脚本在 Redis 服务器端执行复杂的操作,以提高性能和减少网络开销。

# 执行 Lua 脚本
script = """
    return redis.call('get', KEYS[1])
"""
result = redis_client.eval(script, 1, 'key')
print(result)

12、数据持久化(Persistence)

Redis 提供了两种数据持久化方式,分别是快照(Snapshot)和 AOF(Append-Only File)方式。

# 开启 AOF 持久化
redis_client.config_set('appendonly', 'yes')

13、分布式计数器(Distributed Counter)

可以使用 Redis 实现分布式计数器,用于统计某个事件的发生次数。

# 增加计数器的值
redis_client.incr('counter')

完整示例:

        下面是一个使用 Python 操作 Redis 的完整示例,包括连接到 Redis、设置键值对、获取键值对、使用管道操作等。

import redis

# 连接到 Redis 服务器
redis_client = redis.Redis(host='localhost', port=6379, db=0)

# 设置键值对
redis_client.set('name', 'Alice')
redis_client.set('age', 30)

# 获取键值对
name = redis_client.get('name')
age = redis_client.get('age')
print("Name:", name.decode())  # 解码字节字符串
print("Age:", age.decode())  # 解码字节字符串

# 使用管道操作
pipeline = redis_client.pipeline()
pipeline.multi()  # 开启事务
pipeline.set('country', 'USA')
pipeline.set('city', 'New York')
pipeline.execute()  # 执行事务

# 获取管道操作后的键值对
country = redis_client.get('country')
city = redis_client.get('city')
print("Country:", country.decode())  # 解码字节字符串
print("City:", city.decode())  # 解码字节字符串

        在这个示例中,首先创建了一个 Redis 客户端对象 redis_client,然后分别使用 set() 方法设置了两个键值对,使用 get() 方法获取了这两个键值对的值。接着,使用管道操作 pipeline 同时设置了两个新的键值对,最后使用 get() 方法获取了管道操作后的键值对的值。

五、发布与订阅

        Redis 提供了发布与订阅(Pub/Sub)功能,通过该功能,客户端可以订阅一个或多个频道(Channel),并接收其他客户端向这些频道发布的消息。这种模式常用于实时通信、事件驱动等场景。下面将介绍 Redis 的发布与订阅功能,并演示如何使用 Python 进行发布和订阅操作。

1、Redis 发布与订阅原理

  • 发布者(Publisher)向指定的频道发布消息。
  • 订阅者(Subscriber)订阅一个或多个频道,并接收这些频道上发布的消息。

2、使用 Python 进行发布和订阅操作

        首先,需要使用两个不同的 Python 客户端对象来模拟发布者和订阅者,然后分别进行发布和订阅操作。

import redis
import threading
import time

# 连接到 Redis 数据库
redis_client = redis.Redis(host='localhost', port=6379, db=0)

# 发布消息的函数
def publish_message(channel, message):
    time.sleep(1)  # 模拟消息发布延迟
    redis_client.publish(channel, message)
    print(f"Published '{message}' to channel '{channel}'")

# 订阅消息的函数
def subscribe_channel(channel):
    pubsub = redis_client.pubsub()
    pubsub.subscribe(channel)
    print(f"Subscribed to channel '{channel}'")
    for message in pubsub.listen():
        print(f"Received message: {message['data']}")

# 创建一个线程用于订阅消息
subscriber_thread = threading.Thread(target=subscribe_channel, args=('channel1',))
subscriber_thread.start()

# 发布消息到频道 channel1
publish_message('channel1', 'Hello, world!')
publish_message('channel1', 'How are you?')

解释:

  • 在示例代码中,首先创建了两个函数:publish_message() 用于发布消息,subscribe_channel() 用于订阅消息。
  • 在发布消息的函数中,使用 redis_client.publish() 方法向指定的频道发布消息,并打印发布的消息内容和频道名称。
  • 在订阅消息的函数中,首先创建了一个 pubsub 对象,并使用 subscribe() 方法订阅指定的频道。然后使用 listen() 方法循环监听该频道上发布的消息,并打印接收到的消息内容。
  • 最后,创建了一个新的线程来执行订阅操作,然后调用 publish_message() 函数向频道 channel1 发布了两条消息。

六、事务

        在 Redis 中,事务是一组命令的集合,这些命令将作为一个单独的操作进行执行。Redis 通过 MULTI、EXEC、DISCARD 和 WATCH 等命令来支持事务操作。

1、用法

  1. 使用 MULTI 命令开启事务。
  2. 在 MULTI 和 EXEC 之间执行多个命令,这些命令将被添加到事务队列中,但不会立即执行。
  3. 使用 EXEC 命令执行事务中的所有命令,如果 EXEC 执行成功,事务中的所有命令将被依次执行,否则事务中的所有命令都不会执行。
  4. 如果需要取消事务,可以使用 DISCARD 命令。

2、Python 中执行事务操作

下面是一个示例代码,演示了如何使用 Python 执行事务操作,并说明了事务的原子性和隔离性。

import redis

# 连接到 Redis 数据库
redis_client = redis.Redis(host='localhost', port=6379, db=0)

# 开启事务
transaction = redis_client.pipeline()

# 添加命令到事务队列中
transaction.multi()
transaction.set('key1', 'value1')
transaction.set('key2', 'value2')

# 执行事务
result = transaction.execute()

# 输出事务执行结果
print("Transaction result:", result)

解释:

  • 首先,使用 redis_client.pipeline() 方法创建了一个事务对象 transaction
  • 然后,使用 multi() 方法开启了事务,在 multi()execute() 之间的命令都会被添加到事务队列中。
  • 在事务队列中,执行了两条 set 命令,分别设置了两个键的值。
  • 最后,使用 execute() 方法执行了事务,并将执行结果存储在 result 变量中。

        通过这个示例,可以看到事务中的多个命令会作为一个原子操作执行,要么全部执行成功,要么全部执行失败,保证了事务的原子性。此外,Redis 的事务操作是隔离的,即事务中的命令不会受到其他客户端的影响,保证了事务的隔离性。

七、Redis管道

        Redis 管道是一种将多个命令打包发送给 Redis 服务器并一次性执行的机制。通过使用管道,可以减少客户端和服务器之间的通信次数,从而提高性能和吞吐量。

1、Redis管道的优势

  1. 减少通信开销: 通过将多个命令打包发送给服务器,减少了网络通信的开销,提高了性能。
  2. 原子性操作: 管道中的所有命令都会作为一个原子操作执行,要么全部执行成功,要么全部执行失败。
  3. 批量操作: 可以一次性执行多个命令,适用于批量操作或需要原子性的多个命令序列。
  4. 高效性能: 对于批量操作或需要执行多个命令的场景,使用管道可以显著提高性能和吞吐量。

2、Python 实现管道操作

下面是一个示例代码,演示了如何使用 Python 实现管道操作以提高性能。

import redis

# 连接到 Redis 数据库
redis_client = redis.Redis(host='localhost', port=6379, db=0)

# 创建管道对象
pipeline = redis_client.pipeline()

# 添加多个命令到管道中
pipeline.set('key1', 'value1')
pipeline.set('key2', 'value2')
pipeline.set('key3', 'value3')

# 执行管道中的所有命令
pipeline.execute()

解释:

  • 首先,使用 redis_client.pipeline() 方法创建了一个管道对象 pipeline
  • 然后,使用 pipeline 对象的 set() 方法添加了多个命令到管道中,这些命令将作为一个原子操作执行。
  • 最后,使用 pipeline 对象的 execute() 方法执行了管道中的所有命令。

        通过这个示例,可以看到使用管道可以将多个命令打包发送给 Redis 服务器并一次性执行,从而提高了性能和吞吐量。特别是对于需要执行多个命令的场景,使用管道可以显著减少通信开销,提高效率。

八、数据持久化与备份

1、数据持久化机制

Redis 提供了两种数据持久化机制:快照(Snapshot)和日志追加(Append-Only File,AOF)。

  1. 快照(Snapshot): Redis 将内存中的数据保存到磁盘上的一个快照文件中。当需要备份数据或者恢复数据时,可以使用快照文件进行操作。快照是一个二进制文件,可以使用 SAVEBGSAVE 命令生成。

  2. 日志追加(Append-Only File,AOF): AOF 日志记录了 Redis 服务器接收到的写命令,如 SET、DEL 等。当服务器重启时,可以通过重新执行 AOF 日志中的写命令来恢复数据。AOF 日志以追加的方式写入磁盘,因此即使服务器发生崩溃,也不会丢失数据。可以使用 AOF 选项设置 AOF 持久化方式。

2、备份和恢复 Redis 数据的方法

  1. 快照备份: 使用 SAVEBGSAVE 命令生成快照文件,并将快照文件复制到安全的位置进行备份。在需要恢复数据时,将快照文件复制到 Redis 数据目录,并使用 RESTORE 命令进行恢复。

  2. AOF 备份: 将 AOF 日志文件复制到安全的位置进行备份。在需要恢复数据时,将 AOF 日志文件复制到 Redis 数据目录,并重新启动 Redis 服务器,Redis 服务器会根据 AOF 日志中的写命令来恢复数据。

  3. 定期备份: 设置定期备份任务,定期生成快照文件或复制 AOF 日志文件到安全的位置进行备份,以防止数据丢失。

  4. 持久化选项设置: 根据需求设置持久化选项,选择合适的持久化方式(快照或 AOF),并设置相应的参数以控制持久化操作的频率和方式。

  5. 在线备份工具: 使用第三方工具或服务进行在线备份,如 Redis 的持久化和备份服务、云存储服务等。

通过以上备份和恢复方法,可以确保 Redis 数据的安全性和可靠性,以防止数据丢失或损坏。

九、性能优化和安全性

1、性能优化

  1. 使用管道操作: 将多个 Redis 命令打包发送给服务器并一次性执行,减少网络通信开销,提高性能和吞吐量。

  2. 批量操作: 尽量减少与 Redis 的交互次数,使用批量操作命令(如 MSET、MGET、HMSET、HMGET 等)一次性操作多个键,减少网络延迟。

  3. 使用连接池: 使用连接池管理 Redis 连接,避免频繁地创建和销毁连接,提高性能和效率。

  4. 优化数据结构: 根据业务需求选择合适的数据结构,如使用哈希表代替字符串存储复杂数据,使用有序集合存储排行榜等,以提高查询效率。

  5. 合理设置持久化选项: 根据数据重要性和业务需求选择合适的持久化方式(快照或 AOF),并设置适当的参数以控制持久化操作的频率和方式。

2、安全性

  1. 访问控制: 配置 Redis 的访问控制机制,限制只允许信任的客户端访问 Redis 服务器,可以通过密码认证或 IP 白名单等方式进行控制。

  2. 密钥命名规范: 使用规范的密钥命名规则,避免使用简单的键名或者敏感信息作为键名,以防止泄露敏感数据。

  3. 数据加密: 对于敏感数据,可以在应用层对数据进行加密处理,然后再存储到 Redis 中,提高数据的安全性。

  4. 安全更新配置: 定期更新 Redis 的配置文件,并采取安全更新策略,及时修补可能存在的安全漏洞,保证 Redis 服务器的安全性。

  5. 监控和报警: 配置监控系统,实时监控 Redis 服务器的状态和性能指标,并设置报警机制,及时发现和处理异常情况。

        通过以上性能优化和安全性措施,可以确保 Python 与 Redis 之间的交互更加高效和安全,提高系统的稳定性和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【猫狗识别系统】图像识别Python+TensorFlow+卷积神经网络算法+人工智能深度学习

猫狗识别系统。通过TensorFlow搭建MobileNetV2轻量级卷积神经算法网络模型,通过对猫狗的图片数据集进行训练,得到一个进度较高的H5格式的模型文件。然后使用Django框架搭建了一个Web网页端可视化操作界面。实现用户上传一张图片识别其名称。 一、前言 …

[第五空间 2021]WebFTP、[HCTF 2018]Warmup

目录 [第五空间 2021]WebFTP ​[SWPUCTF 2021 新生赛]Do_you_know_http [NCTF 2018]签到题 [HNCTF 2022 Week1]What is Web [HNCTF 2022 Week1]Interesting_http [HCTF 2018]Warmup [第五空间 2021]WebFTP 使用dirsearch扫描,发现有git泄露 使用GitHack克隆目…

Docker以挂载方式安装RocketMQ

Docker 挂载安装RocketMQ Docker 挂载安装RocketMQ安装 Docker安装NameServer1.拉取容器2.创建NameServer容器3.查看容器状态4.补充配置4.1交互模式启动Docker容器4.2编辑broker.config4.2插入brokerIP1配置 安装Broker安装RocketMQ-console构建镜像启动容器开通安全组策略访问…

【Godot4自学手册】第四十一节背包系统(一)UI设置

各位同学,好久没有更新笔记了,今天开始,我准备自学背包系统。今天先学习下UI界面设置。 一、新建场景和结点 1.新建Node2D场景,命名为Inventory,保存到Scenes目录下,inventory.tscn。 2.新建TextureRect子…

寒武纪:“国产平替”道阻且长

英伟达的一季报反映了AI装备竞赛白热化,科技巨头们正疯狂加码投资。 不过,因为众所周知的原因,英伟达最先进的产品卖不到国内,虽然说一定程度上限制了咱们AI的发展,但也给国产AI芯片公司们提供了机会,其中就包括我们今…

HCIA--VLAN实验(复习)

实验要求: 1.PC1/2/5 在vlan2,PC3/4/6在vlan3. 2.SW1、SW2之间,SW1、R1之间 为trunk干道, 3.PC不配地址,通过DHCP获取地址 实验思路: 1.在SW上创建vlan,在对应接口划分vlan 2.SW1、SW2,SW…

掌握 NestJS 10.x:NestJS 结合 PostgreSQL 使用详解

NestJS 是一个用于构建高效、可扩展的 Node.js 服务端应用的框架。结合 PostgreSQL 数据库,可以为应用提供强大的数据存储和查询功能。本文将详细介绍如何在 NestJS 项目中集成和使用 PostgreSQL,并创建一个包含增加用户接口的完整示例。 1. 安装必要的依赖 首先,确保你的…

七校联赛题铅笔姿态及笔迹检测装置--mpu6050识别数字

前言 前几天打完比赛,收获还是挺大的,数字识别部分基本上浪费了绝大部分时间。先将思路简单说明。 1、题目 2、思路 针对笔迹检测,我们首先考虑的肯定是陀螺仪来测量加速度方向来判断书写的方向,从而得到书写的数字。 我们的方案…

【活动感想】CSDN技术沙龙之人工智能的日常应用与技术分享

目录 🌊1. 会议详情 🌞2. 会议感想 🏞️3. 会议总结 🌊1. 会议详情 主持人: 大家好,欢迎各位参加我们今天的小型技术沙龙活动!今天我们将围绕人工智能的日常应用与技术分享展开讨论。人工智…

kaggle:房价预测

比赛链接 结果展示 结果链接 8848是密码 文章目录 数据处理调包部分拒绝掉包岭回归理论代码实践结果 自助采样理论代码 集成学习前言Bagging理论Bagging代码Bagging-Ridge实践Bagging-Ridge结果 Tricks 数据处理 #打开文件 import pandas as pd dataset1pd.read_csv("tr…

CANDela studio的State

State主要用来查看,点击State Groups,可以看到session和security下面有多少个会话和security level,所以删除和新建都不能在这里操作。 Dependencies没有安装插件,看不到图形不要紧,点击下面那个图标,就能编…

国产打印何去何从?汉印瞄准突破口,推进发展新质生产力

推动发展新质生产力,已成为当前时代的主题,代表着先进生产力的发展方向。 打印行业因其高门槛性和技术复杂性,以及在信息安全领域中的作用,使其在我国“新质生产力”发展中占据关键位置。同时,打印行业融合了高精尖产…

洛谷--链表

约瑟夫问题 约瑟夫问题是一个链表的典型问题,为啥要用到链表呢?因为链表的优越性实在太多了~ 首先,有一个叫"循环链表"的东西非常适合这道题目 比如样例n 3,m10的情况,我们可以建立一个的循环链表: 1->2->3->4->5->6->7->8->9->10 ^ …

SpringCloud整合Seata简易使用(注册中心Nacos)

SpringCloud整合Seata解决分布式事务(注册中心Nacos) Seata下载与配置在Nacos中配置seata相关配置持久化为db时,需要提前在数据库中创建seata数据库,SpringCloud整合Seata服务GlobalTransactional注解使用 本案例是在windows中运行…

纯血鸿蒙实战开发—如何添加顶部tab页面

1.Tabs组件 Tabs组件的页面组成包含两个部分,分别是TabContent和TabBar。TabContent是内容页,TabBar是导航页签栏. 根据不同的导航类型,布局会有区别,可以分为底部导航、顶部导航、侧边导航,其导航栏分别位于底部、顶…

windows上安装MongoDB,springboot整合MongoDB

上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。 Ubuntu上安装、使用MongoDB详细教程https://blog.csdn.net/heyl163_/article/details/133781878 这篇文章介绍一下在windows上安装MongoDB,并通过在springboot项目中使用MongoDB记录用户…

每天五分钟计算机视觉:基于KNN算法完成图片分类任务

本文重点 在数字化和智能化的时代,图片分类作为计算机视觉领域的重要任务之一,已经广泛应用于各种场景,如安防监控、医疗诊断、智能推荐等。传统的图片分类方法往往需要复杂的手工特征提取和繁琐的分类器设计,而机器学习算法的引入为图片分类带来了不同的思路。 KNN算法概…

无人机航迹规划:人工原生动物优化器(Artificial Protozoa Optimizer ,APO)求解无人机路径规划,提供MATLAB代码

一、无人机模型介绍 单个无人机三维路径规划问题及其建模_无人机路径规划场景建模-CSDN博客 参考文献: [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、人工原生动物优化算法APO求解无人机路径规…

什么台灯对眼睛好?一文给你分享具体什么台灯对眼睛好!

什么台灯对眼睛好?随着学生们最近陆续返校,家长们和孩子们都忙于开学初的准备工作,而眼睛的健康自然也是他们考虑的一部分。这也是护眼台灯在近年来变得非常普及的原因之一。我自己一直是一个近视的人,而且日常用眼时间也相当长。…

神经网络与深度学习——第15章 序列生成模型

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第15章 序列生成模型,习题还没做先存在这里。 序列生成模型 序列概率模型 序列生成 N元统计模型 深度序列模型 模型结构 嵌入层 特征层 输出层 参数学习 评价方法 困惑度 BLEU算法 ROUGE算法 序…