使用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_clientexcept 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_clientexcept 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、用法
- 使用 MULTI 命令开启事务。
- 在 MULTI 和 EXEC 之间执行多个命令,这些命令将被添加到事务队列中,但不会立即执行。
- 使用 EXEC 命令执行事务中的所有命令,如果 EXEC 执行成功,事务中的所有命令将被依次执行,否则事务中的所有命令都不会执行。
- 如果需要取消事务,可以使用 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管道的优势
- 减少通信开销: 通过将多个命令打包发送给服务器,减少了网络通信的开销,提高了性能。
- 原子性操作: 管道中的所有命令都会作为一个原子操作执行,要么全部执行成功,要么全部执行失败。
- 批量操作: 可以一次性执行多个命令,适用于批量操作或需要原子性的多个命令序列。
- 高效性能: 对于批量操作或需要执行多个命令的场景,使用管道可以显著提高性能和吞吐量。
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)。
-
快照(Snapshot): Redis 将内存中的数据保存到磁盘上的一个快照文件中。当需要备份数据或者恢复数据时,可以使用快照文件进行操作。快照是一个二进制文件,可以使用
SAVE
和BGSAVE
命令生成。 -
日志追加(Append-Only File,AOF): AOF 日志记录了 Redis 服务器接收到的写命令,如 SET、DEL 等。当服务器重启时,可以通过重新执行 AOF 日志中的写命令来恢复数据。AOF 日志以追加的方式写入磁盘,因此即使服务器发生崩溃,也不会丢失数据。可以使用
AOF
选项设置 AOF 持久化方式。
2、备份和恢复 Redis 数据的方法
-
快照备份: 使用
SAVE
或BGSAVE
命令生成快照文件,并将快照文件复制到安全的位置进行备份。在需要恢复数据时,将快照文件复制到 Redis 数据目录,并使用RESTORE
命令进行恢复。 -
AOF 备份: 将 AOF 日志文件复制到安全的位置进行备份。在需要恢复数据时,将 AOF 日志文件复制到 Redis 数据目录,并重新启动 Redis 服务器,Redis 服务器会根据 AOF 日志中的写命令来恢复数据。
-
定期备份: 设置定期备份任务,定期生成快照文件或复制 AOF 日志文件到安全的位置进行备份,以防止数据丢失。
-
持久化选项设置: 根据需求设置持久化选项,选择合适的持久化方式(快照或 AOF),并设置相应的参数以控制持久化操作的频率和方式。
-
在线备份工具: 使用第三方工具或服务进行在线备份,如 Redis 的持久化和备份服务、云存储服务等。
通过以上备份和恢复方法,可以确保 Redis 数据的安全性和可靠性,以防止数据丢失或损坏。
九、性能优化和安全性
1、性能优化
-
使用管道操作: 将多个 Redis 命令打包发送给服务器并一次性执行,减少网络通信开销,提高性能和吞吐量。
-
批量操作: 尽量减少与 Redis 的交互次数,使用批量操作命令(如 MSET、MGET、HMSET、HMGET 等)一次性操作多个键,减少网络延迟。
-
使用连接池: 使用连接池管理 Redis 连接,避免频繁地创建和销毁连接,提高性能和效率。
-
优化数据结构: 根据业务需求选择合适的数据结构,如使用哈希表代替字符串存储复杂数据,使用有序集合存储排行榜等,以提高查询效率。
-
合理设置持久化选项: 根据数据重要性和业务需求选择合适的持久化方式(快照或 AOF),并设置适当的参数以控制持久化操作的频率和方式。
2、安全性
-
访问控制: 配置 Redis 的访问控制机制,限制只允许信任的客户端访问 Redis 服务器,可以通过密码认证或 IP 白名单等方式进行控制。
-
密钥命名规范: 使用规范的密钥命名规则,避免使用简单的键名或者敏感信息作为键名,以防止泄露敏感数据。
-
数据加密: 对于敏感数据,可以在应用层对数据进行加密处理,然后再存储到 Redis 中,提高数据的安全性。
-
安全更新配置: 定期更新 Redis 的配置文件,并采取安全更新策略,及时修补可能存在的安全漏洞,保证 Redis 服务器的安全性。
-
监控和报警: 配置监控系统,实时监控 Redis 服务器的状态和性能指标,并设置报警机制,及时发现和处理异常情况。
通过以上性能优化和安全性措施,可以确保 Python 与 Redis 之间的交互更加高效和安全,提高系统的稳定性和可靠性。
相关文章:
使用Python操作Redis
大家好,在当今的互联网时代,随着数据量和用户量的爆发式增长,对于数据存储和处理的需求也日益增加。Redis作为一种高性能的键值存储数据库,以其快速的读写速度、丰富的数据结构支持和灵活的应用场景而备受青睐。本文将介绍Redis数…...
Vue-CountUp-V2 数字滚动动画库
安装: $ npm install --save countup.js vue-countup-v2示例如下: <template><div class"iCountUp"><ICountUp:delay"delay":endVal"endVal":options"options"ready"onReady"/>&…...
C语言详解(文件操作)1
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...
Python Requests库详解
大家好,在现代网络开发中,与Web服务器进行通信是一项至关重要的任务。Python作为一种多才多艺的编程语言,提供了各种工具和库来简化这一过程。其中,Requests库作为Python中最受欢迎的HTTP库之一,为开发人员提供了简单而…...
Kafka 详解:全面解析分布式流处理平台
Kafka 详解:全面解析分布式流处理平台 Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流式应用。它具有高吞吐量、低延迟、高可用性和高可靠性的特点,广泛应用于日志收集、数据流处理、消息系统、实时分析等场景。 &…...
RabbitMQ系列-rabbitmq无法重新加入集群,启动失败的问题
当前存在3个节点:rabbitmq5672、rabbitmq5673、rabbitmq5674 当rabbitmq5673节点掉线之后,重启失败 重启的时候5672节点报错如下: 解决方案 在集群中取消失败节点 rabbitmqctl forget_cluster_node rabbitrabbitmq5673删除失败节点5673的…...
postgresql之翻页优化
列表和翻页是所有应用系统里面必不可少的需求,但是当深度翻页的时候,越深越慢。下面是几种常用方式 准备工作 CREATE UNLOGGED TABLE data (id bigint GENERATED ALWAYS AS IDENTITY,value double precision NOT NULL,created timestamp with time zon…...
小白学Linux | 日志排查
一、windows日志分析 在【运行】对话框中输入【eventvwr】命令,打开【事件查看器】窗 口,查看相关的日志 管理员权限进入PowerShell 使用Get-EventLog Security -InstanceId 4625命令,可获取安全性日志下事 件 ID 为 4625(失败登…...
Spring6
一 概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…...
数字孪生概念、数字孪生技术架构、数字孪生应用场景,深度长文学习
一、数字孪生起源与发展 1.1 数字孪生产生背景 数字孪生的概念最初由Grieves教授于2003年在美国密歇根大学的产品全生命周期管理课程上提出,并被定义为三维模型,包括实体产品、虚拟产品以及二者间的连接,如下图所示: 2011年&…...
云服务对比:阿里云国际站和阿里云国内站有什么区别
阿里云国际站(Alibaba Cloud International)和阿里云国内站(Alibaba Cloud China)在许多方面存在明显区别,这些区别主要体现在服务范围、合规性、定价和支付方式、语言和客服支持、以及备案要求等方面。 首先…...
如何在npm上发布自己的包
如何在npm上发布自己的包 npm创建自己的包 一、一个简单的创建 1、创建npm账号 官网:https://www.npmjs.com/创建账号入口:https://www.npmjs.com/signup 注意:需要进入邮箱验证 2、创建目录及初始化 $ mkdir ufrontend-test $ cd ufron…...
SQL Chat:从SQL到SPEAKL的数据库操作新纪元
引言 SQL Chat是一款创新的、对话式的SQL客户端工具。 它采用自然语言处理技术,让你能够像与人交流一样,通过日常对话的形式对数据库执行查询、修改、创建及删除操作 极大地简化了数据库管理流程,提升了数据交互的直观性和效率。 在这个框…...
jmeter性能优化之mysql配置
一、连接数据库和grafana 准备:连接好数据库和启动grafana并导入mysql模板 大批量注册、登录、下单等,还有过节像618,双11和数据库交互非常庞大,都会存在数据库的某一张表里面,当用户在登录或者查询某一个界面时&…...
VueRouter3学习笔记
文章目录 1,入门案例2,一些细节高亮效果非当前路由会被销毁 3,嵌套路由4, 传递查询参数5,命名路由6,传递路径参数7,路径参数转props8,查询参数转props9,replace模式10&am…...
「前端+鸿蒙」鸿蒙应用开发-TS函数
在 TypeScript 中,函数是一等公民,这意味着函数可以作为参数传递、作为其他函数的返回值,甚至可以赋值给变量。TypeScript 为 JavaScript 的函数增加了类型系统,使得函数的参数和返回值都具有明确的类型。 TS快速入门-函数 基本函…...
python后端结合uniapp与uview组件tabs,实现自定义导航按钮与小标签颜色控制
实现效果(红框内): 后端api如下: task_api.route(/user/task/states_list, methods[POST, GET]) visitor_token_required def task_states(user):name_list [待接单, 设计中, 交付中, 已完成, 全部]data []color [#F04864, …...
mingw如何制作动态库附python调用
1.mingw和msvc g -fpic HelloWorld.cpp -shared -o test.dllg -L . -ltest .\test.cpp 注意-L后面的.挨不挨着都行,-l不需要-ltest.dll,只需要-ltest 2.dll.cpp extern "C" {__declspec(dllexport) int __stdcall add(int a, int b) {return…...
Vue学习|Vue快速入门、常用指令、生命周期、Ajax、Axios
什么是Vue? Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写 基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。官网:https://v2.cn.vuejs.org/ Vue快速入门 打开页面࿰…...
Python基础教程(八):迭代器与生成器编程
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...
Oracle10.2.0.1冷备迁移之_数据文件拷贝方式
由于阿里云机房要下架旧服务器,单位未购买整机迁移服务,且业务较老不兼容Oracle11g,所以新购买一台新服务器进行安装Oracle10.2.0.1 ,后续再将数据迁移到新服务器上。 id 数据库版本 操作系统版本 实例名 源库 115.28.242.25…...
智能合约中外部调用漏洞
外部调用 : 在智能合约开发中,调用不受信任的外部合约是一个常见的安全风险点。这是因为,当你调用另一个合约的函数时,你实际上是在执行那个合约的代码,而这可能会引入你未曾预料的行为,包括恶意行为。下面…...
转型AI产品经理(4):“认知负荷”如何应用在Chatbot产品
认知负荷理论主要探讨在学习过程中,人脑处理信息的有限容量以及如何优化信息的呈现方式以促进学习。认知负荷定律认为,学习者的工作记忆容量是有限的,而不同类型的认知任务会对工作记忆产生不同程度的负荷,从而影响学习效果。以下…...
【C++11】常见的c++11新特性(一)
文章目录 1. C11 简介2. 常见的c11特性3.统一的列表初始化3.1initializer_list 4. decltype与auto4.1decltype与auto的区别 5.nullptr6.右值引用和移动语义6.1左值和右值6.1.1左值的特点6.1.2右值的特点6.1.3右值的进一步分类 6.2左值引用和右值引用以及区别6.2.1左值引用6.2.2…...
牛客周赛 Round 46 题解 C++
目录 A 乐奈吃冰 B 素世喝茶 C 爱音开灯 D 小灯做题 E 立希喂猫 F 祥子拆团 A 乐奈吃冰 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <set> #include <vector>…...
9.3 Go 接口的多态性
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
Java通过字符串字段匹配形成树形结构
Java通过字符串字段匹配形成树形结构 文章目录 Java通过字符串字段匹配形成树形结构数据表模拟数据解决办法:1、domian 类:2、Node层(形成树形关系):3、controller 层4、Util 工具类1、BeanCopierUtil4、Mapper5、Manager(用来组装树形结构)6、测试:有的时候我们形成树形不…...
数字孪生智慧水利:精准管理与智能决策的新时代
图扑数字孪生技术在智慧水利中的应用,通过虚拟模型与真实水利系统的无缝连接,实现对水资源和水利工程的全面监控和精细管理。实时数据采集与动态模拟提升了水利系统的预测和响应能力,从洪水预警到水质监测,数字孪生助力各项决策更…...
基于ChatGLM3的本地问答机器人部署流程
基于ChatGLM3的本地问答机器人部署流程 前言一、确定文件结构1.新建文件夹储存本地模型2.下载源码和模型 二、Anaconda环境搭建1.创建anaconda环境2.安装相关库3.设置本地模型路径4.启动 三、构建本地知识库1.下载并安装postgresql2.安装c库3.配置向量插件 四、线上运行五、 全…...
归并排序——逆序数对的统计
逆序数对的统计 题目描述 运行代码 #include <iostream> using namespace std; #define LL long long const int N 1e5 5; int a[N], tmp[N]; LL merge_sort(int q[], int l, int r) {if (l > r)return 0; int mid l r >> 1; LL res merge_sort(q, l,…...
外贸线上推广/seo是指什么意思
cdonts: 需要本地安装smtp服务,由本地发送邮件。 优点是比较快,但是不易扩展,且很容易拒收。 smtp服务器指定原因是别名或域名为好。 反垃圾邮件组织. 四大国际反垃圾邮件组织介绍 http://www.chinaemail.com.cn/zixun/corp/…...
网站建设公司效果/网站广告制作
上拉电阻就是把不确定的信号通过一个电阻钳位在高电平,此电阻还起到限流的作用。同理,下拉电阻是把不确定的信号钳位在低电平。上拉电阻是指器件的输入电流,而下拉指的是输出电流。 一、那么在什么时候使用上、下拉电阻呢? 1、当…...
券妈妈网站是如何做的/百度数据网站
HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷是为了保证数据安全。 近两年,Google、Baidu、Facebook 等这…...
郑州高端网站模板/网拍外宣怎么推广
书上是用rgba表示浮点型的z值,扩大了范围,但是大点了也会出问题。以后可能考虑用cascade shadowmap <html> <head>11</head> <body> <canvas id "test" width "800" height "800">canv…...
搜索引擎网站推广如何优化/十大网站平台
一、环境安装测试 1、创建环境conda create -n yolo python3.7conda activate yolo2、安装pytorchconda install pytorch torchvision cudatoolkit11.3 -c pytorch11.3为cuda版本号3、克隆yolov5git clone https://github.com/WongKinYiu/yolov7 # clonecd yolov7pip install…...
wordpress图文主题/怎么把产品快速宣传并推广
一、vertical aglin之数值百分比 数值类和百分比类 1.共性: a.都带数字 b.都支持负值(支持负值的css有:margin、letter-spacing、word-spacing、vertical-align) c.行为表现一致 百分比:vertical aglin的百分比是相对于line-height计算的! IE6/IE7下 vertical aglin的百分比不支…...