使用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、用法

  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 之間的交互更加高效和安全,提高系統的穩定性和可靠性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22428.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

貓頭虎分享已解決Bug || Error: ‘fetch‘ is not defined

原創作者: 貓頭虎 作者微信號: Libin9iOak 作者公眾號: 貓頭虎技術團隊 更新日期: 2024年6月6日 博主貓頭虎的技術世界 🌟 歡迎來到貓頭虎的博客 — 探索技術的無限可能! 專欄鏈接: &…

獨立游戲之路 -- 上架TapTap步驟和注意事項

個人開發者游戲上架TapTap上架步驟和注意事項 一、TapTap 介紹二、獨立游戲上架 TapTap 的步驟2.1 創建游戲2.2 提交游戲審核2.3 TapTap 平臺上發布。 三、注意事項3.1 關于備案3.2 遵守 TapTap 的規定3.3 保證游戲質量 四、常見問題4.1 隱私政策問題4.2 先發布還是先優化&…

C語言學習--鏈式結構

結構體的應用: //數據結構與算法 數據結構 ---- 指的是 數據的組織形式 數組 --- 數據結構 數組特點 連續性,有序性,單一性 數據操作(訪問)時的特點 -------------------…

Ubuntu24.04記錄網易郵箱大師的安裝

郵箱大師下載 官網自行下載,下載后文件名“mail.deb" https://dashi.163.com/ 安裝發現缺少依賴 #mermaid-svg-8wqpqFSBVOPD7NGP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8wqpqFSBVOPD7NGP …

PIVOT函數-動態列

一、需求說明 原始表&#xff1a; select * from pathogen_pro; 將pm_name的值轉成對應的列&#xff0c;效果如下 二、PIVOT函數說明 PIVOT(<聚合函數>([聚合列值]) FOR [行轉列前的列名] IN([行轉列后的列名1],[行轉列后的列名2],[行轉列后的列名3],.......[行轉列后…

Julia編程11:變量作用域 Scope of Variables

There are two main types of scopes in Julia, global* scope* and local* scope*. Julia有全局變量作用域和局部變量作用域&#xff0c;函數或者一些結構體、循環體如for等是否內部是局部環境可以參照下表。 ConstructScope typeAllowed withinmodule, baremoduleglobalglo…

.Net 基于.Net8開發的一個Asp.Net Core Webapi后端框架

1.項目結構 該項目是基于.net8開發的Asp.Net Core WebApi后端服務,集成了Efcore,Autofac,Jwt,AutoMapper,Serilog,Quartz,MiniExcel等組件。該框架簡單易上手&#xff0c;沒有額外的學習成本; 該項目采用了多層結構設計&#xff0c;有利于解耦&#xff0c;包含公共層&#xff0…

Linux入門學習指南

天行健&#xff0c;君子以自強不息&#xff1b;地勢坤&#xff0c;君子以厚德載物。 每個人都有惰性&#xff0c;但不斷學習是好好生活的根本&#xff0c;共勉&#xff01; 文章均為學習整理筆記&#xff0c;分享記錄為主&#xff0c;如有錯誤請指正&#xff0c;共同學習進步。…

MySQL數據庫整體知識點簡述

目錄 第一章&#xff1a;數據庫系統概述 第二章&#xff1a;信息與數據模型 第3章 關系模型與關系規范化理論 第四章——數據庫設計方法 第六-七章——MySQL存儲引擎與數據庫操作管理 第九章——索引 第10章——視圖 第11章——MySQL存儲過程與函數 第12章——MySQL 觸…

【SIPMRCP】freeswitch中的transfer和bridge有什么區別

在FreeSWITCH中&#xff0c;transfer和bridge是兩個用于處理通話的不同概念&#xff0c;它們之間的主要區別體現在功能和用途上。以下是關于這兩個概念的清晰解釋和區別&#xff1a; transfer&#xff08;轉移&#xff09; 功能&#xff1a;transfer主要用于將通話從一個目標…

IIS7整合Tomcat9服務器,并搭建ASP+PHP+JSP完整運行環境

本文以Windows Vista系統為例&#xff0c;詳細講解IIS7整合Tomcat服務器&#xff0c;同時支持ASPPHPJSP三種Web動態網頁技術的方法。 Vista系統自帶的IIS版本為7.0&#xff0c;能安裝的IE瀏覽器的最高版本為IE9。IE9也是Vue2前端框架支持的最低瀏覽器版本。 【準備工作】 去微…

【TB作品】msp430g2553單片機,讀取GY-30光強,串口發送

硬件 //GY-30 //SCL–P1.4 //SDA–P1.5 //VCC–3.3V //GND–GND //ADDR–不接 部分程序 #include <msp430.h> #include "gy30.h"void Send_Byte(char data) {while (!(IFG2 & UCA0TXIFG)); // USCI_A0 TX buffer ready?UCA0TXBUF data…

藍橋杯物聯網競賽_STM32L071_20_用printf將數據顯示在OLED上

需求&#xff1a; 第十五屆國賽確實有點變態&#xff0c;顯示部分大概有6個所以需要大量將sprintf與OLED_ShowString配合使用才能顯示相應格式的數據&#xff0c;所以我在想能不能簡化一下這一部分直接用寫好的printf語句將數據顯示到顯示屏上呢&#xff1f; 代碼&#xff1a…

樹--搜索二叉樹

現有一棵結點數目為n的二叉樹&#xff0c;采用二叉鏈表的形式存儲。對于每個結點均有指向左右孩子的兩個指針域&#xff0c;而結點為n的二叉樹一共有n-1條有效分支路徑。那么&#xff0c;則二叉鏈表中存在2n-(n-1)n1個空指針域。那么&#xff0c;這些空指針造成了空間浪費。 例…

【TB作品】msp430g2553單片機,秒表,LCD1602,Proteus仿真

功能 秒表 動圖&#xff1a; 部分代碼 這段代碼是用C語言編寫的&#xff0c;用于在基于德州儀器MSP430微控制器的平臺上實現一個簡易的電子秒表功能。 #include <msp430.h> #include "LCD.h"unsigned int second 0; unsigned int millisecond10…

【HarmonyOS】應用振動效果實現

一、問題背景&#xff1a; 應用在強提醒場景下&#xff0c;一般會有馬達振動的效果&#xff0c;提示用戶注意力的關注。 比如消息提醒&#xff0c;掃碼提示&#xff0c;刪除鍵確認提示等。 針對高定制化或者固定的振動方式&#xff0c;我們需要有不同的方案實現&#xff0c;馬…

php項目加密源碼

軟件簡介 壓縮包里有多少個php就會被加密多少個PHP、php無需安裝任何插件。源碼全開源 如果上傳的壓縮包里有子文件夾&#xff08;子文件夾里的php文件也會被加密&#xff09;&#xff0c;加密后的壓縮包需要先修復一下&#xff0c;步驟&#xff1a;打開壓縮包 》 工具 》 修…

【云原生】Kubernetes----Ingress對外服務

目錄 引言 一、K8S對外方式 &#xff08;一&#xff09;NodePort 1.作用 2.弊端 3.示例 &#xff08;二&#xff09;externalIPs 1.作用 2.弊端 3.示例 &#xff08;三&#xff09;LoadBalancer 1.作用 2.弊端 &#xff08;四&#xff09;Ingress 二、Ingress的…

Linux文件I/O與標準I/O緩沖機制及性能分析

目錄 1、文件I/O 1.1、數據緩沖機制 1.2、性能影響 2、標準I/O 2.1、數據緩沖機制 2.2、性能影響 3、文件I/O與標準I/O的對比 在Linux中&#xff0c;文件I/O和標準I/O是兩種常見的I/O操作方式&#xff0c;它們在數據緩沖的原理和機制上有所不同。理解這些原理和機制對優…

gitea的git庫備份與恢復

文章目錄 gitea庫的備份與恢復概述筆記實驗環境更新git for windows更新 TortoiseGit備份已經存在的gitea的git庫目錄使用gitea本身來備份所有git庫目錄將gitea庫恢復到新目錄m1m2m3啟動gitea - 此時已經恢復完成FETCH_HEAD 中有硬寫位置再查一下app.ini, 是否改漏了。m1m2 總結…