原创 Redis數據庫實現原理(劃重點)

Redis服務器將所有數據庫都保存在服務器狀態redis.h/redisServer結構的db數組中,db數組的每一項都是一個redis.h/redisDb結構,每個redisDb結構代表一個數據庫,服務器設置dbnum屬性爲初始數據庫的

原创 Redis實現消息隊列之發佈訂閱模式

發佈訂閱(pub/sub)是一種消息通信模式:發送者(pub)在某一頻道發送消息,訂閱者(sub)接收消息。發佈訂閱模式類似與微博關注,比如說博主mango被張三、李四、王五關注,那麼mango發一篇微博的時候張李王三人都會從關注裏看到這

原创 C#反射破壞單例

單例大家都不陌生,程序從開啓到死亡過程中只能存在一個實例,即存在不可創建,今天給大家介紹一種打破這種模式的方法,在程序運行中創建無數個單例實例對象。 關於單例模式模糊或者不懂的可以參考C#單例模式 上文我們講到了反射的基本操作,實例化對象

原创 Redis線程IO模型的祕密知多少

​在前面事務裏面講過Redis是一個單線程應用程序,當然我們比較有代表性的單線程還有Node.js、Nginx等。 那麼既然是單線程的爲什麼還這麼快呢? Redis的數據都在內存裏面,所有的運算都是內存級別,處理數據是非常快速的,所以這裏

原创 Redis實現消息隊列之生產消費模式

簡單的介紹下消息隊列,使用消息隊列首先我們得有一個隊列,那麼這個隊列之前講過就是先進先出的一個數據結構;那麼有了隊列以後我們還需要有人在隊列裏面放東西,那麼這個放東西的人我們稱之爲生產者;有了生產者對應的需要一個消費者,沒有消費者這個隊列

原创 Redis通訊協議RESP詳解

Redis的作者認爲數據庫系統的瓶頸一般不在於網絡流量,而是數據庫自身內部邏輯處理上。所以即使Redis使用了浪費流量的文本協議,依然可以取得極高的訪問性能。Redis將所有數據都放在內存,用一個單線程對外提供服務,單個節點在跑滿一個CP

原创 Redis管道(Pipeline)詳解

在講解管道前,我們首先來了解一下redis的交互,redis的一次交互是由客戶端發起,由服務端接收,那麼我們連續操作一些指令,如下圖所示: 客戶端請求一個指令到服務器到服務器返回數據這個過程非常複雜,既要保證數據能夠快速傳到也要保證不丟

原创 Redis緩存穿透、擊穿、雪崩來解釋個明白

隨着用戶的增長,用戶的請求也越來越頻繁,爲了保證服務器在高併發的情況能正常提供服務,我們首先引入了緩存Redis,減少數據庫的壓力和數據的安全性同時提高了接口反應效率,解決了用戶的請求直接與數據庫建立連接。  但是在使用Redis的時候,

原创 Redis快速掃描Scan

在平時我們維護線上Redis的時候需要從n個key裏面找到某些特定規則的key,可能查看某些key可能清理某些不需要的key,可能我們第一印象就是keys這個指令,我們可以使用這個指令匹配我們想要的key,下面我們來試試。 keys指令基

原创 Redis高併發限流策略之漏斗限流算法

在雙11活動當天凌晨,打折活動開始前多少名客戶下單可以半折甚至是免單優惠,客戶當然不會放過這個一年一次的機會,瘋狂開始。這時候我們程序員小哥哥就苦了,稍一個不注意,服務器駕崩了,次日頭條見。那麼爲了防止在當天凌晨壓死服務器的併發,我們想到

原创 Redis如何實現刷抖音不重複-布隆過濾器(Bloom Filter)

刷抖音的時候是否曾想過,我們刷過的視頻很難在重複刷到那麼它到底是如何實現的呢? 如果說我們每刷一個視頻並且把視頻id和用戶的id組合成一條數據保存到數據庫中每次推薦視頻的時候都去數據檢測是否已經刷過了,嗯,這樣可以實現這個功能,但是存在多

原创 Redis單線程模型事務的實現原理

在使用關係型數據庫的時候,爲了保證數據的ACID(Atomicity:原子性,Consistency:一致性,Isolation:隔離性,Durability:持久性)我們經常會使用事務,要麼全部提交成功,要麼失敗全部失敗,不會存在中間狀

原创 Redis站點流量統計HyperLogLog

在我們做站點流量統計的時候一般會統計頁面UV(獨立訪客:unique visitor)和PV(即頁面瀏覽量:page view),那麼我們最常見的處理方式就是用戶點擊一次就插入一條數據到數據庫,統計的時候通過查詢表來達到統計流量的效果。

原创 Redis分佈式鎖如何提高可用性

在編程中我們時常考慮高併發帶來的數據訪問不安全問題,那麼我們在redis中是否也要考慮呢?答案是肯定的,有人會問:redis不是單線程的嗎?對它是單線程,但是在某些情況他會出現信息更新,用戶沒有拿到最新數據,然後導致操作有誤,看下圖 我

原创 Redis之GeoHash

在生活中我們有時候需要點外賣、騎共享單車等等,我們打開軟件找到附近餐廳、離我最近的單車,那麼他們是怎麼快速定位到的呢?我們把地圖看作一個二維平面,我們在某個點上然後找到附近10km內的所有餐廳,這時候我們知道求兩點直接的距離是需要一個公