前言
最近學習Redis6.x,特做筆記以備忘,與大家共學。課程是從私塾線上下載的,他們把架構師課程都放出來了,大家可以去下載學習,不要錢的,地址是http://t.hk.uy/eac,課程很不錯,值得學習!關鍵是不要錢,嘻嘻!
Redis簡介
Redis(REmote DIctionary Server 遠端字典伺服器)
Redis是一個使用C編寫的、開源的、Key-Value型、基於記憶體執行並支援持久化的NoSQL資料庫,是當前最熱門的NoSql資料庫之一
Redis的兩種基本使用方式
一種就是當作資料庫快取來使用
另外一種就是直接當作資料庫來使用
Redis安裝
1:去官網下載最新的版本:http://redis.io/download ,這裡用的是6.0.8
2:解壓後,進入解壓好的資料夾
3:redis的安裝非常簡單,因為已經有現成的Makefile檔案,所以直接先make,然後make install就可以了
注意:編譯安裝需要gcc5.3以上
4:安裝的位置預設在/usr/local/bin ,有:
(1)redis-benchmark:效能測試工具,測試Redis在你的系統及配置下的讀寫效能
(2)redis-check-aof:用於修復出問題的AOF
(3)redis-check-rdb:用於修復出問題的rdb檔案
(4)redis-cli:Redis命令列操作工具
(5)redis-sentinel:Redis叢集的管理工具
(6)redis-server:Redis伺服器啟動程式
5:啟動Redis的時候,只有一個引數,就是指定配置檔案redis.conf的路徑。redis.conf在解壓的資料夾裡面有,複製一個出來,按需修改即可,也可--port來指定埠
基本的修改如下幾個引數:
#daemonize no 改為yes,開啟後臺執行,預設是前臺執行
daemonize yes
#把這一行註釋,監聽所有IP
#bind 127.0.0.1
#protected-mode yes 如果改為no,則是關閉保護模式,這種模式下不能配置系統服務,建議還是開啟
protected-mode yes
#修改本引數,指定資料目錄
dir /mydata/redis6/data
#修改本引數,指定日誌目錄
logfile /mydata/redis6/redis_6379.log
6:連線Redis並操作,使用redis-cli,如果有多個例項,可以redis-cli -h 伺服器ip -p 埠 -u 使用者 -a密碼
7:關閉Redis,redis-cli shutdown,如果有多個例項,可以指定埠來關閉:redis-cli -p 6379 shutdown
Redis基礎知識
單執行緒模型
Redis的伺服器程式採用的是單執行緒模型來處理客戶端的請求。對讀寫等事件的響應是通過對epoll函式的包裝來做到的。
Redis的實際處理速度完全依靠主程式的執行效率,假如同時有多個客戶端併發訪問伺服器,則伺服器處理能力在一定情況下將會下降。假如你要提升伺服器的併發能力,那麼可以採用在單臺機器部署多個redis程式的方式。
I/O多執行緒
Redis6開始支援I/O多執行緒。
目前Redis主要的效能瓶頸之一,就在於I/O資料的讀寫效能。 Redis6引入的“多執行緒”機制就是對於該瓶頸的優化。
核心思路是,將主執行緒的 I/O 讀寫任務拆分出來給一組獨立的執行緒執行,使得多個 socket 的讀寫可以並行化。
多資料庫
1:Redis每個資料庫對外都是以從0開始遞增的數字來命名,預設16個資料庫,預設使用0號資料庫,可以使用Select 數字 來選擇要使用的資料庫
2:使用Dbsize可以檢視當前資料庫的key的數量
3:可以在多個資料庫間移動資料,使用move key 目的資料庫編號 就可以了
4:使用flushdb可以清除某個資料庫的資料
5:Redis不支援自定義資料庫名字
6:Redis不支援為每個資料庫設定不同的訪問密碼
7:多個資料庫之間並不是完全獨立的,FlushAll可以清空全部的資料
8:Redis的資料庫更像是一個名稱空間
Redis的key
Redis的key是字串型別,如果中間有空格或者轉義字元等,要用“”。
1:命名建議:物件型別:物件ID:物件屬性
2:多個單詞之間以“.”來分隔
3:Key的命名,應該在可讀的情況下,儘量簡短
Redis的Value支援五種型別
1:String:字串,可以儲存String、Integer、Float型的資料,甚至是二進位制資料,一個字串最大容量是512M
2:List:字串List,底層實現上不是陣列,而是連結串列,也就是說在頭部和尾部插入一個新元素,其時間複雜度是常數級別的;其弊端是:元素定位比陣列慢
3:Set:字串Set,無序不可重複,是通過HashTable實現的
4:Hash:按Hash方式來存放字串
5:ZSet:字串Set,有序且不可重複,根據Score來排序。底層使用雜湊表和跳躍表來實現,所以讀取中間部分資料也很快
對Key的操作命令
1:Keys:獲得符合規則的鍵名列表
格式是keys pattern,pattern支援glob風格萬用字元格式:
(1)? 匹配一個字元
(2)* 匹配任意個字元
(3)[] 匹配中括號內的任一字元,可以用-來表示一個範圍
(4)\x 匹配字元x,用於轉義符號
2:exists:判斷鍵值是否存在,格式是exists key
3:del:刪除key,格式是del key。
小技巧:Del命令不支援萬用字元,可以結合linux管道和xargs命令來自定義刪除,示例如下:redis-cli keys k* | xargs redis-cli del
4:type:獲得鍵值的資料型別,格式是type key
5:rename:改名,格式是rename oldKey newKey
6:renamenx:如果不存在則建立,格式是rename oldKey newKey
7:randomkey:隨機返回一個key
String型別的操作
Redis的String型別可以是字串、數字、或者是二進位制資料(圖片、音訊、視訊)等,但是值最大不能超過512MB
對String型別的操作命令
1:get、set、del:獲取key的值、設定key和值、刪除key
類似的set命令還有:setex,psetex,setnx
2:incr、decr:遞增和遞減整數值,格式是incr key值
3:incrby、decrby:遞增和遞減整數值,可指定增減的數值,格式是incrby key值 正負數值
4:incrbyfloat:遞增和遞減浮點數值,格式是incrbyfloat key值 正負數值
5:append:在尾部追加值,格式是append key值 追加的值
6:getrange:獲取指定索引範圍內的值,格式是getrange key值 起始索引 結束索引
7:setrange:從索引位置開始設定後面的值,格式是setrange key值 offset索引 值
8:strlen:返回鍵值的長度,格式是strlen key值
9:mget:同時獲得多個鍵的值,格式是mget 多個key值
10:mset:同時設定多個鍵值對,格式是mset key值 value , key和value可以多對
11:bitcount:獲取範圍內為1的二進位制位數,格式是bitcount key值 [start end]
12:getbit:獲取指定位置的二進位制位的值,格式是getbit key值 offset索引
13:setbit:設定指定位置的二進位制位的值,格式是setbit key值 offset索引 值
14:bitop:對多個二進位制值進行位操作,格式是bitop 操作 目的key key值1 key值2,操作有and、or、xor、not,key值可以是多個
15:getset:原子的設定key的值,並返回key的舊值 ,格式是getset key value
對List型別的操作命令
1:lpush/rpush:新增值,格式是 rpush list的key item項的值,值可以是多個
2:lpushx/rpushx:只有當list存在時才會從左/右邊依次追加元素
3:linsert:插入元素,格式是linsert list的key before|after 定位查詢的值 新增的值
4:lrange:按索引範圍獲取值,格式是 lrange list的key 起始索引 終止索引,-1表示最後一個索引
5:lindex:獲取指定索引的值,格式是 lindex list的key 索引號
6:lpop/rpop:彈出值,格式是 lpop list的key
7:llen:獲取元素個數,格式是llen list的key
8:lrem:刪除元素,格式是lrem list的key 數量 item項的值,數量可正負,表示從左或右刪除,如果數量為0,表示刪除全部與給定值相等的項
9:ltrim:保留指定索引區間的元素,格式是ltrim list的key 起始索引 結束索引
10:blpop/brpop:彈出值,格式是blpop list的key值 過期時間,key可以是多個,如果沒有值,會一值等待有值,直到過期
11:rpoplpush:將元素從一個列表轉移到另外一個列表,格式是rpoplpush 源list的key值 目的list的key值
12:brpoplpush:將元素從一個列表轉移到另外一個列表,格式是brpoplpush 源list的key值 目的list的key值 過期時間
13:lset:設定指定索引的值,格式是lset list的key 索引 新的值
對Set型別的操作命令
1:sadd:新增元素,格式是 sadd set的key item項的值,item項可以多個
2:smembers:獲取集合中所有元素,格式是 smembers set的key
3:sismember:判斷元素是否在集合中,格式是 sismember set的key item項的值
4:srem:刪除元素,格式是 srem set的key item項的值
5:scard:獲取集合中元素個數,格式是scard set的key
6:srandmember:隨機獲取集合中的元素,格式是srandmember set的key [數量],數量為正的時候,會隨機獲取這麼多個不重複的元素;如果數量大於集合元素個數,返回全部;如果數量為負,會隨機獲得這麼多個元素,可能有重複
7:spop:彈出元素,格式是spop set的key
8:smove:移動元素,格式是smove 源set的key 目的set的key item項的值
9:sdiff:差集,返回在第一個set裡面而不在後面任何一個set裡面的項,格式是sdiff set的key 用來比較的多個set的key
10:sdiffstore:差集並保留結果,格式是命令 存放結果的set的key set的key 用來比較的多個set的key
11:sinter:交集,返回多個set裡面都有的項,格式是sinter 多個set的key
12:sinterstore:交集並保留結果,格式是sinter 存放結果的set的key 多個set的key
13:sunion:並集,格式是sunion 多個set的key
14:sunionstore:並集並保留結果,格式是sunionstore 存放結果的set的key 多個set的key
對Hash型別的操作命令
1:hset:設定值,格式是hset Hash的Key 項的key 項的值
2:hmset:同時設定多對值,格式是hmset Hash的Key 項的key 項的值,項的key和值可多對
3:hgetall:獲取該Key下所有的值,格式是hgetall Hash的Key
4:hget:獲取值,格式是hget Hash的Key 項的key
5:hmget:同時獲取多個值,格式是hmget Hash的Key 項的key,項的key可以是多個
6:hdel:刪除某個項,格式是hdel Hash的Key 項的key
7:hlen:獲取Key裡面的鍵值對數量,格式是hlen Hash的Key
8:hstrlen:返回指定filed對應的value的字元長度
9:hexists:判斷鍵值是否存在,格式是hexists Hash的Key 項的key
10:hkeys:獲取所有Item的key,格式是hkeys Hash的Key
11:hvals:獲取所有Item的值,格式是hvals Hash的Key
12:hincrby:增減整數數字,格式是hincrby Hash的Key 項的key 正負整數
13:hincrbyfloat:增減Float數值,格式是hincrbyfloat Hash的Key 項的key 正負float
14:hsetnx:如果項不存在則賦值,存在時什麼都不做,格式是hsetnx Hash的Key 項的key 項的值
ZSet型別的操作
ZSet和Set一樣是string型別元素的集合,且不允許重複。不同的是,ZSet中每個元素都會關聯一個double型別的分數,並按照分數來為集合中的成員進行從小到大的排序
對ZSet型別的操作命令
1:zadd:新增元素,格式是zadd zset的key score值 項的值,Score和項可以是多對,score可以是整數,也可以是浮點數,還可以是+inf表示正無窮大,-inf表示負無窮大
2:zrange:獲取索引區間內的元素,格式是zrange zset的key 起始索引 終止索引 (withscores)
3:zrangebyscore:獲取分數區間內的元素,格式是zrangebyscore zset的key 起始score 終止score (withscores),預設是包含端點值的,如果加上“(”表示不包含;後面還可以加上limit來限制
4:zrem:刪除元素,格式是zrem zset的key 項的值,項的值可以是多個
5:zcard:獲取集合中元素個數,格式是zcard zset的key
6:zincrby:增減元素的Score,格式是zincrby zset的key 正負數字 項的值
7:zcount:獲取分數區間內元素個數,格式是zcount zset的key 起始score 終止score
8:zrank:獲取項在zset中的索引,格式是zrank zset的key 項的值
9:zscore:獲取元素的分數,格式是zscore zset的key 項的值,返回項在zset中的score
10:zrevrank:獲取項在zset中倒序的索引,格式是zrevrank zset的key 項的值
11:zrevrange:獲取索引區間內的元素,格式是zrevrange zset的key 起始索引 終止索引 (withscores)
12:zrevrangebyscore:獲取分數區間內的元素,格式是zrevrangebyscore zset的key 終止score 起始score (withscores)
13:zpopmax:從集合中彈出分數最高的成員,返回該成員和分值,然後從集合中將其移出
14:zpopmin:從集合中彈出分數最低的成員,返回該成員和分值,然後從集合中將其移出
15:bzpopmax:在引數中的所有集合均為空的情況下,阻塞連線。引數中包含多個有序集合時,按照引數中key的順序,返回第一個非空key中分數最大的成員和對應的分數。引數 timeout 可以理解為客戶端被阻塞的最大秒數值,0 表示永久阻塞。
16:bzpopmin:在引數中的所有集合均為空的情況下,阻塞連線。引數中包含多個有序集合時,按照引數中key的順序,返回第一個非空key中分數最小的成員和對應的分數。引數 timeout 可以理解為客戶端被阻塞的最大秒數值,0 表示永久阻塞。
17:zremrangebyrank:刪除索引區間內的元素,格式是zremrangebyrank zset的key 起始索引 終止索引
18:zremrangebyscore:刪除分數區間內的元素,格式是命令 zset的key 起始score 終止score
19:zinterstore:交集,格式是ZINTERSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
20:zunionstore:並集,格式是ZUNIONSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
排序的操作
1:sort:可以對List、Set、ZSet裡面的值進行排序。格式是SORT source-key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE dest-key]
2:by:設定排序的參考鍵,可以是字串型別或者是Hash型別裡面的某個Item鍵,格式是 Hash鍵名:->Item鍵。設定了by參考鍵,sort將不再依據元素的值來排序,而是對每個元素,使用元素的值替換參考鍵中的第一個””,然後獲取相應的值,再對獲得的值進行排序。如果參考鍵不存在,預設為0。
如果參考鍵值一樣,再以元素本身的值進行排序。
3:get:指定sort命令返回結果包含的鍵的值,形如: Hash鍵名:*->Item鍵,可以指定多個get,返回的時候,一行一個。如果要返回元素的值,用get #。
4:對較大資料量進行排序會嚴重影響效能,使用建議:
(1)儘量減少待排序集合中的資料
(2)使用limit來限制獲取的資料量
(3)如果要排序的資料量較大,可以考慮使用Store引數來快取結果
處理過期keys的機制
1:定期刪除:Redis會在後臺,預設每秒10次的執行如下操作: 隨機選取100個key校驗是否過期,如果有25個以上的key過期了,立刻額外隨機選取下100個key(不計算在10次之內)。也就是說,如果過期的key不多,Redis最多每秒回收200條左右,如果有超過25%的key過期了,它就會做得更多,這樣即使從不被訪問的資料,過期了也會被刪除掉
2:惰性刪除:當client主動訪問key時,會先對key進行超時判斷,過時的key會立刻刪除
處理過期keys的命令
1:expire:設定過期時間,格式是expire key值 秒數
2:expireat:設定過期時間,格式是expireat key值 到秒的時間戳
3:ttl:檢視還有多少秒過期,格式是ttl key值,-1表示永不過期,-2表示已過期
4:persist:設定成永不過期,格式是persist key值,刪除key的過期設定;另外使用set或者getset命令為鍵賦值的時候,也會清除鍵的過期時間
5:pttl:檢視還有多少毫秒過期,格式是pttl key值
6:pexpire:設定過期時間,格式是pexpire key值 毫秒數
7:pexpireat:設定過期時間,格式是pexpireat key值 到毫秒的時間戳
後記
我會持續的把我學習Redis6.x過程的筆記記錄下來,跟大家一起學習。