1. 程式人生 > 資料庫 >Redis完整快速入門 看完就無敵!!!!!!

Redis完整快速入門 看完就無敵!!!!!!

Redis

NoSQL

優點:易擴充套件,NoSQL資料庫種類繁多,但是一個共同的特點都是去掉關係資料庫的關係型特性,資料之間無關係,不需要設計資料庫,這樣就非常容易擴充套件,NoSQL資料庫都具有非常高的讀寫效能。

大資料時代
3V:海量Volume,多樣Variety,實時Velocity。
3高:高併發,高可擴,高效能。

4種類型

  1. 鍵值(Key-Value)儲存資料庫:這一類資料庫主要會使用到一個雜湊表,這個表中有一個特定的鍵和一個指標指向特定的資料。

  2. 列儲存資料庫:這部分資料庫通常是用來應對分散式儲存的海量資料。鍵仍然存在,但是它們的特點是指向了多個列。

  3. 文件型資料庫:JSON

  4. 圖形(Graph)資料庫:…
    在這裡插入圖片描述
    MongoDB
    MongoDB是一個介於關係資料庫和非關係資料庫之間的資料庫,是一種文件型資料庫。

Redis

Redis:remote dictionary server是一種key-value資料庫,基於記憶體的資料結構儲存系統,作用於資料庫、快取、訊息中介軟體。

基本命令

ping #測試連線 返回pong
keys * #檢視所有key值
set xxx xxx #設定key-value
get xxx #獲取對應key的value
select x #切換資料庫
dbsize #檢視當前資料庫大小
flushdb #清空當前資料庫
flushall #清空所有資料庫
exsist #是否存在對應key
move xxx x #移動key到對應的資料庫下標
expire xxx x#使對應key 在指定秒內過期
ttl xxx #查詢key剩餘存活時間
type xxx #查詢key型別

使用benchmark
在這裡插入圖片描述
在這裡插入圖片描述
基本配置
預設下使用第0個數據庫,一共有16個數據庫。
在這裡插入圖片描述
redis是單執行緒的且使用C語言開發,其是基於記憶體操作,redis受限於記憶體和頻寬。

五大資料型別

string

append xxx xxx #新增
strlen xxx #獲取長度
incr xxx #自增1
decr xxx #自減1
incrby xxx x #直接增加x
decrby xxx x #直接減少x

getrange xxx x x #獲取指定範圍字串 -1全部
setrange xxx x x #修改指定範圍字串
setex xxx #set with expire
setnx xxx #set if not exsist
mset xx xx xx#批量設定值
msetnx #mset if not exsist 原子性操作,一起成功,一起失敗
set user:1 {name:zhangsan,age:3} # user:1物件 value為json
mset user:1:name zzy user:1:age 21
getset #先get再set

List

#都是L開頭
lpush xxx xxx #存入列表頭部
ppush xxx xxx #存入尾部
lrange xxx x x #獲取指定範圍的
lpop xxx #移除頭部值
rpop #移除尾部值
llen xxx #返回list長度
lrem list 1 one # #移除指定數量的value
ltrim x x #保留指定範圍的元素,其他清除
rpoplpush xxx xxx #將一個list pop的值push到另外一個list
leset xxx x xxx #更新指定下標元素的值,前提是key存在
linsert xxx before|after xxx #將對應value插入到value前|後

set

#set中不能重複值
sadd xxx xxx #新增
sismember xxx xxx #判斷set中是否存在value
smembers xxx #返回set中所有的元素
scard xxx #獲取set中的個數
srem xxx xxx #移除指定set中的對應value元素
srandmember xxx x #隨機獲取指定set中x個元素
spop xxx #刪除set中隨機元素
smove xxx xxx x #將對應value的元素移動到另一set中

sdiff xxx xxx #差集
sinter xxx xxx #交集 共同關注
sunion xxx xxx #並集

hash

#key-map,value是一個map
hset xxx filed xxx # hset nameset name1 zzy
hget xxx xxx #hget nameset name1
hmset xxx xxx xxx xxx #hmset nameset name1 zzy nam2 tzq
hmget xxx xxx #hmget name1 name2
hgetall xxx # hgetall nameset
hdel xxx xxx #hdel namset name1
hlen xxx #獲取hash元素數量
hexists xxx xxx #hexists nameset name1
hkeys xxx #獲取所有key
hvals xxx #獲取所有value
hincrby xxx xxx x #
hsetnx xxx xxx xxx # if not exsist

zset

#有序集合,在set上增加一個值s
zadd xxx x x #zadd myset 1 one 2 two
zrange xxx x x #獲取指定範圍 zrange myset 0 1
zrangebyscore xxx xx xx #

在這裡插入圖片描述
在這裡插入圖片描述

zcard #獲取zset中的個數
zcount xxx x x #指定區間的元素數量

Geospatial

地理空間,多用於打車距離,附近的人,定位。

geoadd china:city 114.31 30.52 wuhan 106.71 26.57 guiyang
 #新增經緯度 緯度:-180到180 經度:-85.05到85.05
geopos xxx xxx #查詢元素的值
geodist xxx xxx #兩個元素之間的距離
georadius xxx xxx #china:city 110 30 1000 km withcoord count 3
georadiusbymember xxx xxx #以元素為中心,半徑查詢
geohash xxx xxx #將經緯度轉為字串,用於hash

HyperlogLog

基於基數統計演算法,多用於user visit統計。

pfadd mykey a b c d e f g h i j #新增
pfcount mykey #統計元素個數
pfmerge mykey3 mykey mykey2 #將後兩個集合的並集放入第一個集合

Bitmaps

點陣圖,多用於打卡,統計使用者資訊,只有兩種狀態。

setbit daka 0 1 #daka的0位元素位1
getbit daka x #檢視daka下某一下標元素的值
bitcount daka x x #指定範圍內為1的元素個數

事務

Redis的事務是不保證原子性,沒有隔離級別,所有的命令在事務中並不執行,直到使用exec。

開啟事務:multi
入隊:…
執行事務:exec
在這裡插入圖片描述
取消事務
在這裡插入圖片描述
編譯異常:命令有錯,整個事務中都不會執行。
執行異常:語法性錯誤,只有錯誤這條命令不會執行。
在這裡插入圖片描述

樂觀鎖

watch key #監視一個key值,對key加上鎖,相當於樂觀鎖,在這個事務執行期間,其他執行緒對key修改,那麼這個事務就不會成功
unwatch key #釋放鎖
#若使用watch提交事務失敗,可以unwatch後再次watch獲取最新值

jedis

開發中使用java操作redis。不做具體分析。

conf檔案

包含其他conf檔案
在這裡插入圖片描述
pid檔案,如果以後臺方式執行麼久需要指定一個pid檔案
在這裡插入圖片描述
日誌級別:debug verbose notice warning
在這裡插入圖片描述
生成的日誌檔案,預設為標準輸出。
在這裡插入圖片描述
預設16個數據庫。
在這裡插入圖片描述
快照,在規定時間內執行多少次操作就會持久化到檔案,redis是基於記憶體,斷電就沒了,必須要持久化資料。
save 900 1 (900秒內對一個key操作,持久化)
在這裡插入圖片描述
持久化error,是否還要繼續工作。
在這裡插入圖片描述
是否壓縮rdb檔案。
在這裡插入圖片描述
是否校驗rdb檔案。
在這裡插入圖片描述
檔名和儲存路徑
在這裡插入圖片描述
設定密碼,預設為空。
在這裡插入圖片描述
最大客戶端連線數。
在這裡插入圖片描述
最大記憶體容量。
在這裡插入圖片描述
記憶體滿後的處理策略。
在這裡插入圖片描述
在這裡插入圖片描述

redis持久化

rdb

滿足save條件、執行flushall、退出redis都會產生一個dump.rdb檔案,每次redis啟動時,都會自動載入conf檔案中的配置,在conf指定rdb檔案路徑即可。
fork出一個子程序來執行rdb檔案的產生,這樣適合大規模資料恢復,同時不會影響到主執行緒,但是fork出來會佔用一定的記憶體空間,如果意外宕機,可能會造成資料丟失。
在這裡插入圖片描述

aof

append only file,預設下是關閉,將除了讀命令的其他所有命令記錄下來,恢復時就將檔案中的命令全執行一遍,每次都是以append追加的方式新增命令,都會儲存到appendonly.aof。
如果appendonly.aof出現錯誤,redis就啟動不了,使用redis-check-aof,來校驗aof檔案。
在這裡插入圖片描述

優缺點

在這裡插入圖片描述

Redis釋出訂閱

一種訊息通訊模式,傳送者傳送訊息,接受者接收訊息,可以實現關注等功能。
一個client可以訂閱多個傳送者。
在這裡插入圖片描述
在這裡插入圖片描述
redis-server會維護一個字典,字典的鍵就算頻道,而值就是連結串列,連結串列中包含訂閱這個頻道的訂閱者。使用subscribe就是將訂閱者加入到對應的連結串列中。

Redis主從複製

在這裡插入圖片描述
在這裡插入圖片描述

配置

使用info repilication命令檢視當前redis1的主從資訊。
在這裡插入圖片描述
配置當前redis變為指定redis的從slave。
在這裡插入圖片描述
在conf檔案中配置,才是永久的 replication,使用命令列配置的,在slave機斷開重啟後就又會變為預設的master。
在這裡插入圖片描述
slave只能讀
在這裡插入圖片描述

原理

在這裡插入圖片描述

哨兵模式

在沒有配置哨兵模式下,如果master宕機,slave任然為slave,此時只能手動輸入命令:slaveof no one,清除slave模式,然後其他redis需要重新slave of 指認master。若master在宕機後又重新上線,但是slave已經手動完成slaveof no one,此時任然會變為原來的模式。
在這裡插入圖片描述
在配置哨兵模式後: sentinel [ˈsentɪnl]
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
一個哨兵也許也會出現問題,採用多哨兵模式。
在這裡插入圖片描述
原理:通過心跳機制發現master宕機後,哨兵並不會馬上faileover,而等到一定數量的其他哨兵也發現master宕機後,哨兵之間會投票(根據演算法),然後就會執行failover,並通過釋出訂閱模式來切換監控的redis。當原來的master上線後,自動變為slave。
基本配置:

  1. 配置哨兵配置檔案。
    在這裡插入圖片描述

  2. 啟動哨兵:redis-sentinel xxxx # 哨兵配置檔案
    在這裡插入圖片描述

Redis快取穿透與雪崩

快取穿透

在這裡插入圖片描述
解決
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

快取擊穿

在這裡插入圖片描述
解決
在這裡插入圖片描述

快取雪崩

在這裡插入圖片描述
解決
在這裡插入圖片描述