1. 程式人生 > >分布式Redis緩存串講(一)

分布式Redis緩存串講(一)

我們 courier win hang lar nbsp lock margin disk

互聯網應用的基石

技術分享圖片

現在流量稍微大些的網站,都會采取Redis。基於Redis的內存緩存特性,可以大幅度降低數據庫的訪問量,大大提升了網站的並發能力,充當數據庫的削量先鋒。既然Redis這麽重要,我們從它的官方介紹來完整的了解下它的能力,知己知彼,才能更運用自如。

Redis官方介紹

Redis是一個開源(BSD協議),內存解構存儲,可以用作數據庫,緩存和消息代理。它支持諸如字符串(strings),哈希散列(hashs),列表(lists),集合(sets),帶有範圍查詢的排序集(sorted sets with range queries),位圖(bitmaps),超級日誌(hyperloglogs )和帶有半徑查詢的地理空間索引(geospatial indexes with radius queries),Redis具有內置復制( replication),Lua腳本(Lua scripting),LRU驅逐(LRU eviction),事務(transactions )和不同級別的磁盤持久性(different levels of on-disk persistence),並通過Redis Sentinel提供高可用性和通過Redis Cluster自動分區。 您可以 對這些類型運行原子操作,例如附加到字符串 ; 遞增哈希值 ; 將元素推送到列表中 ; 計算集合交集, 並集和差異 ; 或者在排序集中獲得排名最高的成員。 你可以對這些類型執行原子操作,像追加字符串;在哈希裏遞增值;推送一個元素到列表;計算集合交集, 並集和差異 ; 或者在排序集中獲得排名最高的成員。為了實現其出色的性能,Redis使用 內存數據集。根據您的使用情況,您可以通過 每隔一段時間將數據集轉儲到磁盤或通過將每個命令附加到日誌來保留它。如果您只需要功能豐富的網絡內存緩存,則可以選擇禁用持久性。

Redis還支持簡單到設置的主從異步復制,具有非常快速的非阻塞第一次同步,自動重新連接以及在網絡分割上的部分重新同步。

其他功能包括:

  • 事務
  • 發布/訂閱
  • Lua腳本(例如:eval 調用redis的腳本)
  • 設置Key的過期時間
  • LRU-Cahce(內存管理的一種頁面置換算法,最近最少使用)
  • 自動故障轉移(通過Redis Sentinel實現)

Redis是用ANSI C編寫,官方建議使用Linux進行部署,Windows版本沒有官方支持,但Microsoft開發並維護了Redis的Win-64端口。

Redis應用場景

  • 數據表緩存

一般訪問量較大的表,讀取時可以先獲取Redis緩存,獲取不到再查詢數據庫,然後放入Redis。這是最常見的運用場景。

  • 業務狀態緩存

例如,多租戶的系統,為了減小批量數據壓力,可以利用redis實現同一時間內,只能由一個導入。導入完成,清空緩存。也可以限制十分鐘內只能導入一次等。

還有例如首頁數據放入緩存,兩分鐘更新一次。

  • 原子性

利用Redis一些原子性命令Inc,decr,可以實現業務參數唯一執行的場景,如訂單付款成功通知,為了防止業務線創建多條記錄,可以對訂單Id執行inc命令,判斷是否為1,1代表只有一個執行,如果大於1,則返回結果,並調用decr。類似於信號量。

Redis應用風險

雖然Redis給我們提供了巨大的便利,但也要時刻保持對它的關註。要不然有些時候,會對你造成巨大的傷害。

  • 緩存穿透

意思是指同一個key,數據庫沒有數據,巨大流量下,會不斷的訪問數據庫。這是浪費的,可以針對一些場景,控制查詢次數。如果獲取不到值,在指定的時間內不再請求數據庫。

  • 緩存雪崩

同一時間內大量key同時失效,造成流量集體訪問數據庫,臨時失去了緩存的作用。

  • 緩存預熱

必要的基礎數據,可以提前緩存掉。節約第一次加載時間。

  • 風險監控

針對線上機器的不同維度實施監控,如鏈接數,內存,cpu,穩定性等有異常及時發通知。

  • flushall風險預知

在極端情況下,為了保證新業務的穩定,可能采取被迫措施flushall,清空所有緩存。這種情況下,你一定不能把緩存當成數據庫來使用,要有緩存隨時可以丟棄的自覺性。謹記!

雖然有大量要註意的風險點,但比起它的收益來講,我們肯定會繼續使用的。量一大,各種問題都會出來,不要怕,挺住!

Redis C#客戶端

C#客戶端 這裏列舉了

  • csredis
  • Nhiredis
  • redis-sharp
  • redisboost
  • ServiceStack.Redis
  • Sider
  • StackExchange.Redis
  • TeamDev Redis Client

使用之前,可以先了解下它們的有點和弊端,如ServiceStack.Redis 4.0以上版本屬於收費版本。StackExchange.Redis在.net core下有超時bug。

Redis常用命令知悉

Redis官方提供了在線命令測試redis命令,我們可以通過這個網頁快速熟悉命令。 命令種類有很多,我們今天先從strings,lists來熟悉下。

string下的命令

  • set
  • get
  • getrange 獲取字符串區間
  • append 追加
> set key1 dolll
OK
> get key1
"dolll"
> GETRANGE key1 0 2
"dol"
> append key1 as
7
> get key1
"dolllas"

  • incr 遞增
  • decr 遞減
> incr hello
(integer) 1
> incr hello
(integer) 2
> decr hello
(integer) 1

list下的命令

  • lpush
  • lrange
> lpush dwe redis
(integer) 1
> lpush dwe ds
(integer) 2
> lpush dwe sd
(integer) 3
> lpush dwe qd
(integer) 4

> lRange dwe 0 20
1) "qd"
2) "sd"
3) "ds"
4) "redis"

匆忙的結束

今天主要重溫了下Redis,了解Redis應用場景,C#客戶端和簡單的運行命令。

分布式Redis緩存串講(一)