Spring Boot + Lua = 王炸!

来源:https://www.cnblogs.com/javastack/p/18010701
-Advertisement-
Play Games

曾經有一位魔術師,他擅長將Spring Boot和Redis這兩個強大的工具結合成一種令人驚嘆的組合。他的魔法武器是Redis的Lua腳本。 今天,我們將揭開這個魔術師的秘密,探討如何在Spring Boot項目中使用Lua腳本,以解鎖新的可能性和提高性能。如果你一直在尋找提升你的應用程式的方法,那 ...


曾經有一位魔術師,他擅長將Spring Boot和Redis這兩個強大的工具結合成一種令人驚嘆的組合。他的魔法武器是Redis的Lua腳本。

今天,我們將揭開這個魔術師的秘密,探討如何在Spring Boot項目中使用Lua腳本,以解鎖新的可能性和提高性能。如果你一直在尋找提升你的應用程式的方法,那麼這篇博客將為你揭示其中的神奇之處。

推薦一個開源免費的 Spring Boot 實戰項目:

https://github.com/javastacks/spring-boot-best-practice

第一部分:Lua腳本簡介

當涉及Lua編程時,以下是對前述12個關鍵概念的詳細說明,附帶Lua代碼示例以幫助你更深入瞭解這門編程語言:

註釋:

註釋在Lua中用於添加說明和註解。單行註釋以--開始,多行註釋則使用--[[ ... ]]

-- 這是一條單行註釋

--[[ 
    這是一個多行註釋
    可以跨越多行
]]

變數:

變數在Lua中無需顯式聲明類型。使用local關鍵字創建局部變數,全局變數直接聲明。

local age = 30
name = "John" -- 全局變數

數據類型:

基本數據類型包括整數、浮點數、字元串、布爾值和nil。

表是一種非常靈活的數據結構。

local num = 42
local str = "Hello, Lua!"
local flag = true
local empty = nil
local person = { name = "John", age = 30 }

控制結構:

條件語句:使用if、else和elseif來實現條件分支。

if age < 18 then
    print("未成年")
elseif age >= 18 and age < 65 then
    print("成年")
else
    print("老年")
end

迴圈結構:Lua支持for迴圈、while迴圈和repeat...until迴圈。

for i = 1, 5 do
    print(i)
end

local count = 0
while count < 3 do
    print("迴圈次數: " .. count)
    count = count + 1
end

repeat
    print("至少執行一次")
until count > 5

函數:

函數在Lua中使用function關鍵字定義,可以接受參數並返回值。

function add(a, b)
    return a + b
end

local result = add(5, 3)
print("5 + 3 = " .. result)

表(table):

表是Lua的核心數據結構,用花括弧{}定義。

表可以包含鍵值對,鍵和值可以是任何數據類型。

local person = { name = "John", age = 30, hobbies = {"Reading", "Gaming"} }
print("姓名:" .. person.name)
print("年齡:" .. person.age)

模塊:

Lua支持模塊化編程,允許將相關功能封裝在獨立的模塊中,並通過require關鍵字載入它們。示例略顯複雜,請參考Lua模塊的標準用法以獲得詳細示例。

字元串操作:

Lua提供了許多字元串處理函數,例如string.sub用於截取子串,string.find用於查找字元串中的子串等。

local text = "Lua programming"
local sub = string.sub(text, 1, 3)
print(sub) -- 輸出 "Lua"

錯誤處理:

錯誤處理通常使用pcall函數來包裹可能引發異常的代碼塊,以捕獲並處理錯誤。這通常與assert一起使用。

local success, result = pcall(function()
    error("出錯了!")
end)

if success then
    print("執行成功")
else
    print("錯誤信息: " .. result)
end

標準庫:

Lua標準庫包含豐富的功能,如文件操作、網路編程、正則表達式、時間處理等。你可以通過內置的模塊來使用這些功能,如io、socket等。

總之,Lua是一種靈活的編程語言,其簡潔性和強大的表格數據結構使其在各種應用中具有廣泛的用途。這些示例代碼應該有助於更好地理解Lua的基本概念和語法。

第二部分:為什麼選擇Lua腳本

Lua腳本在Redis中的使用有許多優勢,使其成為執行複雜操作的理想選擇。以下是一些主要原因:

  • 性能:

Lua腳本在Redis中執行,避免了多次的客戶端與伺服器之間的通信。這可以減少網路開銷,提高性能,特別是在需要執行多個Redis命令以完成一個操作時。原子性:Redis保證Lua腳本的原子性執行,無需擔心競態條件或併發問題。

  • 事務:

Lua腳本可以與Redis事務一起使用,確保一系列命令的原子性執行。這允許你將多個操作視為一個單一的事務,要麼全部成功,要麼全部失敗。

  • 複雜操作:

Lua腳本提供了一種在Redis中執行複雜操作的方法,允許你在一個腳本中組合多個Redis命令。這對於處理複雜的業務邏輯非常有用,例如計算和更新分散式計數器、實現自定義數據結構等。

  • 原子鎖:

使用Lua腳本,你可以實現複雜的原子鎖,而不僅僅是使用Redis的SETNX(set if not exists)命令。這對於分散式鎖的實現非常重要。

  • 減少網路開銷:

對於大批量的數據處理,Lua腳本可以減少客戶端和伺服器之間的往返次數,從而顯著減少網路開銷。

  • 減少伺服器負載:

通過將複雜的計算移至伺服器端,可以減輕客戶端的負擔,降低伺服器的負載。

  • 原生支持:

Redis天生支持Lua腳本,因此不需要額外的插件或擴展。

  • 可讀性和維護性:

Lua腳本是一種常見的腳本語言,易於編寫和維護。將複雜邏輯封裝在腳本中有助於提高代碼的可讀性。

總之,Lua腳本在Redis中的優勢在於它可以原子性地執行複雜操作、減少網路通信、提高性能、減輕伺服器負載,以及提高代碼的可讀性。這使得它成為執行一系列複雜操作的理想選擇,尤其是在分散式系統中需要高性能和可伸縮性的場景下。通過Lua腳本,Redis不僅成為一個鍵值存儲,還能執行複雜的數據操作。

第三部分:lua腳本的應用場景

Lua腳本在Redis中有廣泛的應用場景,以下是一些示例場景,展示了Lua腳本的實際用途:

1. 緩存更新:

場景:在緩存中存儲某些數據,但需要定期或基於條件更新這些數據,同時確保在更新期間不會發生併發問題。

示例:使用Lua腳本,你可以原子性地檢查數據的新鮮度,如果需要更新,可以在一個原子性操作中重新計算數據並更新緩存。

local cacheKey = KEYS[1] -- 獲取緩存鍵
local data = redis.call('GET', cacheKey) -- 嘗試從緩存獲取數據
if not data then
    -- 數據不在緩存中,重新計算並設置
    data = calculateData()
    redis.call('SET', cacheKey, data)
end
return data

2. 原子操作:

場景:需要執行多個Redis命令作為一個原子操作,確保它們在多線程或多進程環境下不會被中斷。

示例:使用Lua腳本,你可以將多個命令組合成一個原子操作,如實現分散式鎖、計數器、排行榜等。

local key = KEYS[1] -- 獲取鍵名
local value = ARGV[1] -- 獲取參數值
local current = redis.call('GET', key) -- 獲取當前值
if not current or tonumber(current) < tonumber(value) then
    -- 如果當前值不存在或新值更大,設置新值
    redis.call('SET', key, value)
end

3. 數據處理:

場景:需要對Redis中的數據進行複雜的處理,如統計、篩選、聚合等。

示例:使用Lua腳本,你可以在Redis中執行複雜的數據處理,而不必將數據傳輸到客戶端進行處理,減少網路開銷。

local keyPattern = ARGV[1] -- 獲取鍵名的匹配模式
local keys = redis.call('KEYS', keyPattern) -- 獲取匹配的鍵
local result = {}
for i, key in ipairs(keys) do
    local data = redis.call('GET', key) -- 獲取每個鍵對應的數據
    -- 處理數據並添加到結果中
    table.insert(result, processData(data))
end
return result

4. 分散式鎖:

場景:實現分散式系統中的鎖機制,確保只有一個客戶端可以執行關鍵操作。

示例:使用Lua腳本,你可以原子性地嘗試獲取鎖,避免競態條件,然後在完成後釋放鎖。

local lockKey = KEYS[1] -- 獲取鎖的鍵名
local lockValue = ARGV[1] -- 獲取鎖的值
local lockTimeout = ARGV[2] -- 獲取鎖的超時時間
if redis.call('SET', lockKey, lockValue, 'NX', 'PX', lockTimeout) then
    -- 鎖獲取成功,執行關鍵操作
    -- ...
    redis.call('DEL', lockKey) -- 釋放鎖
    return true
else
    return false -- 無法獲取鎖

這些場景只是Lua腳本在Redis中的應用之一。Lua腳本允許你在Redis中執行更複雜的操作,而無需進行多次的網路通信,從而提高性能和可伸縮性,同時確保數據的一致性和原子性。這使得Lua成為Redis的強大工具,用於處理各種分散式系統需求。

第四部分:Lua腳本在Spring Boot中的實現

在Spring Boot中實現Lua腳本的執行主要涉及Spring Data Redis和Lettuce(或Jedis)客戶端的使用。以下是編寫、載入和執行Lua腳本的步驟和示例:

  • 添加依賴:

首先,在Spring Boot項目的pom.xml中,添加Spring Data Redis和Lettuce(或Jedis)的依賴。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>io.lettuce.core</groupId>
    <artifactId>lettuce-core</artifactId> <!-- 或使用Jedis -->
</dependency>
  • 配置Redis連接:

在application.properties或application.yml中配置Redis連接屬性,包括主機、埠、密碼等。

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=yourPassword
  • 創建Lua腳本:

創建一個Lua腳本,以執行你需要的操作。將腳本保存在Spring Boot項目的合適位置。

例如,假設你有一個Lua腳本文件myscript.lua,它實現了一個簡單的計算:

local a = tonumber(ARGV[1])
local b = tonumber(ARGV[2])
return a + b
  • 編寫Java代碼:

在Spring Boot應用中,編寫Java代碼以載入和執行Lua腳本。使用Spring Data Redis提供的StringRedisTemplateLettuceConnectionFactory

提供兩種不同的示例來執行Lua腳本,一種是直接運行Lua腳本字元串,另一種是運行腳本文件。以下是這兩種示例:

運行Lua腳本字元串:

@Service
public class LuaScriptService {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public Integer executeLuaScriptFromString() {
        String luaScript = "local a = tonumber(ARGV[1])\nlocal b = tonumber(ARGV[2])\nreturn a + b";
        RedisScript<Integer> script = new DefaultRedisScript<>(luaScript, Integer.class);
        String[] keys = new String[0]; // 通常情況下,沒有KEYS部分
        Object[] args = new Object[]{10, 20}; // 傳遞給Lua腳本的參數
        Integer result = stringRedisTemplate.execute(script, keys, args);
        return result;
    }
}

運行Lua腳本文件:

首先,將Lua腳本保存到文件,例如myscript.lua。

然後,創建一個Java類來載入和運行該腳本文件:

@Service
public class LuaScriptService {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private ResourceLoader resourceLoader;

    public Integer executeLuaScriptFromFile() {
        Resource resource = resourceLoader.getResource("classpath:myscript.lua");
        String luaScript;
        try {
            luaScript = new String(resource.getInputStream().readAllBytes());
        } catch (Exception e) {
            throw new RuntimeException("Unable to read Lua script file.");
        }
        
        RedisScript<Integer> script = new DefaultRedisScript<>(luaScript, Integer.class);
        String[] keys = new String[0]; // 通常情況下,沒有KEYS部分
        Object[] args = new Object[]{10, 20}; // 傳遞給Lua腳本的參數
        Integer result = stringRedisTemplate.execute(script, keys, args);
        return result;
    }
}

通過這兩種示例,你可以選擇要執行Lua腳本的方式,是直接在Java代碼中定義腳本字元串,還是從文件中讀取腳本。

  • 運行應用程式:

啟動Spring Boot應用程式,然後可以調用LuaScriptService中的executeLuaScript方法來執行Lua腳本。

這個示例中,我們首先註入了StringRedisTemplate,然後創建了一個RedisScript對象,傳遞Lua腳本和期望的結果類型。在execute方法中,我們傳遞了Lua腳本中需要的參數。這個方法將載入並執行Lua腳本,並返回結果。

通過這些步驟,你可以在Spring Boot應用程式中實現Lua腳本的編寫、載入和執行。這使你能夠在Redis中執行自定義操作,從而更好地控制和擴展你的應用程式。

第五部分:Lua腳本來提高Spring Boot應用程式的性能

使用Lua腳本可以顯著提高Spring Boot應用程式的性能,尤其是在與Redis交互方面。以下是如何使用Lua腳本來實現性能優化的幾種方法:

1. 減少網路開銷:

  • Redis是記憶體資料庫,數據存儲在記憶體中,而網路通信通常是Redis操作的性能瓶頸之一。通過使用Lua腳本,你可以將多個操作組合成一個原子操作,從而減少了多次的網路往返次數。這對於需要執行多個Redis命令以完成一個操作的情況非常有用。

2. 原子操作:

  • Lua腳本的執行是原子的,這意味著在Lua腳本執行期間,沒有其他客戶端可以插入其他操作。這使得Lua腳本在實現諸如分散式鎖、計數器、排行榜等需要原子操作的情況下非常有用。

例如,考慮一個計數器的場景,多個客戶端需要原子性地增加計數。使用Lua腳本,你可以實現原子遞增:

local key = KEYS[1]
local increment = ARGV[1]
return redis.call('INCRBY', key, increment)

3. 複雜操作:

  • Lua腳本允許你在Redis伺服器端執行複雜的數據處理。這減少了將數據傳輸到客戶端進行處理的開銷,並允許你在Redis中執行更複雜的邏輯,從而提高性能。

例如,你可以使用Lua腳本來處理存儲在多個鍵中的數據並返回聚合結果:

local total = 0
for _, key in ipairs(KEYS) do
    local value = redis.call('GET', key)
    total = total + tonumber(value)
end
return total

4. 事務:

  • 與Lua腳本一起使用事務可以確保一系列Redis命令的原子性執行。這對於需要一組操作要麼全部成功,要麼全部失敗的情況非常重要。

例如,你可以使用Lua腳本在事務中執行一系列更新操作,如果其中一個操作失敗,整個事務將回滾:

local key1 = KEYS[1]
local key2 = KEYS[2]
local value = ARGV[1]

redis.call('SET', key1, value)
redis.call('INCRBY', key2, value)

-- 如果這裡的任何一步失敗,整個事務將回滾

總之,使用Lua腳本可以大大提高Spring Boot應用程式與Redis之間的性能。它減少了網路開銷,允許執行原子操作,執行複雜操作並實現事務,這些都有助於提高應用程式的性能和可伸縮性。因此,Lua腳本是在與Redis交互時實現性能優化的有力工具。

第六部分:錯誤處理和安全性

處理Lua腳本中的錯誤和確保全全性在與Redis交互時非常重要。以下是如何處理這些問題的一些建議:

錯誤處理:

  • 錯誤返回值: Lua腳本在執行期間可能會遇到錯誤,例如腳本本身存在語法錯誤,或者在腳本中的某些操作失敗。Redis執行Lua腳本後,會返回腳本的執行結果。你可以檢查這個結果以查看是否有錯誤,通常返回值是一個特定的錯誤標識。例如,如果腳本執行成功,返回值通常是OK,否則會有相應的錯誤信息。
  • 異常處理: 在Spring Boot應用程式中,你可以使用異常處理來捕獲Redis執行腳本時可能拋出的異常。Spring Data Redis提供了一些異常類,如RedisScriptExecutionException,用於處理腳本執行期間的錯誤。你可以使用try-catch塊來捕獲這些異常並採取相應的措施,例如記錄錯誤信息或執行備用操作。

安全性:

  • 參數驗證: 在執行Lua腳本之前,始終驗證傳遞給腳本的參數。確保參數是合法的,並且不包含惡意代碼。避免將不受信任的用戶輸入直接傳遞給Lua腳本,因為它可能包含惡意的Lua代碼。
  • 限制許可權: 在Redis伺服器上配置適當的許可權,以限制對Lua腳本的執行。確保只有授權的用戶能夠執行腳本,並且不允許執行具有破壞性或不安全操作的腳本。
  • 白名單: 如果你允許動態載入Lua腳本,確保只有受信任的腳本可以執行。你可以創建一個白名單,只允許執行白名單中的腳本,防止執行未經審核的腳本。
  • 沙盒模式: 一些Redis客戶端庫支持將Lua腳本運行在沙盒模式下,以限制其訪問和執行許可權。在沙盒模式下,腳本無法執行危險操作,如文件訪問。
  • 監控日誌: 記錄Redis執行Lua腳本的相關信息,包括誰執行了腳本以及執行的腳本內容。這有助於跟蹤執行情況併發現潛在的安全問題。

總之,處理Lua腳本中的錯誤和確保全全性是非常重要的。通過適當的錯誤處理和安全措施,你可以確保Lua腳本在與Redis交互時不會引入潛在的問題,並提高應用程式的穩定性和安全性。

第七部分:最佳實踐和建議

在Spring Boot項目中成功使用Lua腳本來實現Redis功能,以下是一些最佳實踐和建議:

維護文檔和註釋:

  • 保持Lua腳本和相關代碼的文檔和註釋清晰明瞭。這有助於其他開發人員理解腳本的目的和用法。

參數驗證:

  • 始終驗證傳遞給Lua腳本的參數。確保它們是合法的、安全的,並不包含惡意代碼。

白名單:

  • 如果可能,建議創建一個白名單,只允許執行經過審核的腳本。這有助於防止執行未經授權的腳本。

錯誤處理:

  • 針對Lua腳本的執行,實施恰當的錯誤處理機制。捕獲和處理執行期間可能出現的異常,以便記錄錯誤信息或採取適當的措施。

測試:

  • 在實際應用之前,務必對Lua腳本進行徹底的單元測試。確保腳本按預期執行,併在各種情況下具有預期的行為。

許可權控制:

  • 在Redis伺服器上實施適當的許可權控制,限制對Lua腳本的執行。只允許授權用戶或應用程式執行腳本,並避免執行危險操作。

性能優化:

  • 使用Lua腳本來減少網路開銷,執行原子操作,處理複雜操作以提高性能。確保腳本有效地減少了與Redis伺服器的交互次數。

版本管理:

  • 對Lua腳本實施版本管理,以便能夠輕鬆地追蹤和回滾腳本的更改。

監控和日誌:

  • 在Redis執行Lua腳本時,記錄相關信息並監控執行情況。這有助於跟蹤性能和安全問題。

備份方案:

  • 針對關鍵操作,考慮實現備份和容錯方案,以防止腳本執行失敗或Redis故障。

合理使用Lua腳本:

  • Lua腳本是一種強大的工具,但不應該被濫用。只在需要原子性、性能優化或複雜操作時使用它。

學習Lua編程:

  • 如果你不熟悉Lua編程語言,建議學習Lua的基礎知識,以便更好地編寫和理解Lua腳本。

通過遵循這些最佳實踐和建議,你可以更安全、高效地使用Lua腳本來實現Redis功能,並確保你的Spring Boot項目與Redis的交互是可靠和可維護的。

版權聲明:本文為CSDN博主「一隻牛博」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/Mrxiao_bo/article/details/133783127

更多文章推薦:

1.Spring Boot 3.x 教程,太全了!

2.2,000+ 道 Java面試題及答案整理(2024最新版)

3.免費獲取 IDEA 激活碼的 7 種方式(2024最新版)

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 封裝WINDOWS10系統 一、準備工具: 1、安裝NTLite。下載鏈接:https://www.ntlite.com/download/ 2、準備一個ISO的PE例如:FirPE。下載鏈接https://firpe.cn/page-247 3、安裝VMware 4、下載封裝工具Easy Sysp ...
  • 瀏覽器每次打開都有個煩人的提示要獲取將來的 microsoft edge 更新,需要 macos 10.15 或更高版本,找了很久也沒有解決辦法,有 windows 端的解決方案,有禁止更新的解決方案,就是沒有 Mac 上如何避免這個告警的方案,於是走上 Edge 定製化之旅。 效果 使用前後對比 ...
  • 在 Linux 中,你可以使用 alias 命令來設置別名。別名允許你為常用的命令創建自定義的縮寫或快捷方式。這些別名會存在於當前會話中,如果你希望使別名永久生效,可以將其添加到你的 shell 配置文件中(例如 .bashrc、.bash_profile、.zshrc 等)。 1、查看已有別名 通 ...
  • 硬體開發板:STM32G0B1RET6 軟體平臺:cubemax+keil+VScode 內容原著聲明 代碼借鑒學習於以下文章: STM32 使用硬體IIC驅動0.96寸4針IOLED顯示器(HAL庫) 1 新建cubemax工程 1.1 配置系統時鐘RCC 1.2 配置引腳 1.3 導出工程 略. ...
  • Java 迴圈 迴圈可以執行一個代碼塊,只要達到指定的條件。迴圈很方便,因為它們節省時間,減少錯誤,並使代碼更易讀。 Java While 迴圈 while 迴圈會迴圈執行一個代碼塊,只要指定的條件為真: 語法 while (condition) { // 要執行的代碼塊 } 在下麵的示例中,只要變 ...
  • 本篇文章將帶大家運行 Flink 最簡單的程式 WordCount。先實踐後理論,對其基本輸入輸出、編程代碼有初步瞭解,後續篇章再對 Flink 的各種概念和架構進行介紹。 下麵將從創建項目開始,介紹如何創建出一個 Flink 項目;然後從 DataStream 流處理和 FlinkSQL 執行兩種... ...
  • 背景 項目當中需要進行業務時間的校驗,如上午 9:00-下午 17:00,在 9:00 前或 17:00 後是不能處理相關業務的。因此在業務校驗的 Service 中定義了一個 checkBizTime() 方法。原本代碼如下: public void checkBizTime() { Date c ...
  • 本文介紹在Visual Studio軟體中配置、編譯C++環境下matplotlibcpp庫的詳細方法。 matplotlibcpp庫是一個C++環境下的繪圖工具,其通過調用Python介面,實現在C++代碼中通過matplotlib庫的命令繪製各類圖像。由於其需要調用Python介面,因此在配置m ...
一周排行
    -Advertisement-
    Play Games
  • 隨著Aspire發佈preview5的發佈,Microsoft.Extensions.ServiceDiscovery隨之更新, 服務註冊發現這個屬於老掉牙的話題解決什麼問題就不贅述了,這裡主要講講Microsoft.Extensions.ServiceDiscovery(preview5)以及如何 ...
  • 概述:通過使用`SemaphoreSlim`,可以簡單而有效地限制非同步HTTP請求的併發量,確保在任何給定時間內不超過20個網頁同時下載。`ParallelOptions`不適用於非同步操作,但可考慮使用`Parallel.ForEach`,儘管在非同步場景中謹慎使用。 對於併發非同步 I/O 操作的數量 ...
  • 1.Linux上安裝Docken 伺服器系統版本以及內核版本:cat /etc/redhat-release 查看伺服器內核版本:uname -r 安裝依賴包:yum install -y yum-utils device-mapper-persistent-data lvm2 設置阿裡雲鏡像源:y ...
  • 概述:WPF界面綁定和渲染大量數據可能導致性能問題。通過啟用UI虛擬化、非同步載入和數據分頁,可以有效提高界面響應性能。以下是簡單示例演示這些優化方法。 在WPF中,當你嘗試綁定和渲染大量的數據項時,性能問題可能出現。以下是一些可能導致性能慢的原因以及優化方法: UI 虛擬化: WPF提供了虛擬化技術 ...
  • 引言 上一章節介紹了 TDD 的三大法則,今天我們講一下在單元測試中模擬對象的使用。 Fake Fake - Fake 是一個通用術語,可用於描述 stub或 mock 對象。 它是 stub 還是 mock 取決於使用它的上下文。 也就是說,Fake 可以是 stub 或 mock Mock - ...
  • 為.net6在CentOS7上面做準備,先在vmware虛擬機安裝CentOS 7.9 新建CentOS764位的系統 因為CentOS8不更新了,所以安裝7;簡單就一筆帶過了 選擇下載好的操作系統的iso文件,下載地址https://mirrors.aliyun.com/centos/7.9.20 ...
  • 經過前面幾篇的學習,我們瞭解到指令的大概分類,如:參數載入指令,該載入指令以 Ld 開頭,將參數載入到棧中,以便於後續執行操作命令。參數存儲指令,其指令以 St 開頭,將棧中的數據,存儲到指定的變數中,以方便後續使用。創建實例指令,其指令以 New 開頭,用於在運行時動態生成並初始化對象。方法調用指... ...
  • LiteDB 是一個輕量級的嵌入式 NoSQL 資料庫,其設計理念與 MongoDB 類似,但它是完全使用 C# 開發的,因此與 C# 應用程式的集成非常順暢。與 SQLite 相比,LiteDB 提供了 NoSQL(即鍵值對)的數據存儲方式,並且是一個開源且免費的項目。它適用於桌面、移動以及 We ...
  • 1 開源解析和拆分文檔 第三方的工具去對文件解析拆分,去將我們的文件內容給提取出來,並將我們的文檔內容去拆分成一個小的chunk。常見的PDF word mark down, JSON、HTML。都可以有很好的一些模塊去把這些文件去進行一個東西去提取。 優勢 支持豐富的文檔類型 每種文檔多樣化選擇 ...
  • OOM是什麼?英文全稱為 OutOfMemoryError(記憶體溢出錯誤)。當程式發生OOM時,如何去定位導致異常的代碼還是挺麻煩的。 要檢查OOM發生的原因,首先需要瞭解各種OOM情況下會報的異常信息。這樣能縮小排查範圍,再結合異常堆棧、heapDump文件、JVM分析工具和業務代碼來判斷具體是哪 ...