原创 如何用好redis pipeline

編者注:pipeline是Redis的一個提高吞吐量的機制,適用於多key讀寫場景,比如同時讀取多個key的value,或者更新多個key的value。工作過程中發現挺多小夥伴都對pipeline多少有些瞭解,但是更深入的理解或者說有哪些

原创 常見限流方案設計與實現

高併發系統設計的3個利器:緩存、限流、降級,本文就限流相關算法,分析其設計與實現。 從分佈式角度來看,限流可分爲分佈式限流(比如基於Sentinel或者Redis的集羣限流)和單機限流。從算法實現角度來看,限流算法可分爲漏桶算法、令牌桶算法

原创 sentinel 集羣流控原理

爲什麼需要集羣流控呢?假設需要將某個API的總qps限制在100,機器數可能爲50,這時很自然的想到使用一個專門的server來統計總的調用量,其他實例與該server通信來判斷是否可以調用,這就是基本的集羣流控方式,sentinel的實

原创 sentinel 滑動窗口統計機制

sentinel的滑動窗口統計機制就是根據當前時間,獲取對應的時間窗口,並更新該時間窗口中的各項統計指標(pass/block/rt等),這些指標被用來進行後續判斷,比如限流、降級等;隨着時間的推移,當前時間點對應的時間窗口是變化

原创 sentinel 核心概念

編者注:前段時間筆者在團隊內部分享了sentinel原理設計與實現,主要講解了sentinel基礎概念和工作原理,工作原理部分大家聽了基本都瞭解了,但是對於sentinel的幾個概念及其之間的關係還有挺多同學有點模糊的,趁着這幾天

原创 從此Redis是路人

從此Redis是路人 序言:Redis(Remote DIctionary Server)作爲一個開源/C實現/高性能/基於內存的key-value存儲系統,相信做Java的小夥伴都不會陌生。Redis常用於緩存、分佈式鎖、隊列(

原创 一次線上Redis類轉換異常排查引發的思考

之前同事反饋說線上遇到Redis反序列化異常問題,異常如下: XxxClass1 cannot be cast to XxxClass2 已知信息如下: 該異常不是必現的,偶爾纔會出現; 出現該異常後重啓應用或者過一會就好了; 序列化

原创 MyBatis框架及原理分析

MyBatis 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架,其主要就完成2件事情: 封裝JDBC操作 利用反射打通Java類與SQL語句之間的相互轉換 MyBatis的主要設計目的就是讓我們對執行SQL語句時對輸入輸出

原创 Spring的IoC容器

Spring是一個輕量級的Java開發框架,其提供的兩大基礎功能爲IoC和AOP,其中IoC爲依賴反轉(Inversion of Control)。IOC容器的基本理念就是“爲別人服務”,那爲別人服務什麼呢?其中最重要就是業務對象的構建管理

原创 ConcurrentHashMap竟然也有死循環問題?

前幾天和朋友閒聊,說遇到了一個ConcurrentHashMap死循環問題,當時心裏想這不科學呀?ConcurrentHashMap怎麼還有死循環呢,畢竟它已經解決HashMap中rehash中死循環問題了,但是隨着深入的分析,發現事情並

原创 如何生成後綴表達式

  如果計算一個表達式,比如 4+5+6*2,隨着計算器的不同,簡單的四功能計算器是30,許多科學計算器知道乘法的優先級高於加法,所以科學答案是21。典型計算順序可以是計算4+5,存爲臨時變量a,再計算6*2,存爲b,最後計算a+b可得出最

原创 別再問我ConcurrentHashMap了

以下ConcurrentHashMap以jdk8中爲例進行分析,ConcurrentHashMap是一個線程安全、基於數組+鏈表(或者紅黑樹)的kv容器,主要特性如下: 線程安全,數組中單個slot元素個數超過8個時會將鏈表結構轉換成紅黑

原创 Redis 內存管理與事件處理

1 Redis內存管理 Redis內存管理相關文件爲zmalloc.c/zmalloc.h,其只是對C中內存管理函數做了簡單的封裝,屏蔽了底層平臺的差異,並增加了內存使用情況統計的功能。 void *zmalloc(size_t siz

原创 Linux網絡編程-IO複用技術

IO複用是Linux中的IO模型之一,IO複用就是進程預先告訴內核需要監視的IO條件,使得內核一旦發現進程指定的一個或多個IO條件就緒,就通過進程進程處理,從而不會在單個IO上阻塞了。Linux中,提供了select、poll、epoll三

原创 【Java核心技術】類型信息(Class對象 反射 動態代理)

1 Class對象 理解RTTI在Java中的工作原理,首先需要知道類型信息在運行時是如何表示的,這是由Class對象來完成的,它包含了與類有關的信息。Class對象就是用來創建所有“常規”對象的,Java使用Class對象來執行RTTI,