redis 知識點收集 註意理解底層

来源:https://www.cnblogs.com/ITjieduwu/archive/2022/04/12/16137990.html
-Advertisement-
Play Games

package scanner;import java.util.Scanner;public class Demo4 { public static void main(String[] args){ Scanner s4=new Scanner(System.in); //從鍵盤接收數據 int ...


學redis,首先要明白其特性,其次要理解明白redis與操作系統底層的關係,這點很重要。這是一個優秀的學習方法,作為電腦專業,應當時刻想著技術和操作系統電腦組成數據結構的聯繫,聽起來有些書生氣死板,但百利無一害,這不就是研究一個技術的過程嗎,我們一開始就這樣想這樣行動,可以極大幫助我們快速掌握甚至精通技術,不然就得等需要的時候再研究,這樣肯定沒有前者效率高。這樣還能自我正反饋,所要學的和已學的進行複習回顧打牢電腦基礎,提升電腦素養,這點尤為重要。

 

 

 

1、什麼是 Redis ?簡述它的優缺點?
Redis 的全稱是: Remote Dictionary.Server ,本質上是一個 Key-Value 類型的記憶體資料庫,很像 memcached ,整個資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫數據 flush 到硬碟 上進行保存。
因為是純記憶體操作, Redis 的性能非常出色,每秒可以處理超過 10 萬次讀寫操作,是已知性能最快的 Key-Value DB。
Redis 的出色之處不僅僅是性能, Redis 最大的魅力是支持保存多種數據結構,此外單個 value 的最大限 制是 1GB ,不像 memcached 只能保存 1MB 的數據,因此 Redis 可以用來實現很多有用的功能。
比方說用他的 List 來做 FIFO 雙向鏈表,實現一個輕量級的高性 能消息隊列服務,用他的 Set 可以做高 性能的 tag 系統等等。
另外 Redis 也可以對存入的 Key-Value 設置 expire 時間,因此也可以被當作一 個功能加強版的 memcached 來用。 Redis 的主要缺點是資料庫容量受到物理記憶體的限制,不能用作海量數據的高性能 讀寫,因此 Redis 適合的場景主要局限在較小數據量的高性能操作和運算上。
2、 Redis 與 memcached 相比有哪些優勢?
1.memcached 所有的值均是簡單的字元串, redis 作為其替代者,支持更為豐富的數據類型
2.redis 的速度比 memcached 快很多 redis 的速度比 memcached 快很多
3.redis 可以持久化其數據 redis 可以持久化其數據
3、 Redis 支持哪幾種數據類型?
String、 List、 Set、 Sorted Set、 hashes
4、 Redis 主要消耗什麼物理資源?
記憶體。
5、 Redis 有哪幾種數據淘汰策略? 1.noeviction:返回錯誤當記憶體限制達到,並且客戶端嘗試執行會讓更多記憶體被使用的命令。 2.allkeys-lru: 嘗試回收最少使用的鍵( LRU ),使得新添加的數據有空間存放。
3.volatile-lru: 嘗試回收最少使用的鍵( LRU ),但僅限於在過期集合的鍵,使得新添加的數據有空間存 放。
4.allkeys-random: 回收隨機的鍵使得新添加的數據有空間存放。
5.volatile-random: 回收隨機的鍵使得新添加的數據有空間存放,但僅限於在過期集合的鍵。 6.volatile-ttl: 回收在過期集合的鍵,並且優先回收存活時間(TTL)較短的鍵,使得新添加的數據有空間 存放。
6、 Redis 官方為什麼不提供 Windows 版本?
因為目前 Linux 版本已經相當穩定,而且用戶量很大,無需開發 windows 版本,反而會帶來相容性等問 題。
7、一個字元串類型的值能存儲最大容量是多少? 512M
8、為什麼 Redis 需要把所有數據放到記憶體中?
Redis 為了達到最快的讀寫速度將數據都讀到記憶體中,並通過非同步的方式將數據寫入磁碟。
所以 redis 具有快速和數據持久化的特征,如果不將數據放在記憶體中,磁碟 I/O 速度為嚴重影響redis 的 性能。
在記憶體越來越便宜的今天, redis 將會越來越受歡迎, 如果設置了最大使用的記憶體,則數據已有記錄數達 到記憶體限值後不能繼續插入新值。
9、 Redis 集群方案應該怎麼做?都有哪些方案?
1.codis
2.目前用的最多的集群方案,基本和 twemproxy 一致的效果,但它支持在節點數量改變情況下,舊節點 數據可恢復到新 hash 節點。
redis cluster3.0 自帶的集群,特點在於他的分散式演算法不是一致性 hash ,而是 hash 槽的概念,以及自 身支持節點設置從節點。具體看官方文檔介紹。
3.在業務代碼層實現,起幾個毫無關聯的 redis 實例,在代碼層,對 key 進行 hash 計算,然後去對應的 redis 實例操作數據。這種方式對 hash 層代碼要求比較高,考慮部分包括,節點失效後的替代演算法方 案,數據震蕩後的自動腳本恢復,實例的監控,等等。
歡迎工作一到五年的 Java 工程師朋友們加入 Java 進階架構學習交流: 952124565 ,群內提供免費的 Java 架構學習資料(裡面有高可用、高併發、高性能及分散式、 Jvm 性能調優、 Spring 源碼, MyBatis ,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多個知識點的架構資 料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶 惰!趁年輕,使勁拼,給未來的自己一個交代!
10、 Redis 集群方案什麼情況下會導致整個集群不可用?
有 A ,B ,C 三個節點的集群,在沒有複製模型的情況下,如果節點 B 失敗了,那麼整個集群就會以為缺少 5501-11000 這個範圍的槽而不可用。
11、 MySQL 里有 2000w 數據, redis 中只存 20w 的數據,如何保證 redis 中的數據都是熱點數據? redis 記憶體數據集大小上升到一定大小的時候,就會施行數據淘汰策略。
其實面試除了考察 Redis ,不少公司都很重視高併發高可用的技術,特別是一線互聯網公司,分散式、 JVM、 spring 源碼分析、微服務等知識點已是面試的必考題。我自己整理收集了一套系統的架構技術體 系,針對當前互聯網公司的技術需求以及結合主流技術,這些東西可能你們平時在工作中接觸過,但是缺 少的全面系統的學習,加入後端開發群: 943918498 ,或是關註微信公眾號: Java 資訊庫,回覆“架 構”,免費領取架構資料。
12、 Redis 有哪些適合的場景?
( 1 )會話緩存( Session Cache )
最常用的一種使用 Redis 的情景是會話緩存( sessioncache ),用 Redis 緩存會話比其他存儲(如 Memcached )的優勢在於: Redis 提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的 購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?
幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用 Redis 來緩存會話的文檔。甚至廣為 人知的商業平臺 Magento 也提供 Redis 的插件。
( 2 )全頁緩存( FPC )
除基本的會話 token 之外, Redis 還提供很簡便的 FPC 平臺。回到一致性問題,即使重啟了 Redis 實 例,因為有磁碟的持久化,用戶也不會看到頁面載入速度的下降,這是一個極大改進,類似 PHP 本地 FPC。
再次以 Magento 為例, Magento 提供一個插件來使用 Redis 作為全頁緩存後端。
此外,對 WordPress 的用戶來說, Pantheon 有一個非常好的插件wp-redis ,這個插件能幫助你以最快 速度載入你曾瀏覽過的頁面。
( 3 )隊列
Reids 在記憶體存儲引擎領域的一大優點是提供 list 和 set 操作,這使得 Redis 能作為一個很好的消息隊列 平臺來使用。 Redis 作為隊列使用的操作,就類似於本地程式語言(如 Python )對 list 的 push/pop 操作。
如果你快速的在 Google 中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的 就是利用 Redis 創建非常好的後端工具,以滿足各種隊列需求。例如, Celery 有一個後臺就是使用 Redis 作為 broker ,你可以從這裡去查看。
( 4)排行榜/計數器
Redis 在記憶體中對數字進行遞增或遞減的操作實現的非常好。集合( Set )和有序集合( SortedSet)也使 得我們在執行這些操作的時候變的非常簡單, Redis 只是正好提供了這兩種數據結構。
所以,我們要從排序集合中獲取到排名最靠前的 10 個用戶–我們稱之為“user_scores”,我們只需要像 下麵一樣執行即可:
當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執 行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games 就是一個很好的例子,用 Ruby 實現的,它的排行榜就是使用 Redis 來存儲數據的,你可 以在這裡看到。
( 5 )發佈/訂閱
最後(但肯定不是最不重要的)是 Redis 的發佈/訂閱功能。發佈/訂閱的使用場景確實非常多。我已看見 人們在社交網路連接中使用,還可作為基於發佈/訂閱的腳本觸發器,甚至用Redis 的發佈/訂閱功能來建 立聊天系統!
13、 Redis 支持的 Java 客戶端都有哪些?官方推薦用哪個?
Redisson、 Jedis、 lettuce 等等,官方推薦使用 Redisson。
14、 Redis 和 Redisson 有什麼關係?
Redisson 是一個高級的分散式協調 Redis 客服端,能幫助用戶在分散式環境中輕鬆實現一些 Java 的對 象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。
15、 Jedis 與 Redisson 對比有什麼優缺點?
Jedis 是 Redis 的 Java 實現的客戶端,其 API 提供了比較全面的 Redis 命令的支持;
Redisson 實現了分散式和可擴展的 Java 數據結構,和 Jedis 相比,功能較為簡單,不支持字元串操作, 不支持排序、事務、管道、分區等 Redis 特性。 Redisson 的宗旨是促進使用者對 Redis 的關註分離,從 而讓使用者能夠將精力更集中地放在處理業務邏輯上。
16、說說 Redis 哈希槽的概念?
Redis 集群沒有使用一致性 hash,而是引入了哈希槽的概念, Redis 集群有 16384 個哈希槽,每個 key 通 過 CRC16 校驗後對 16384 取模來決定放置哪個槽,集群的每個節點負責一部分 hash 槽。
17、 Redis 集群的主從複製模型是怎樣的?
為了使在部分節點失敗或者大部分節點無法通信的情況下集群仍然可用,所以集群使用了主從複製模型, 每個節點都會有 N-1 個複製品.
18、 Redis 集群會有寫操作丟失嗎?為什麼?
Redis 並不能保證數據的強一致性,這意味這在實際中集群在特定的條件下可能會丟失寫操作。
19、 Redis 集群之間是如何複製的?
非同步複製
20、 Redis 集群最大節點個數是多少?
16384 個
21、 Redis 集群如何選擇資料庫?
Redis 集群目前無法做資料庫選擇,預設在 0 資料庫。
22、 Redis 中的管道有什麼用?
一次請求/響應伺服器能實現處理新的請求即使舊的請求還未被響應,這樣就可以將多個命令發送到服務 器,而不用等待回覆,最後在一個步驟中讀取該答覆。
這就是管道( pipelining ),是一種幾十年來廣泛使用的技術。例如許多 POP3 協議已經實現支持這個功 能,大大加快了從伺服器下載新郵件的過程。
23、怎麼理解 Redis 事務?
事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行,事務在執行的過程中,不會 被其他客戶端發送來的命令請求所打斷。
事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。
24、 Redis 事務相關的命令有哪幾個?
MULTI、 EXEC、 DISCARD、 WATCH
25、 Redis key 的過期時間和永久有效分別怎麼設置?
EXPIRE 和 PERSIST 命令
26、 Redis 如何做記憶體優化?
儘可能使用散列表( hashes),散列表(是說散列表裡面存儲的數少)使用的記憶體非常小,所以你應該 儘可能的將你的數據模型抽象到一個散列表裡面。
比如你的 web 系統中有一個用戶對象,不要為這個用戶的名稱,姓氏,郵箱,密碼設置單獨的key,而是 應該把這個用戶的所有信息存儲到一張散列表裡面。
27、 Redis 回收進程如何工作的?
一個客戶端運行了新的命令,添加了新的數據。
Redi 檢查記憶體使用情況,如果大於 maxmemory 的限制, 則根據設定好的策略進行回收。
一個新的命令被執行,等等。
所以我們不斷地穿越記憶體限制的邊界,通過不斷達到邊界然後不斷地回收回到邊界以下。
如果一個命令的結果導致大量記憶體被使用(例如很大的集合的交集保存到一個新的鍵),不用多久記憶體限 制就會被這個記憶體使用量超越。
28.加鎖機制

咱們來看上面那張圖,現在某個客戶端要加鎖。如果該客戶端面對的是一個 redis cluster 集 群,他首先會根據 hash節點選擇一臺機器。 這裡註意,僅僅只是選擇一臺機器!這點很關 鍵!緊接著,就會發送一段 lua 腳本到redis 上,那段 lua 腳本如下所示:

 


為啥要用 lua 腳本呢?因為一大坨複雜的業務邏輯,可以通過封裝在lua 腳本中發送給redis, 保證這段複雜業務邏輯執行的原子性。
那麼,這段 lua 腳本是什麼意思呢?這裡 KEYS[1]代表的是你加鎖的那個 key,比如說: RLoc k lock = redisson.getLock("myLock");這裡你自己設置了加鎖的那個鎖 key 就是“myLock”。
ARGV[1]代表的就是鎖key 的預設生存時間,預設 30 秒。 ARGV[2]代表的是加鎖的客戶端的 I D,類似於下麵這樣: 8743c9c0-0795-4907-87fd-6c719a6b4586:1
給大家解釋一下,第一段 if 判斷語句,就是用“exists myLock”命令判斷一下,如果你要加鎖 的那個鎖 key 不存在的話,你就進行加鎖。如何加鎖呢?很簡單, 用下麵的命令:hset myLoc k

 

 

8743c9c0-0795-4907-87fd-6c719a6b4586:1 1,通過這個命令設置一個 hash 數據結構,這行 命令執行後,會出現一個類似下麵的數據結構:

 


上述就代表“8743c9c0-0795-4907-87fd-6c719a6b4586:1”這個客戶端對“myLock”這個鎖 key 完 成了加鎖。接著會執行“pexpire myLock 30000”命令,設置 myLock 這個鎖 key 的生存時間 是 30 秒。好了,到此為止, ok,加鎖完成了。


29.鎖互斥機制

那麼在這個時候,如果客戶端 2 來嘗試加鎖,執行了同樣的一段 lua 腳本,會咋樣呢?很簡 單,第一個 if 判斷會執行“exists myLock”,發現 myLock 這個鎖 key 已經存在了。接著第二 個 if 判斷,判斷一下, myLock 鎖 key 的 hash數據結構中,是否包含客戶端 2 的 ID,但是明 顯不是的,因為那裡包含的是客戶端 1 的 ID。
所以,客戶端 2 會獲取到 pttl myLock 返回的一個數字,這個數字代表了myLock 這個鎖key 的剩餘生存時間。 比如還剩 15000 毫秒的生存時間。此時客戶端 2 會進入一個 while 迴圈,不 停的嘗試加鎖。

 

30.watch dog 自動延期機制

客戶端 1 加鎖的鎖 key 預設生存時間才 30 秒,如果超過了30 秒,客戶端 1 還想一直持有這把 鎖,怎麼辦呢?
簡單!只要客戶端 1 一旦加鎖成功,就會啟動一個watch dog 看門狗, 他是一個後臺線程, 會 每隔 10 秒檢查一下,如果客戶端 1 還持有鎖 key,那麼就會不斷的延長鎖 key 的生存時間。

 

31.可重入加鎖機制

那如果客戶端 1 都已經持有了這把鎖了,結果可重入的加鎖會怎麼樣呢?比如下麵這種代碼:


這時我們來分析一下上面那段 lua 腳本。 第一個 if判斷肯定不成立,“exists myLock”會顯示鎖 key 已經存在了。 第二個 if判斷會成立,因為 myLock 的 hash數據結構中包含的那個 ID,就 是客戶端 1 的那個 ID,也就是“8743c9c0-0795-4907-87fd-6c719a6b4586:1”


此時就會執行可重入加鎖的邏輯,他會用:incrby myLock 8743c9c0-0795-4907-87fd-6c71a6b4586:1 1 ,通過這個命令,對客戶端 1 的加鎖次數,累加 1。此時 myLock 數據結構變為下麵這樣:

大家看到了吧,那個 myLock 的 hash數據結構中的那個客戶端 ID,就對應著加鎖的次數

32.釋放鎖機制

如果執行 lock.unlock(),就可以釋放分散式鎖,此時的業務邏輯也是非常簡單的。其實說白 了,就是每次都對 myLock 數據結構中的那個加鎖次數減 1。如果發現加鎖次數是 0 了,說明 這個客戶端已經不再持有鎖了,此時就會用: “del myLock”命令,從 redis 里刪除這個 key。 然後呢,另外的客戶端 2 就可以嘗試完成加鎖了。這就是所謂的分散式鎖的開源 Redisson 框 架的實現機制。
一般我們在生產系統中,可以用 Redisson 框架提供的這個類庫來基於 redis 進行分散式鎖的加 鎖與釋放鎖。
33.上述 Redis 分散式鎖的缺點

其實上面那種方案最大的問題,就是如果你對某個 redis master 實例,寫入了myLock 這種鎖 key 的 value,此時會非同步複製給對應的 master slave 實例。但是這個過程中一旦發生 redis m aster 宕機,主備切換, redis slave 變為了 redis master。
接著就會導致,客戶端 2 來嘗試加鎖的時候,在新的 redis master 上完成了加鎖,而客戶端 1 也以為自己成功加了鎖。此時就會導致多個客戶端對一個分散式鎖完成了加鎖。這時系統在業 務語義上一定會出現問題, 導致各種臟數據的產生。
所以這個就是 redis cluster,或者是 redis master-slave 架構的主從非同步複製導致的 redis 分佈 式鎖的最大缺陷: 在 redis master實例宕機的時候, 可能導致多個客戶端同時完成加鎖。

34.使用過 Redis 分散式鎖麽,它是怎麼實現的?
一般使用 list 結構作為隊列, rpush 生產消息, lpop 消費消息。當 lpop 沒有消息的時候,要適當sleep 一會再重試。
缺點:
在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如 rabbitmq 等。 能不能生產一次消費多次呢?
使用 pub/sub 主題訂閱者模式,可以實現 1:N 的消息隊列。 36.什麼是緩存穿透?如何避免?什麼是緩存雪崩?何如避免?
緩存穿透
一般的緩存系統,都是按照 key 去緩存查詢,如果不存在對應的value ,就應該去後端系統查找(比如 DB)。一些惡意的請求會故意查詢不存在的 key,請求量很大,就會對後端系統造成很大的壓力。這就叫 做緩存穿透。
如何避免?
1 :對查詢結果為空的情況也進行緩存,緩存時間設置短一點,或者該 key 對應的數據 insert 了之後清理 緩存。
2 :對一定不存在的 key 進行過濾。可以把所有的可能存在的 key 放到一個大的 Bitmap 中,查詢時通過 該 bitmap 過濾。
緩存雪崩
當緩存伺服器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓 力。導致系統崩潰。
如何避免?
1 :在緩存失效後,通過加鎖或者隊列來控制讀資料庫寫緩存的線程數量。比如對某個 key 只允許一個線 程查詢數據和寫緩存,其他線程等待。
2 :做二級緩存, A1 為原始緩存, A2 為拷貝緩存, A1 失效時,可以訪問 A2 ,A1 緩存失效時間設置為 短期, A2 設置為長期
3 :不同的 key ,設置不同的過期時間,讓緩存失效的時間點儘量均勻

 

 

![](https://img2022.cnblogs.com/blog/2831845/202204/2831845-20220412223504908-2019705387.png)

 

![](https://img2022.cnblogs.com/blog/2831845/202204/2831845-20220412223541442-718124439.png)













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

-Advertisement-
Play Games
更多相關文章
  • 初識JavaScript 瀏覽器執行js簡介 渲染引擎:解析css和html js引擎:編譯js代碼,逐行解析 <script type="null"> alert('我是編程語言,用來控制電腦網頁彈出你好'); alert('我是編程語言,用來控制電腦網頁彈出你好'); </script> js組 ...
  • 一、安裝node.js 參考教程:https://www.runoob.com/nodejs/nodejs-install-setup.html 中文官網:https://nodejs.org/zh-cn/download/ 歷史版本:https://nodejs.org/zh-cn/downloa ...
  • 之前在公眾號轉發了好友 Vajoy 的一篇文章 -- 巧用 CSS 把圖片馬賽克風格化。 核心是利用了 CSS 中一個很有意思的屬性 -- image-rendering,它可以用於設置圖像縮放演算法。 何為 image-rendering? CSS 屬性 image-rendering 用於設置圖像 ...
  • 模板方法模式是什麼 模版方法模式是設計模式中的行為型的一種模式,它在基類中定義了一個演算法的框架,允許子類在不修改結構的情況下重寫演算法的特定步驟。 為什麼要用模板方法模式 模板方法將整個演算法轉換為一系列獨立的步驟,以便子類能對其進行擴展,同時還可讓超類中所定義的結構保持完整。或者當多個類的演算法步驟一致 ...
  • 一、約定編程 Spring AOP是一種約定流程的編程,咱們可以先通過動態代理模式的實現來理解Spring AOP的概念。 代理的邏輯很簡單,例如,當你需要採訪一名兒童時,首先需要經過他父母的同意,在一些問題上父母也許會替他回答,而對於另一些問題,也許父母覺得不太適合這個小孩會拒絕掉,顯然這時父母就 ...
  • 解釋器模式(Interpreter Design Pattern)指給定一個“語言”,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。這裡所指的“語言”是指使用規定格式和語法的代碼。 比如說在計算器中,我們輸入一個加法/減法表達式(中綴表達式)“1+6-5”字元串, ...
  • 《零基礎學Java》 線程的同步 在單線程程式中,每次只能做一件事情,後面的事情需要等待第一件事情完成後才可以進行。為此,Java提供了線程同步機制來防止多線程編程中搶占資源的問題。 線程安全 在編寫多線程程式時,應該考慮到線程安全問題。 模擬未考慮到線程安全問題的售票系統: public clas ...
  • 一、什麼是字典 字典是Python中最強大的數據類型之一,也是Python語言中唯一的映射類型。映射類型對象里哈希值(鍵,key)和指向的對象(值,value)是一對多的的關係,通常被認為是可變的哈希表,字典對象是可變的,它是一個容器類型,能存儲任意個數的Python對象,其中也可包括其他容器類型。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...