reids實踐基礎

1、reids實踐基礎

一、緩存系統與Redis

緩存系統:node

①請求 =》②業務計算 =》 ③讀寫數據 (cache <=> db) ④模板渲染 =》 ⑤ 輸出
Redis-緩解甚至接管數據庫壓力 mysql

  • 能不查數據庫就不查數據庫
  • 存放經常使用的數據
  • 查看數據庫進程 show processlist
  • 將經常使用的,查詢條件複雜的數據緩存到redis中,能夠顯著減小數據庫的讀寫,從而下降數據庫的壓力
  • 操做具備原子性特徵
  • 原子操做:保證了數據的可靠,操做錯誤的回滾,支持了競爭類業務的實現

Redis的優點:redis

  • 常駐內存 讀寫性能優越,遠勝硬盤IO
  • 支持多種數據結構 能實現多種業務須要
  • 能夠自動保存數據到硬盤 服務重啓時恢復 服務穩定持久
daemonize yes 後臺啓動
port 6379 端口號
pidfile /var/6379.pid

redis-cli 6379 shutdown redis客戶端退出算法

客戶端鏈接redis
安裝對應的擴展
操做key value型數據
set get del exists setnx(若是不存在則設置)
鍵名通常按照模塊從大到小來設計,以冒號分隔sql

hash類型數據
hset hget hdel hexists hsetnx
hash類型鍵的刪除,須要逐個刪除每個field
緩存獨立於數據庫以外,並非全部的數據都接受延遲,要始終注意數據的一致性數據庫

list類型的數據
lset llen lrange ltrim lpop rpush lpop rpop
實例:操做日誌的記錄與讀取json

set類型的數據
sadd smembers scard spop sdiff緩存

二、Redis緩存案例

緩存天氣
常規緩存,設置key weaher:city:date 查詢時先查key是否存在,存在直接返回,不存在先請求接口,再緩存 該key能夠設置一個同步接口,每10分鐘調用一次,保持和遠程接口數據的同步
pv&uv
incrBy 自增
pv自增:使用string key value 設置key 接口調用一次incrBy 加1 獲取 get($key)
uvset:使用set 設置 key 調用接口,使用ip地址,添加ip地址到set中,計算set元素的個數服務器

腳本同步數據:第一次從mysql同步數據到redis,後期防止redis數據的丟失,能夠考慮增量計算加到mysql中,屢次累加一次操做

分頁優化:基於id區分頁而不是使用limit的方式數據結構

三、Redis 消息隊列

簡介:消息隊列時消息的順序集合
場景:網站首頁的PV統計和查看
傳統直接update表,大併發狀況下容易鎖表,
redis消息隊列:Redis每次請求rpush 腳本勻速處理pvlog set pv查看get pv

應對流量峯值
異步消費(不定速的插入,生產 和 勻速的處理,消費)
解耦應用(不一樣來源的生產和不一樣去向的消費)

消息隊列的實現方式有不少,使用redis實現的最主要的優點是簡單快捷
redis實現消息隊列有兩種方式:

  • 基於list
  • 基於publish/subscribe

redis實現消息隊列
基於list的消息隊列實現方式
特色:

  • redis的容量決定業務承載能力
  • 每條信息只能被一個消費者消費
  • 通常要把消息所有消費掉
  • 處理失敗的消息要作容錯

基於publish/subscribe的消息隊列實現方式
基於發佈訂閱實現pv統計
在訂閱模式下,只能執行subscribe、psubscribe等和訂閱相關的操做,想執行其餘操做須要從新實例化一個redis實例

總結:
消息隊列的實現方式有不少
使用redis實現的最主要優點是簡單快捷
redis實現消息隊列有兩種方式:
基於list 
基於subscribe/publish

2、Redis緩存簡介

Redis時徹底免費的,遵照BSD協議,是一個高性能的key-value數據庫

  • 簡單的key-value存儲,性能極高
  • Redis擁有更多的數據結構並支持更豐富的數據結構
  • Redis支持數據持久化和數據恢復
  • Redis的全部操做都是原子性的
  • 服務器支持AUTH密碼驗證

Redis字段類型

  • String 字符串
  • Hash 散列/哈希
  • List 列表
  • Set 無序集合
  • Zset 有序集合

String類型

最多見的數據類型
能夠爲任何類型的字符串,好比二進制,json對象
最大容量 512M
通常會用做緩存使用

Hash類型

  • 與PHP的array類似
  • 能夠保存多個key-value,每一個k-v都是字符串類型
  • 最多2^32-1個字段

通常用來存儲我的信息緩存

List類型

  • 實現方式爲雙向鏈表
  • 用於存儲一個有序的字符串列表
  • 從隊列兩端添加和彈出元素
  • 特別適合用於作消息隊列
設置秒殺活動
 一、設置秒殺狀態 ms_status 1描述結束 0 未開啓
 二、秒殺隊列 list
 三、判斷隊列長度,超過長度 設置秒殺狀態爲結束
 四、處理隊列,處理以前先設置隊列狀態爲秒殺結束

Set類型

  • 集合中每一個元素都是不一樣的
  • 元素最多爲2^32-1
  • 元素沒有順序
差集 sdiff
 交集 sinter
 並集 sunion

Zset集合

  • 集合是有序的
  • 支持插入,刪除,判斷元素是否存在
  • 能夠獲取分數最高/最低的前N個元素

3、Redis 運維

  1. 持久化

RDB 指定的時間間隔保存數據快照
優勢:
適合用於進行備份
fork出子進程進行備份,主進程沒有任何IO操做
恢復大數據集時的速度快
缺點:
特定條件下進行一次持久化,易丟失數據
龐大數據時,保存時會出現性能問題

AOF先把命令追加到操做日誌的尾部,保存全部歷史記錄

優勢:
數據很是完整,故障恢復丟失數據少
可對歷史操做進行處理
缺點:
文件的體積大
速度低於RDB且故障恢復速度慢

  1. 合理使用Redis

防止內存佔滿
設置超時時間
不存放過大文件
不存放不經常使用文件
提升使用效率
合理使用不一樣的數據結構類型
慎用正則處理或者批量操做Hash,set等

三、Redis Cluster

  • 多個Redis實例協同運行
  • 採用slot槽分割數據,時CRC16與16384取模後分散
  • 主從結構和選舉算法,保證每一個節點的可靠性
  • 客戶端能夠鏈接任意一個node進行操做

結構:

  • 全部的redis節點彼此互聯,內部使用二進制協議優化傳輸速度和帶寬
  • 節點的fail是經過集羣中超過半數的節點檢測失效時才生效
  • 客戶端與redis節點直連,不須要中間proxy層,客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可
  • redis-cluster把全部的物理節點映射到0-16383slot上,cluster負責維護node<->slot<->value

注意事項:

不徹底支持批量操做
事物不能跨界點支持
不支持多實例
key是最小粒度
最少6個才能保證組成完整高可用的集羣
相關文章
相關標籤/搜索