Redis從入門到實踐

花了一週左右,全面的學習redis的知識,並記錄學習筆記php

原文請訪問個人技術博客番茄技術小棧java

redis初識

導學

盛讚redis

  • 高性能key-value服務器
  • 多種數據結構
  • 豐富的功能
  • 高可用的分佈式支持

redis初識

定義

Redis是一個使用ANSI C編寫的開源、支持網絡、基於內存、可選持久性的鍵值對存儲數據庫node

特性

  • 開源
  • 多種數據結構
  • 基於鍵值的存儲服務系統
  • 高性能,功能服務

redis的前世此生

paste image

誰在使用redis

  • github
  • twitter
  • 微博
  • Stack Overflow
  • 阿里巴巴
  • 百度
  • 美團
  • 搜狐
  • ......

redis特性目錄

  • 速度快
  • 持久化
  • 多種數據結構
  • 支持多種編程語言
  • 功能豐富
  • 簡單:代碼短小精悍
  • 主從複製
  • 高可用、分佈式

特性1:速度快

10w QPSpython

緣由mysql

  • 數據存在內存
  • c語言編寫
  • 單線程編寫

paste image

paste image

特性2:持久化

  • redis全部的數據保存在內存中,對數據的更新將異步地保存到磁盤上

特性3:數據結構

paste image

特性4:多語言客戶端

  • java
  • php
  • python
  • ruby
  • lua
  • nodejs

特性5:功能豐富

  • 發佈訂閱
  • lua腳本
  • 事務
  • pipeline

特性6:簡單

  • 23000行代碼實現核心功能
  • 不依賴外部庫
  • 單線程模型

特性7:複製

paste image

特性8: 高可用

  • redis-sentinel支持高可用
  • 分佈式 redis-cluster支持分佈式

redis典型使用場景

  • 緩存系統

paste image

  • 計數器

paste image

  • 消息隊列系統

paste image

  • 排行榜

paste image

  • 社交網絡
  • 實時系統

redis三種啓動方式

redis安裝(mac&linux)

$ wget http://download.redis.io/releases/redis-4.0.8.tar.gz
$ tar xzf redis-4.0.8.tar.gz
$ cd redis-4.0.8
$ make
複製代碼

redis可執行文件說明

命令名 命令說明
redis-server redis服務器
redis-cli redis命令行客戶端
redis-benchmark redis性能測試工具
redis-check-aof aof文件修復工具
redis-check-dump RDB文件檢查工具
redis-sentinel sentinel服務器(2.8之後)

paste image

reids三種啓動方法

  • 最簡啓動(採用默認配置文件啓動)
redis-server
複製代碼

驗證linux

ps aux | grep redis
複製代碼
redis-cli -h 127.0.0.1 -p 6379 ping 
複製代碼
  • 配置文件啓動 (將須要配置的參數寫入文件)
redis-server configPath
複製代碼
  • 動態參數啓動
redis-server --port 6380
複製代碼

三種啓動方式比較git

  • 生產環境選擇配置啓動
  • 單機多實例配置文件能夠用端口區分開

redis客戶端鏈接

redis-cli -h 127.0.0.1 -p 6379
複製代碼

redis客戶端返回值

返回值 返回值說明
狀態回覆 ping -> pong
錯誤回覆 hget hello field -> (error) ERR wrong number of arguments for 'hget' command
整數回覆 incr hello -> (integer) 1
字符串回覆 get hello -> "1"
多行字符串回覆 mget hello foo -> 1) "1" 2) (nil)

redis經常使用配置

配置名 說明
daemonize 是不是守護進程(no/yes)
port redis對外端口號
logfile redis系統日誌
dir redis工做目錄

redis安裝啓動(配置文件方式)

配置方式github

  • 配置文件
vim redis-6382.conf

port 6382
daemonize yes
logfile "6382.log"
dir ./workdata/
複製代碼
  • 啓動
redis-server redis-6382.conf 
複製代碼
  • 檢查
ps -aux | grep -v redis-server | grep 6382 
複製代碼
  • 日誌文件
vim workdata/6382.log
複製代碼

API的理解和使用

通用命令

命令 說明 時間複雜度
keys [pattern] 遍歷全部key O(N)
dbsize 遍歷全部key O(1)
exists 檢查key是否存在 O(1)
del key 刪除指定的key-value O(1)
expire key seconds key在seconds秒後過時 O(1)
ttl key 查看key剩餘的過時時間 O(1)
persist key 去掉key的過時時間 O(1)
type key 返回key的類型 O(1)

注意 keys命令通常再也不生產環境使用redis

** 演示**sql

➜  redis-4.0.8 redis-cli -h 127.0.0.1 -p 6382
127.0.0.1:6382> set hello word
OK
127.0.0.1:6382> set php good
OK
127.0.0.1:6382> set java best
OK
127.0.0.1:6382> keys *
1) "java"
2) "hello"
3) "php"
127.0.0.1:6382> dbsize
(integer) 3
127.0.0.1:6382> exists php
(integer) 1
127.0.0.1:6382> del php java
(integer) 2
127.0.0.1:6382> keys *
1) "hello"
127.0.0.1:6382> expire hello 20
(integer) 1
127.0.0.1:6382> ttl hello
(integer) 16
127.0.0.1:6382> ttl hello
(integer) 12
127.0.0.1:6382> persist hello
(integer) 1
127.0.0.1:6382> ttl hello
(integer) -1
127.0.0.1:6382> type hello
string

複製代碼

數據結構和內部編碼

圖示

paste image

reidsObject

paste image

單線程

定義

單線程在程序執行時,所走的程序路徑按照連續順序排下來,前面的必須處理好,後面的纔會執行。

paste image

單線程爲何這麼快

  • 純內存
  • 非阻塞IO
  • 避免線程切換和競態消耗

使用單線程要注意什麼

  • 一次只能運行一條命令
  • 拒絕長(慢)命令
    • keys
    • flushall
    • flushdb
    • slow lua script
    • mutil/exec
    • operate big value(collection)

string

結構

key value
hello world
counter 1
bits 101111101110

能夠是字符串(json);數字,以及二進制

使用場景

  • 緩存
  • 計數器
  • 分佈式鎖

API

命令 說明 時間複雜度
get key 獲取key對應的value O(1)
set key value 設置key value O(1)
del key 刪除key-value O(1)
incr key自增1, 若是key不存在,自增後get(key) = 1 O(1)
decr key自減1, 若是key不存在,自增後get(key) = -1 O(1)
incrby key k key自增k, 若是key不存在,自增後get(key) = k O(1)
decr key k key自減k, 若是key不存在,自增後get(key) = -k O(1)
set key value 無論能夠是否存在 O(1)
setnx key value key不存在,才設置 O(1)
set key value xx key存在,才設置 O(1)
mget key1 key2 key3 批量獲取key,原子操做 O(N)
mset key1 value1 key2 value2 批量設置key-value O(1)
getset key newvalue set key newvalue並返回舊的value O(1)
append key value 將value追加到舊的value O(1)
strlen key 返回字符串的長度(注意中文,utf8下一個中文佔用3個字符) O(1)
incrbyfloat key 3.5 增長key對應的值3.5 O(1)
getrange key start end 獲取字符串指定下標全部的值 O(1)
setrange key index value 設置指定下標全部對應的值 O(1)

練習

127.0.0.1:6382> set hello "world"
OK
127.0.0.1:6382> get hell
(nil)
127.0.0.1:6382> get hello
"world"
127.0.0.1:6382> del hello
(integer) 1
127.0.0.1:6382> get hello
(nil)
127.0.0.1:6382> get counter
(nil)
127.0.0.1:6382> incr counter
(integer) 1
127.0.0.1:6382> get counter
"1"
127.0.0.1:6382> incrby counter 99
(integer) 100
127.0.0.1:6382> get counter 
"100"
127.0.0.1:6382> decr counter
(integer) 99
127.0.0.1:6382> get counter
"99"
127.0.0.1:6382> decrby counter 100
(integer) -1
127.0.0.1:6382> get counter
"-1"
127.0.0.1:6382> exists php
(integer) 0
127.0.0.1:6382> set php good
OK
127.0.0.1:6382> setnx php bad
(integer) 0
127.0.0.1:6382> set php best xx
OK
127.0.0.1:6382> get php
"best"
127.0.0.1:6382> exists java
(integer) 0
127.0.0.1:6382> setnx java best
(integer) 1
127.0.0.1:6382> set java easy xx
OK
127.0.0.1:6382> get java
"easy"
127.0.0.1:6382> set hello world
OK
127.0.0.1:6382> getset hello php
"world"
127.0.0.1:6382> get hello
"php"
127.0.0.1:6382> append hell ",php"
(integer) 4
127.0.0.1:6382> get hello
"php"
127.0.0.1:6382> append hello ",php"
(integer) 7
127.0.0.1:6382> get hello
"php,php"
127.0.0.1:6382> strlen hello
(integer) 7
127.0.0.1:6382> set hello "吳軍旗"
OK
127.0.0.1:6382> strlen hello
(integer) 9

複製代碼

n次get操做

paste image

** 1次mget操做**

paste image

實戰

  • 記錄網站每一個用戶我的主頁的訪問量
incr userid: pageview (**主要的是:單線程,因此無競爭)**)
複製代碼
  • 緩存視頻的基本信息(數據源在mysql中)僞代碼

paste image

  • 分佈式id生成器(單線程的好處)

paste image

incr id
複製代碼

hash

哈希鍵值結構

paste image

特色

  • mapmap
  • small redis
  • field不能相同,value能夠相同

API

命令 說明 時間複雜度
hget key field 獲取hash key對應field的value O(1)
hset key field value 設置has key 對應的field的value O(1)
hexists key field 判斷hash key 是否有field O(1)
hlen key 獲取hash key field的數量 O(1)
hmget key field1 field2...fieldN 批量獲取hash key的一批field對應的值 O(N)
hset key field1 value1 field2 value2...fieldN valueN 批量設置hash key的一批field value O(1)
hgetall key 返回hash key對應全部的field和value O(N)
hvals key 返回hash key對應全部的field的value O(N)
hkeys key 返回hash key對應全部的field O(N)
hsetnx key field value 設置has key 對應的field的value(若是field已經存在,則失敗) O(1)
hincrby key field intCounter hash key對應的field的value自增intCounter O(1)
hincrbyfloat key field floatCounter 浮點數版本 O(1)

注意 當心使用hgetall(牢記單線程)

練習

127.0.0.1:6382> hset user1 age 26
(integer) 1
127.0.0.1:6382> hset user1 name wujunqi
(integer) 1
127.0.0.1:6382> hget all user1
(nil)
127.0.0.1:6382> hgetall user1
1) "age"
2) "26"
3) "name"
4) "wujunqi"
127.0.0.1:6382> hdel user1 age
(integer) 1
127.0.0.1:6382> hgetall user1
1) "name"
2) "wujunqi"
127.0.0.1:6382> hget user1 name
"wujunqi"
127.0.0.1:6382> hexists user1 name
(integer) 1
127.0.0.1:6382> hlen user1
(integer) 1
127.0.0.1:6382> hmset user2 name xiaofang age 26
OK
127.0.0.1:6382> hmget user2 name age
1) "xiaofang"
2) "26"
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "26"
127.0.0.1:6382> hvals user2
1) "xiaofang"
2) "26"
127.0.0.1:6382> hkeys user2
1) "name"
2) "age"
127.0.0.1:6382> hincrby user age 2
(integer) 2
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "26"
127.0.0.1:6382> hincrby user2 age 2
(integer) 28
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "28"
127.0.0.1:6382> hincrbyfloat user2 age 2.0
"30"
127.0.0.1:6382> hincrbyfloat user2 age 2.5
"32.5"
127.0.0.1:6382> hgetall user2
1) "name"
2) "xiaofang"
3) "age"
4) "32.5"

複製代碼

list

列表結構

paste image

特色

  • 有序
  • 能夠重複
  • 左右兩邊插入彈出

API

paste image

練習

127.0.0.1:6382> rpush list1 a b c d
(integer) 4
127.0.0.1:6382> lpush list1 e f g h i
(integer) 9
127.0.0.1:6382> lrange list1 0 -1
1) "i"
2) "h"
3) "g"
4) "f"
5) "e"
6) "a"
7) "b"
8) "c"
9) "d"
127.0.0.1:6382> linsert list1 before i wu
(integer) 10
127.0.0.1:6382> lrange list1 0 -1
 1) "wu"
 2) "i"
 3) "h"
 4) "g"
 5) "f"
 6) "e"
 7) "a"
 8) "b"
 9) "c"
10) "d"
127.0.0.1:6382> linsert list1 after i jun
(integer) 11
127.0.0.1:6382> lrange list1 0 -1
 1) "wu"
 2) "i"
 3) "jun"
 4) "h"
 5) "g"
 6) "f"
 7) "e"
 8) "a"
 9) "b"
10) "c"
11) "d"
127.0.0.1:6382> lpop list1
"wu"
127.0.0.1:6382> rpop list1
"d"
127.0.0.1:6382> lrange list1 0 -1
1) "i"
2) "jun"
3) "h"
4) "g"
5) "f"
6) "e"
7) "a"
8) "b"
9) "c"
127.0.0.1:6382> lrem list1 1 i
(integer) 1
127.0.0.1:6382> lrange list1 0 -1
1) "jun"
2) "h"
3) "g"
4) "f"
5) "e"
6) "a"
7) "b"
8) "c"
127.0.0.1:6382> rpush list1 c c c c c
(integer) 13
127.0.0.1:6382> ltrem list1 -3 c
(error) ERR unknown command 'ltrem'
127.0.0.1:6382> lrem list1 -3 c
(integer) 3
127.0.0.1:6382> lrange list1 0 -1
 1) "jun"
 2) "h"
 3) "g"
 4) "f"
 5) "e"
 6) "a"
 7) "b"
 8) "c"
 9) "c"
10) "c"
127.0.0.1:6382> lindex list 0
(nil)
127.0.0.1:6382> lindex list1 0
"jun"
127.0.0.1:6382> llen list1
(integer) 10
127.0.0.1:6382> lset list 0 wu
(error) ERR no such key
127.0.0.1:6382> lset list1 0 wu
OK
127.0.0.1:6382> lrange list1 0 -1
 1) "wu"
 2) "h"
 3) "g"
 4) "f"
 5) "e"
 6) "a"
 7) "b"
 8) "c"
 9) "c"
10) "c"
複製代碼

應用

paste image

paste image

paste image

set

定義

Redis 的 Set 是 String 類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。 Redis 中集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是 O(1)。

特色

  • 無序
  • 無重複
  • 集合間操做

API

  • 集合內的操做
命令 說明 時間複雜度
sadd key element 向集合key添加element(若是element已經存在,添加失敗) O(1)
srem key element 將集合key中的element移除掉 O(1)
scard key 計算集合大小 O(1)
sismember key element 判斷element 是否在集合中 O(1)
srandmember key count 從集合中隨機挑count個元素 O(1)
spop key 從集合中隨機彈出一個元素 O(1)
smembers key 獲取集合全部元素 O(1)
srem key element 將集合key中的element移除掉 O(1)
  • 集合間的操做
命令 說明 時間複雜度
sdiff key1 key2 差集 O(1)
sinter key1 key2 交集 O(1)
sunion key1 key2 並集 O(1)
sidff/sinter/suion + store destkey 將差集、交集、並集保存在destkey中 O(1)

注意

  • srandmember不會破壞集合
  • spop會破會
  • smembers 返回的是無序集合,而且要注意量很大的時候回阻塞

練習

127.0.0.1:6382> sadd set1 a b c d 
(integer) 4
127.0.0.1:6382> srem set1 a
(integer) 1
127.0.0.1:6382> smembers set1
1) "d"
2) "c"
3) "b"
127.0.0.1:6382> scard set1
(integer) 3
127.0.0.1:6382> sismember set1 d
(integer) 1
127.0.0.1:6382> srandmember set1 2
1) "d"
2) "b"
127.0.0.1:6382> srandmember set1 2
1) "b"
2) "c"
127.0.0.1:6382> spop set1
"c"
127.0.0.1:6382> smembers set1
1) "d"
2) "b"
127.0.0.1:6382> srem set1 d
(integer) 1
127.0.0.1:6382> smembers set1
1) "b"
127.0.0.1:6382> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6382> sadd set2 a b c 12 8 9 1 2 
(integer) 8
127.0.0.1:6382> sdiff set1 set2
1) "3"
2) "4"
3) "5"
127.0.0.1:6382> sinter set1 set2
1) "2"
2) "b"
3) "1"
127.0.0.1:6382> sunion set1 set2
 1) "5"
 2) "2"
 3) "4"
 4) "1"
 5) "a"
 6) "8"
 7) "3"
 8) "b"
 9) "9"
10) "12"
11) "c"
127.0.0.1:6382> 
複製代碼

實戰

paste image

  • 抽獎系統, 用spop

paste image

  • 贊過的文章,收藏過的文章等

paste image

  • 標籤

paste image

  • 共同關注

總結

paste image

zset

定義

Redis 有序集合和集合同樣也是string類型元素的集合,且不容許重複的成員。不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。有序集合的成員是惟一的,但分數(score)卻能夠重複。

API

命令 說明 時間複雜度
zadd key score element 添加score和element O(logN)
zrem key element(能夠是多個) 將集合key中的element移除掉 O(1)
zscore key element 返回元素的分數 O(1)
zincrby key increScore element 增長或減小元素的分數 O(1)
zcard key 返回元素的總個數 O(1)
zrank(zrevrank) key member 返回元素的排名 O(1)
zrange(zrevrank) key start end [WITHSCORES] 返回指定索引範圍內的升序元素[分值] O(logN + m)
zrangebyscore(zrevrangebyscore) key minScore maxScore 返回指定分數範圍內的升序元素 O(logN + m)
zcount key minScore maxScore 返回有序集合內在指定分數範圍內的個數 O(logN + m)
zremrangebyrank key start end 刪除指定排名內的升序元素 O(logN + m)
zremrangebyscore key minScore maxScore 刪除指定分數內的升序元素 O(logN + m)
ZINTERSTORE destination numkeys(表示key的個數) key [key ...] 計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中
ZUNIONSTORE destination numkeys key [key ...] 計算給定的一個或多個有序集的並集,並存儲在新的 key 中

實戰

  • 各類榜單(score:timestamp, saleCount, followCount)

paste image

redis客戶端的使用

下載

找相應語言的下載(通常選擇有笑臉和星星的)

https://redis.io/clients#php
複製代碼

redis的其餘功能

慢查詢

生命週期

paste image

兩點說明

  • 慢查詢發生在第3階段
  • 客戶端超時不必定慢查詢,但慢查詢是客戶端超時的一個可能因素

兩個配置

  • slowlog-max-len

paste image

  • slowlog-log-slower-than

paste image

如何配置

paste image

慢查詢命令

  • slowlog get [n] : 獲取慢查詢隊列
  • slowlog len: 獲取慢查詢隊列長度
  • slowlog reset: 清空慢查詢隊列

運維經驗

paste image

pipeline:流水線

什麼是流水線

  • 1次網絡命令通訊模型

paste image

  • 批量網絡命令通訊模型

paste image

什麼是流水線

paste image

流水線的做用

paste image

兩點注意

  • redis的命令時間是微秒級別
  • pipeline每次條數要控制(網絡)

與原生操做對比

  • M操做

paste image

  • pipeline

paste image

使用建議

  • 注意每次pipeline攜帶數據量
  • pipeline每次只能做用在一個redis節點上
  • M操做與pipeline區別

發佈訂閱

角色

  • 發佈者
  • 訂閱者
  • 頻道

模型

paste image

paste image

API

  • publish channel message

  • subscribe [channel] 一個或者多個

  • unsubscribe [channel] 一個或者多個

練習

127.0.0.1:6382> publish weibomovie "hello world"
(integer) 1
127.0.0.1:6382> publish weibomovie "hello world2"
(integer) 1
複製代碼

另一個cli

127.0.0.1:6382> SUBSCRIBE weibomovie
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "weibomovie"
3) (integer) 1
1) "message"
2) "weibomovie"
3) "hello world"
1) "message"
2) "weibomovie"
3) "hello world2"

複製代碼

發佈訂閱與消息隊列

paste image

Bitmap

位圖

paste image

paste image

API

命令 說明 時間複雜度
setbit key offset value 給位圖指定索引設置值 O(1)
getbit key offset 獲取位圖指定索引的值 O(1)
bitcount key start end 獲取位圖指定範圍(start 到end,單位爲字節,若是不指定就獲取所有)位值爲1的個數 O(1)
bitop op destkey key [key...] 作多個bitmap的and,or,not,xor操做並將結果保存在destkey中 O(1)
bitpos key targetBit [start][end 計算位圖指定範圍(start到end,單位爲字節,若是不指定就是獲取所有)第一個偏移量對應的值等於targetBit的位置 O(1)

練習

127.0.0.1:6382> set hello big
OK
127.0.0.1:6382> getbit hello 
(error) ERR wrong number of arguments for 'getbit' command
127.0.0.1:6382> getbit hello 0
(integer) 0
127.0.0.1:6382> setbit hello 0 1
(integer) 0
127.0.0.1:6382> get hello
"\xe2ig"
127.0.0.1:6382> set hell a
OK
127.0.0.1:6382> bitcount hell
(integer) 3
127.0.0.1:6382> bitop and hell hello
(integer) 3
127.0.0.1:6382> set a a
OK
127.0.0.1:6382> set b b
OK
127.0.0.1:6382> bitop and c a b
(integer) 1
127.0.0.1:6382> get c
"`"
127.0.0.1:6382> bitpos a 1
(integer) 1
127.0.0.1:6382> bitpos a 0
(integer) 0
127.0.0.1:6382> set user2 100
OK

複製代碼

獨立用戶統計

重要理解 使用位圖去記錄用戶uid,其實就是記錄索引值,好比userid=100表明位圖下標100的值爲1

paste image

paste image

使用經驗

  • type=string,最大512MB
  • 注意setbit時的偏移量,可能有較大耗時
  • 位圖不是絕對好

HyperLogLog

新的數據結構

paste image

API

命令 說明
pfaddd key element [element...] 向hyperloglog添加元素
pfcount key [key...] 計算hyperloglog的獨立總數
pfmerge destkey sourceKey [sourcekey...] 合併多個hyperloglog

練習

127.0.0.1:6382> pfadd puser1 "u1" "u2" "u3"
(integer) 1
127.0.0.1:6382> pfcount puser1
(integer) 3
127.0.0.1:6382> pfadd puser2 "u3" "u4" "u5"
(integer) 1
127.0.0.1:6382> pfmerge puser puser1 puser2
OK
127.0.0.1:6382> pfcount puser
(integer) 5

複製代碼

內存消耗

paste image

使用經驗

  • 是否能容忍錯誤(錯誤率:0.81%)

  • 是否須要單條數據(沒有辦法取出)

GEO

GEO是什麼

paste image

5個城市經緯度

paste image

API

命令 說明
geoadd key longitude latitude member [longitude latitude member ...] 增長地理位置信息
geopos key member[member... 獲取地理位置信息
geodist key member1 member2[unit] 獲取兩個地理位置的距離,unit:m,km,mi,ft
georadius 獲取指定位置範圍內的地理位置信息集合

練習

127.0.0.1:6382> geoadd beijing 116.28 39.55
(error) ERR wrong number of arguments for 'geoadd' command
127.0.0.1:6382> geoadd geo 116.28 39.55 beijing 117.12 39.08 tianjin
(integer) 2
127.0.0.1:6382> geopos geo beijing
1) 1) "116.28000229597091675"
   2) "39.5500007245470826"
127.0.0.1:6382> geodist geo beijing tianjin
"89206.0576"
127.0.0.1:6382> 
複製代碼

相關說明

  • since 3.2+
  • type geoKey = zset
  • 沒有刪除API:zrem key member

redis持久化的取捨和選擇

持久化的做用

什麼是持久化

redis全部數據保存在內存中, 對數據的更新將異步地保存到磁盤上

paste image

持久化的實現方式

  • 快照
    • mysql dump
    • redis RDB
  • 寫日誌
    • mysql binlog
    • hbase hLog
    • redis AOF

RDB

什麼是RDB

paste image

觸發機制-主要三種方式

  • save(同步)

paste image

* 文件策略:如存在老的RDB文件,新替換老
* 複雜度:O(N)
複製代碼
  • bgsave(異步)

paste image

  • 自動配置

paste image

**相關配置

配置參數
save 900 1
save 300 10
save 60 10000
dbfilename dump-${port}.rdb
dir /bigdishpath
stop-writes-on-bgsav-error yes
rdbcompression yes

save與bgsave

paste image

觸發機制-不容忽略的方式

其餘的方式也會觸發生成RDB文件

  • 全量複製
  • debug reload
  • shutdown

總結

  • RDB是Redis內存到硬盤的快照,用於持久化
  • save一般會阻塞Redis
  • bgsave不會阻塞redis,可是會fork新進程
  • save自動配置知足任一就會被執行
  • 有些觸發機制不容忽視

AOF

RDB現存問題

  • 耗時,好性能

paste image

  • 不可控,丟失數據

paste image

什麼是AOF

  • 建立

paste image

  • 恢復

paste image

AOF三種策略

  • always

paste image

  • everysec

paste image

  • no

paste image

三種策略比較

paste image

AOF重寫

paste image

AOF重寫的做用

  • 減小硬盤佔用量
  • 加速恢復速度

AOF重寫實現的兩種方式

  • bgrewriteaof

paste image

  • aof重寫配置

paste image

paste image

AOF重寫流程

paste image

配置

paste image

RDB與AOF的選擇

paste image

RDB最佳策略

  • 集中管理
  • 主從,從開

AOF最佳策略

  • 開,緩存和存儲
  • AOF重寫集中管理
  • everysec

-------------------------華麗的分割線--------------------

看完的朋友能夠點個喜歡/關注,您的支持是對我最大的鼓勵。

我的博客番茄技術小棧掘金主頁

想了解更多,歡迎關注個人微信公衆號:番茄技術小棧

番茄技術小棧
相關文章
相關標籤/搜索