最近學習Redis6.x,特作筆記以備忘,與你們共學。課程是從私塾在線下載的,他們把架構師課程都放出來了,你們能夠去下載學習,不要錢的,地址是http://sishuok.com/freecourses.html?frombwr1,課程很不錯,值得學習!關鍵是不要錢,嘻嘻!html
Redis是一個使用C編寫的、開源的、Key-Value型、基於內存運行並支持持久化的NoSQL數據庫,是當前最熱門的NoSql數據庫之一linux
一種就是看成數據庫緩存來使用 另一種就是直接看成數據庫來使用
1:去官網下載最新的版本:http://redis.io/download ,這裏用的是6.0.8redis
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的服務器程序採用的是單線程模型來處理客戶端的請求。對讀寫等事件的響應是經過對epoll函數的包裝來作到的。併發
Redis的實際處理速度徹底依靠主進程的執行效率,假如同時有多個客戶端併發訪問服務器,則服務器處理能力在必定狀況下將會降低。假如你要提高服務器的併發能力,那麼能夠採用在單臺機器部署多個redis進程的方式。
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是字符串類型,若是中間有空格或者轉義字符等,要用「」。
1:命名建議:對象類型:對象ID:對象屬性 2:多個單詞之間以「.」來分隔 3:Key的命名,應該在可讀的狀況下,儘可能簡短
1:String:字符串,能夠存儲String、Integer、Float型的數據,甚至是二進制數據,一個字符串最大容量是512M
2:List:字符串List,底層實現上不是數組,而是鏈表,也就是說在頭部和尾部插入一個新元素,其時間複雜度是常數級別的;其弊端是:元素定位比數組慢
3:Set:字符串Set,無序不可重複,是經過HashTable實現的
4:Hash:按Hash方式來存放字符串
5:ZSet:字符串Set,有序且不可重複,根據Score來排序。底層使用散列表和跳躍表來實現,因此讀取中間部分數據也很快
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
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
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 索引 新的值
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
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和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參數來緩存結果
1:按期刪除:Redis會在後臺,默認每秒10次的執行以下操做: 隨機選取100個key校驗是否過時,若是有25個以上的key過時了,馬上額外隨機選取下100個key(不計算在10次以內)。也就是說,若是過時的key很少,Redis最多每秒回收200條左右,若是有超過25%的key過時了,它就會作得更多,這樣即便從不被訪問的數據,過時了也會被刪除掉
2:惰性刪除:當client主動訪問key時,會先對key進行超時判斷,過期的key會馬上刪除
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過程的筆記記錄下來,跟你們一塊兒學習。