Redis完整快速入門 看完就無敵!!!!!!
Redis
NoSQL
優點:易擴充套件,NoSQL資料庫種類繁多,但是一個共同的特點都是去掉關係資料庫的關係型特性,資料之間無關係,不需要設計資料庫,這樣就非常容易擴充套件,NoSQL資料庫都具有非常高的讀寫效能。
大資料時代
3V:海量Volume,多樣Variety,實時Velocity。
3高:高併發,高可擴,高效能。
4種類型
-
鍵值(Key-Value)儲存資料庫:這一類資料庫主要會使用到一個雜湊表,這個表中有一個特定的鍵和一個指標指向特定的資料。
-
列儲存資料庫:這部分資料庫通常是用來應對分散式儲存的海量資料。鍵仍然存在,但是它們的特點是指向了多個列。
-
文件型資料庫:JSON
-
圖形(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。
基本配置:
-
配置哨兵配置檔案。
-
啟動哨兵:redis-sentinel xxxx # 哨兵配置檔案
Redis快取穿透與雪崩
快取穿透
解決
快取擊穿
解決
快取雪崩
解決