原创 小測試:HashSet可以插入重複的元素嗎?
Set的定義是一羣不重複的元素的集合容器。也就是說,只要使用Set組件,應該是要保證相同的數據只能寫入一份,要麼報錯,要麼忽略。當然一般是直接忽略。 如題,HashSet是Set的一種實現,自然也符合其基本的定義。它的自然表現是,一
原创 springboot事務管理實現原理解析
事務在關係型數據庫中是一非常重要的東西,spring中對事務的處理也很簡單,也就是加個註解的事。爲更進一步理解它是如何實現的,今天我們就來拆解下。 1. 幾個核心問題 1. 事務的核心是什麼? 簡單說其實就是底層數據庫的使用
原创 mongodb 深度分頁優化思路之cursor遊標
mongodb 沒有官方的遊標滾動實現深度分頁功能,建議的都是選擇出一個字段,如_id,然後每次查詢時限制該字段,而不進行分頁處理。 也沒有看到更優的實現方式,本文做一個大膽的假設,自行實現滾動分頁功能。供大家思路參考。 但是猜
原创 pagehelper踩坑記之分頁亂套
我們在使用數據庫進行查詢時,很多時候會用到分頁展示功能,因此除了像mybatis這樣的完善的orm框架之外,還有pagehelper這樣的插件幫助減輕我們的工作。 pagehelper的實現方式是,不需要我們去編寫分頁代碼,只需要調
原创 sql語法巧用之not取反
數據庫的重要性和通用性都不用說了,什麼sql的通用性,sql優化之類的也不必說了,咱們今天來聊聊另一個有意思的話題:如何取一個篩選的反面案例。 1. 舉幾個正反案例的例子 爲了讓大家理解我們的假設場景,什麼叫做正反案例?比如:
原创 redis bitmap數據結構之java對等操作
在之前的文章中,我們有說過bitmap,bitmap在很多場景可以應用,比如黑白名單,快速判定,登錄情況等等。總之,bitmap是以其高性能出名。其基本原理是一位存儲一個標識,其他衍生知道咱就不說了,而redis就是以這種原生格式存儲的
原创 關於linux的一點好奇心(五):進程線程的創建
一直以來,進程和線程的區別,這種問題一般會被面試官拿來考考面試者,可見這事就不太簡單。簡單說一點差異是,進程擁有獨立的內存資源信息,而線程則共享父進程的資源信息。也就是說線程不擁有內存資源,所以對系統消耗會更小。所以,線程也有輕量級進程
原创 關於linux的一點好奇心(四):tail -f文件跟蹤實現
關於文件跟蹤,我們有很多的實際場景,比如查看某個系統日誌的輸出,當有變化時立即體現,以便進行問題排查;比如查看文件結尾的內容是啥,總之是剛需了。 1. 自己實現的文件跟蹤 我們平時做功能開發時,也會遇到類似的需求,比如當有人傳輸
原创 Dubbo(八):timeout超時機制解析
在網絡請求時,總會有各種異常情況出現,我們需要提前處理這種情況。在完善的rpc組件dubbo中,自然是不會少了這一層東西的。我們只需要通過一些簡單的配置就可以達到超時限制的作用了。 dubbo的設計理念是,客戶端控制優先,服務端控制
原创 一個快速切換一個底層實現的思路分享
現實場景往往是這樣,我們應對一個需求,很快就會有一個處理方法了,然後根據需求做了一個還不錯的實現。因爲實現了功能,業務很happy,老闆很開心,all the world is beatiful. 但隨着公司的發展,有人實現
原创 bitmap技術解析:redis與roaringBitmap
bitmap的表象意義是,使用一個01標識位來表示是否的狀態,可以達到節省空間和高效判定的效果。在我們的實際工作中,也有着許多的應用場景,相信瞭解bitmap定會給你帶來一些額外的收穫。 1. bitmap使用場景說明
原创 一個簡單字符串差異對比暴力算法實現
如題:請求出兩個字符串的差異部分,並以不同的顏色區分顯示到瀏覽器上。 1. 解題思路 1. 找出兩字符串中相同的部分,標記; 2. 找出兩字符串中不同的部分,標記; 3. 儘可能長的匹配相同部分; 4. 儘可能少的使用複雜度(所有算
原创 一個關於wait/notify與鎖關係的探究
wait/notify 機制是解決生產者消費者問題的良藥。它的核心邏輯是基於條件變量的鎖機制處理。所以,它們到底是什麼關係?wait()時是否需要持有鎖? notify()是否需要持有鎖?先說答案:都需要持有鎖。 wait需要持有鎖
原创 基於long pull實現簡易的消息中心MQ參考
我們都用過消息中間件,它的作用自不必多說。但對於消費者卻一直有一些權衡,就是使用push,還是pull模式的問題,這當然是各有優劣。當然,這並不是本文想討論的問題。我們想在不使用長連接的情意下,如何實現實時的消息消費,而不至於讓serv
原创 關於linux的一點好奇心(二):linux啓動過程之三大進程
上一節我們通過對x86的linux內核的講解,知道了它的一個大概的啓動過程。 /arch/x86/boot/header.S -> calll main -> /arch/x86/boot/