Redis入門筆記

Phycholee發表於2018-07-05

 

Redis起步

Linux安裝

  1. 官網下載tar.gz包
  2. 解壓: tar -xzf redis-3.2.5.tar.gz
  3. 進入redis-3.2.5執行命令: make
  4. 安裝: make install
  5. 複製配置檔案: cp redis.conf /etc/

啟動和關閉

  1. 在根目錄下建立目錄myredis,將目錄redis-3.2.5裡的redis.conf複製到此
  2. vim開啟redis.conf,修改裡面’daemonize no’改為’daemonize yes’
  3. 進入’usr/local/bin’,輸入命令列’redis-server /myredis/redis.conf’啟動服務
  4. 輸入命令列’redis-cli -p 6379’進入客戶端
  5. 進入後字首會是’127.0.0.1:6379> ‘,輸入’ping’,迴應’PONG’則成功
  6. 輸入’shutdown’關閉,再輸入’exit’退出

使用Redis

測試

啟動Redis後,在’usr/local/bin’下輸入命令’redis-benchmark’可以測試redis讀取效能等資訊

選擇庫

Redis預設有16個庫,可以用’select 4’選擇,從0開始

建立鍵值對

Redis為KV資料庫,資料以鍵值對形式儲存

	SET [key] [value]

	//建立
	SET kk HelloRedis

查詢

查詢時輸入’鍵’查詢

GET [key]

	//獲取
	get kk

keys查詢鍵

KEYS [pattern]

	//獲取所有鍵
	KEYS *

	//模糊匹配查詢鍵
	KEYS k?

查詢鍵數量

	DBSIZE

清除

清除當前庫所有資料

	FLUSHDB

清除所有庫的資料

	FLUSHALL

 

 

資料型別

五大資料型別

  • String (字串)
  • Hash (雜湊,類似Map)
  • List (列表)
  • Set (集合)
  • ZSet (Sorted Set有序集合)

Redis鍵key

獲取當前庫的所有key

	KEY *

判斷某個key是否存在

	EXIST k1

移動key到其他資料庫

	//移動k1到庫2
	MOVE k1 2

給key設定過期時間

	//設定k1鍵10秒後過期
	EXPIRE k1 10

檢視過期時間

	//檢視k1還有多久過期,-1為不過期,-2為已過期,正數為剩餘秒數
	TTL k1

檢視key是什麼型別

	TYPE k1

Redis字串String

普通增刪改查

	SET/GET/DEL/APPEND/STRLEN(查詢值的長度)

條件新增

	//SETEX [key] [second] [value],新增定時過期key
	//新增kex鍵10秒後過期
	SETEX kex 10 aaa

	//SETNX,資料庫不存在此可以才新增,失敗返回0
	SETNX k1 aa

加減,只有數字型別才能進行加減

	//INCR(自增)/DECR(自減)
	INCR k1

	//INCRBY/DECYBY
	//增加2
	INCRBY ki 2

擷取字串

	//GETRANGE
	//獲取0-4的值
	GETRANGE kk 0 4

	//SETRANGE
	//從下標5開始,將值換為aaaa,直到換完,剩餘的保持不變
	SETRANGE kk 5 aaaa

批量新增和獲取

	//MSET
	//批量插入鍵值
	MSET k1 v1 k2 v2

	//MGET
	//獲取k1和k2
	MGET k1 k2

	//MSETNX
	//當key不存在才插入,如果插入的鍵存在,則返回0
	MSETNX k1 va k3 vb

Redis列表List

新建List和檢視

	//LPUSH [key] [value] [value]...,左邊插入,
	LPUSH list01 1 2 3 4 5
	//LRANGE [key] [start] [stop],檢視,[stop]為'-1'表示最後一位下標
	LRANGE list01 0 -1
	//結果為5 4 3 2 1

	//RPUSH [key] [value] [value]...,右邊插入
	RPUSH list02 1 2 3 4 5
	//LRANGE [key] [start] [stop],檢視,[stop]為'-1'表示最後一位下標
	LRANGE list02 0 -1
	//結果為1 2 3 4 5

出棧(類比),即刪除頭尾值

	//LPOP [key],左邊出棧
	LPOP list01
	LRANGE list01 0 -1
	//結果為4 3 2 1

	//RPOP [key],右邊出棧
	RPOP list01
	LRANGE list01 0 -1
	//結果為4 3 2

根據下標獲取值

	//LINDEX [key] [index]
	LINDEX list01 0

獲取List長度

	//LLEN [key]
	LLEN list01

刪除value

	//LREM [key] [count] [value]
	//刪除3個value為2的資料
	LREM list01 3 2

擷取再賦值

	//LTRIM [key] [start] [stop]
	//擷取下標0-2的value,再重新賦值給list01,此時list01只有3個value
	LTRIM list01 0 2

取’源List’資料賦給’目標List’

	//RPOPLPUSH [source] [destination]
	//將list02右邊出棧,將值在list01左邊入棧
	RPOPLPUSH list02 list01

插入

	//LINSERT [key] BEFORE/AFTER [pivot] [value]
	//在list01中,value為1的前面新增3
	LINSERT list01 BEFORE 1 3

Redis列表Set

新增查詢

	//SADD [key] [member] [member]...,新增集合
	//set集合會自動去重
	SADD set01 1 1 2 2 3 3

	//SMEMBERS [key],查詢集合所有元素
	SMEMBERS set01

	//SISMEMBER [key] [member],查詢集合中是否存在此元素
	SISMEMBER set01 1

	//SCARD [key],查詢集合元素個數
	SCARD set01

刪除

	//SREM [key] [member]
	SREM set01 1

隨機數

	//SRANDMEMBER [key] [count],獲取n個隨機數
	//在set01中隨機獲取2個元素
	SRANDMEMBER set01 2

	//SPOP [key] [count],隨機出棧,與上類似
	//取一個時,可以省略count,上同
	SPOP set01

集合間移動元素

	//SMOVE [key1] [key2] [member],將key1中的member移動到key2
	SMOVE set01 set02 2

數學集合類

	//SDIFF [key1] [key1] ...,差集,取出key1獨有的元素
	SDIFF set01 set02

	//SINTER [key1] [key2] ...,交集
	SINTER set01 set02

	//SUNION [key1[ [key2] ...,並集

Redis雜湊Hash(重要)

雜湊表示在KV的V中存放KV

新增查詢刪除

	//HSET [key] [field] [value],新增雜湊map
	HSET hash01 name aa

	//HGET [key] [field],獲取

	//HMSET [key] [field] [value] ...,新增多個
	HMSET hash01 age 12 email aa@qq

	//HMGET [key] [field] ...,獲取多個
	HMGET hash01 name age email

	//HGETALL [key],獲取所有
	HGETALL hash01

	//HDEL [key] [field] ...,刪除
	HDEL hash01 age email

	//HLEN [key],獲取長度
	HLEN hash01

	//HKEYS [key],獲取所有的field
	HKEYS hash01

	//HVALS [key],獲取所有的value
	HVALS hash01

	//HSETNX [key] [field] [value],不存在才存入
	HSETNX hash01 age 1

自增

	//HINCRBY [key] [field] [increment],自增
	HINCRBY hash01 age 2

	//HINCRBYFLOAT [key] [field] [increment],浮點自增
	HINCRBY hash01 salary 0.2

Redis有序集合ZSet

ZSet在Set的基礎上新增了score

新增查詢

	//ZADD [key] [score] [member] ...,新增
	ZADD zset01 60 v1 70 v2 80 v3 90 v4 100 v5

	//ZRANGE [key] [start] [stop] (WITHSCORES),查詢
	ZRANGE zset01 0 -1 WITHSCORES

	//ZRANGEBYSCORE [key] [min] [max] (WITHSCORES) (LIMIT),條件查詢
	//查詢60-90之間的值,輸出score,再從第3條開始,限制2條輸出
	ZRANGEBYSCORE zset01 60 90 WITHSCORES LIMIT 2 2

刪除

	//ZREM [key] [member] ...,刪除
	ZREM zset01 v5

獲取長度

	//ZCARD [key],獲取長度
	ZSET zset01

	//ZCOUNT [key] [min] [max],條件獲取長度
	ZCOUNT zset01 60 80

	//ZSCORE [key] [member],根據member獲取score
	ZSCORE zset01 v1

逆排序

	//ZREVRANK [key] [member],獲得逆序的下標
	ZREVRANK zset01 v1
	
	//ZREVRANGE [key] [start] [stop] (WITHSCORE),逆序查詢
	ZREVRANGE zset01 0 2 WITHSCORE
	
	//ZREVRANGEBYSCORE [key] [min] [max] (WITHSCORE) (LIMIT),逆序條件查詢
	ZREVRANGEBYSCORE zset01 90 60 WITHSCORE LIMIT 2 2

 

 

 

持久化

RDB(Redis Database)

在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,也就是Snapshot快照,它恢復時是將快照檔案直接讀到記憶體裡。

Redis會單獨建立(fork)一個子程式來進行持久化,會先將資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個臨時檔案替換上次持久化好的檔案。整個過程中,主程式是不進行任何IO操作的,這就確保了極高的效能如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的資料可能丟失。

配置檔案

RDB的配置在redis.conf中,在SNAPSHOTTING模組

主要配置

	//save <seconds> <changes>,表示在多少秒內達到多少次改動就出發儲存
	save 900 1

	rdbcompression yes,是否壓縮,預設壓縮

	dbfilename dump.rdb,持久化檔名

	dir ./,儲存所在目錄

手動持久化

  • 在客戶端直接輸入’SAVE‘命令即可手動持久化當前資料

  • FLUSHALL‘命令也會觸發持久化資料操作

AOF(Append Only File)

以日誌的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄),只許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,redis重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作.

配置檔案

RDB的配置在redis.conf中,在APPEND ONLY MODE模組

	//開啟AOF,預設為no
	appendonly yes

	//持久化檔名
	appendfilename "appendonly.aof"

	//記錄時間,預設為一秒一次
	appendfsync everysec

rewrite

AOF採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當AOF檔案的大小超過所設定的閾值時,Redis就會啟動AOF檔案的內容壓縮,只保留可以恢復資料的最小指令集.可以使用命令bgrewriteaof

原理:AOF檔案持續增長而過大時,會fork出一條新程式來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程式的記憶體中資料,每條記錄有一條的Set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof檔案,這點和快照有點類似。

觸發機制:Redis會記錄上次重寫時的AOF大小,預設配置是當AOF檔案大小是上次rewrite後大小的一倍且檔案大於64M時觸發

可在配置檔案更改出發條件

	//預設為一倍
	auto-aof-rewrite-percentage 100
	
	auto-aof-rewrite--min-size 64mb

修復appendonly.aof

可使用命令’redis-check-aof –fix‘修復appendonly.aof的指令,使其正確可用。


事務

使用

	//開啟事務
	MULTI
	
	//命令入隊
	set k1 v2
	set k2 v2

	//提交事務
	EXEC

	//放棄事務
	DISCARD

	//監聽某個key,如果事務中間被人修改了,事務失敗
	WATCH [key]

	//取消監聽
	UNWATCH [key]

如果其中的命令格式錯誤,使用’EXEC’提交後會回滾,即所有命令都不執行

但如果是命令執行時錯誤,那麼錯誤的命令報錯,其他命令繼續執行

特性

  • 單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。

  • 沒有隔離級別的概念:佇列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,也就不存在”事務內的查詢要看到事務裡的更新,在事務外查詢不能看到”這個讓人萬分頭痛的問題。

  • 不保證原子性:redis同一個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾

 

主從複製

使用步驟

修改配置檔案

複製三份配置檔案’redis.conf’,分別命名為’redis6379.conf’,’redis6380.conf’,’redis6381.conf’

進入每個配置檔案,按賦予的埠號修改資訊,下面以6380埠為例

	//開啟守護執行緒執行
	daemonize yes

	//修改埠
	port 6380

	//修改pidfile
	portfile /var/run/redis_6380.pid

	//修改logfile
	logfile "6380.log"

	//修改備份檔案dbfilename
	dbfilename dump6380.rdb

使用

分別使用上面的三個配置檔案開啟三個redis服務,其中6379作為主庫

在主庫先存入3個KV資料

兩個從庫開啟後輸入命令連線從庫

	//SLAVEOF [ip] [port]
	SLAVEOF	127.0.0.1 6379

	//解除從庫狀態
	SLAVE no one

	//可檢視資料庫主從庫情況
	INFO REPLICATION

之後主庫的所有資料都會複製到從庫,但從庫不可以寫入資料,只能讀取。

注意:主庫關閉後,從庫會待命,等待主庫上線;從庫關閉重新開啟後不再連線主庫,需要重新輸入命令連線。

哨兵模式

所謂哨兵模式,就是監控主庫,主庫掛了以後,在從庫中選出一個來當做主庫

在’/myredis’下建立檔案’sentinel.conf’,加入以下配置

	//sentinel monitor <自定義主庫名> ip port <投票大於數字>
	sentinel monitor post6397 127.0.0.1 6379 1

在’/usr/local/bin’下輸入’redis-sentinel /myredis/sentinel.conf’可開啟哨兵監控。

當主庫掛了以後,從庫中的某一個庫會當選為主庫,此後主庫再上線後不會恢復為主庫,將降級為從庫。

 

 

相關文章