原创 Redis命令總結

服務器相關 ping 測試連接是否存活。 select 選擇數據庫。 dbsize 返回當前庫的Key數量。 info 查看服務的信息和統計。 monitor 實時轉儲收到的請求。 config get 獲取服務配置信息。 con

原创 RabbitMQ常見問題解決方案

上一篇博客記錄了一下RabbitMQ的服務搭建和簡單入門,但是光這些還遠遠不夠。 要想將RabbitMQ用於生產中,需要考慮和解決很多問題。 目錄 消息轉換器 生產者如何確保消息發送不丟失? 消費者如何防止消息丟失?

原创 聊聊Synchronized和Lock

目錄 Synchronized和Lock的區別 阻塞線程狀態不同 Synchronized實現原理 鎖的是對象,而非代碼 monitorenter和monitorexit指令 JDK6的鎖優化 鎖消除 鎖粗化 自旋鎖 (

原创 線程池以及手寫實現

前言 什麼是線程池 存放若干個用於執行任務的線程的容器。 爲什麼要用線程池 性能 線程的創建和銷燬是非常消耗系統資源的,每當我們要執行異步任務時,都創建一個新的線程,會帶來大量額外的開銷,並且線程的數量不宜過多,線程過多會增加CP

原创 如何實現一個比較完美的分佈式鎖?

在分佈式系統中,存在一個讓人很頭痛的問題:鎖。 單機器時,控制併發相對簡單,使用Java提供的synchronized關鍵字或者顯式鎖ReentrantLock。 但是在分佈式系統中,JVM級別的鎖已經不能滿足系統的需求,需要實現

原创 Spring Boot零配置實現原理及模擬實現

利用Spring Boot可以快速的構建一個Spring應用,尤其是Web應用,Spring Boot內嵌了Tomcat容器,項目開發完成後打包成一個可執行的Jar包直接就能運行,大大減少了項目構建和部署的成本。 Spring B

原创 聊聊StringBuffer與StringBuilder

我們知道,String是隻讀字符串,所引用的字符串一經定義,就無法再修改。 對String進行拼接或截取操作會創建新的String對象,如果需要對字符串進行大量修改,使用String性能極低。 如下例子,對字符串進行10萬次的拼接

原创 Java顯式鎖

synchronized和Lock synchronized Java提供的關鍵字,屬於Java語法層面的互斥,隱式鎖,由JVM來實現加鎖和釋放鎖。 優點 代碼編寫簡單 可讀性好 缺點 加鎖和釋放鎖由JVM來完成,不夠靈活。

原创 Redis分佈式鎖防止緩存擊穿

緩存擊穿 和緩存穿透不同的是,緩存擊穿是指:緩存中沒有,但是數據庫中存在的熱點數據。 例如:首頁的熱點新聞,併發訪問量非常大的熱點數據,如果緩存過期失效,服務器會去查詢DB,這時候如果大量的併發去查詢DB,可能會瞬間壓垮DB。 畫

原创 你寫的單例真的安全嗎?

單例模式 單例模式的實現方案有兩種:餓漢式、懶漢式。 網上很多寫法都存在一些問題。 餓漢式 飢餓法則,優先創建實例,需要時直接返回。 優點是代碼編寫簡單,缺點是沒有達到懶加載的效果,浪費資源。 public class Singl

原创 Java內存區域與內存溢出

內容參考《深入理解JVM虛擬機》,本文JVM均指HotSpot虛擬機。 Java與C語言針對“內存管理”有很大的不同。 在C語言中,開發者需要維護對象的出生和死亡,往往需要爲每個new出來的對象編寫配套的delete/free

原创 讀寫鎖以及手寫實現

讀寫鎖 Java內置了讀寫鎖工具類,方便開發人員針對“讀多寫少”的場景提升加鎖的性能。 爲什麼需要讀寫鎖? synchronized和ReentrantLock都屬於排他鎖,存在明顯的性能問題:讀讀互斥。 當某一個線程獲取鎖時,其

原创 手寫布隆過濾器防止緩存穿透

什麼是布隆過濾器? 布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都比一般的算法要

原创 Linux下Redis的安裝和啓動

Redis安裝和啓動 去官網下載自己需要的版本,解壓安裝:https://redis.io/download。 wget http://download.redis.io/releases/redis-5.0.7.tar.gz t

原创 Redis數據持久化機制及數據恢復

什麼是數據持久化? 我們知道Redis是基於內存的非關係型數據庫,對數據的增刪改查操作都直接在內存中進行,再加上Redis不用維護數據之間的“關係”,導致它性能很高,速度很快。 但是基於內存有一個問題是:一旦機器斷電,內存中的數據