使用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基础教程(八):迭代器与生成器编程
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
