1、redis的不同之處
Redis擁有其他數據庫不具備的數據結構,又擁有內存存儲(這使得redis的速度非常快),遠程操作(使得redis可以與多個客戶端和服務器進行連接)、持久化(使得服務器可以在重啟的時候仍然保持重啟之前的數據)和可擴展(通過主從復制和分片)。
Redis結構類型:STRING、LIST、SET、HASH、ZSET(有序集合)
- STRING:可以存貯字符串、整數、浮點數
- LIST:一個鏈表,每個節點都包含一個字符串
- SET:包含字符串的無序收集容器,每個字符串都是獨一無二的
- HASH:包含鍵值的無序散列表,即可以存儲多個鍵值對(key唯一)之間的映射【可以理解為關聯數組】
- ZSET(有序集合):字符串成員(member)與浮點數分值(score)一一映射。元素排列順序由分值大小決定,每個member是唯一的。
2、key相關操作
適用redis全部類型數據
DELkey[key…] //刪除某個或者多個key-value KEYS pattern //返回匹配的key RANDOMKEY //從當前數據庫返回一個key MOVE key num //將當前數據庫中的key移到數據庫num中 TYPE key //返回key數據類型 EXISTS key //檢查key是否存在 RENAME key newkey //改名,newkey存在時則將會覆蓋 RENAMENX key newkey //當且僅當newkey不存在的時候才執行 EXPIRE key second //設置key的過期時間、秒 EXPIREAT key timestamp //設置key的過期時間、時間戳 PEXPIRE key milliseconds //設定多少毫秒內過期 PEXPIREAT key timestamp-milliseconds //設置為時間戳,毫秒級 TTL key //查看給定鍵距離過期時間還有多少秒 PTTL key //查看給定鍵距離過期時間還有多少毫秒 PERSIST key //移除過期時間 OBJECT refcount|encoding|idletime key //返回key,引用次數|內部存儲編碼|空轉時間 #可編為多種方式編碼: #1、字符串可存為raw(一般字符串)、int(小數字) #2、列表可存為ziplist、linkedlist #3、集合可存為inset(數字小集合)、hashtable #4、散列可存為zipmap(小散列)、hashtable #5、有序集合可存為ziplist(小有序集合)、skiplist(任何大小) SORT source-key [BY pattern] [LIMIT offset count] [GET pattern…] [ASC|DESC] [ALPHA] [STORE dest-key] //用於排序,這個排序功能很強大 #參數: #1、source-key:排序的key #2、BY pattern:表示可以通過外部權重進行排序(即外部key,需要與排序key有關聯)。例如:鏈表key為list-userID(1,2,3,4…),則外部key名為,goods_1、goods_2…,則BY pattern為(BY goods_*) #3、LIMIT offset count:表示排序后返回的數據行 #4、GET pattern…:獲取外部數據(參數與BY pattern一樣) #5、ASC|DESC:升序|降序 #6、ALPHA:采用字符排序,默認是數字排序 #7、STORE dest-key:表示將結果存入dest-key中
3、數據庫相關命令
1、SELECT db_index 選擇數據庫,一共有16個數據庫,默認在數據庫0
2、DBSIZE 返回當前數據庫key數量
3、FLUSHDB 刪除當前數據庫所有key
4、FLUSHALL 刪除所有數據庫所有key
4、Connection連接
1、設置密碼
可以通過redis配置文件進行設置密碼requirepass password配置,配置后需要使用auth pass 進行解鎖才能使用其他命令
2、QUITE 關閉與服務器連接退出客戶端
3、PING 用於測試與服務器端連接是否生效,返回pong
4、ECHO message 打印消息,測試用
5、STRING字符串
SET key value/GET key //設置key-value對/獲取值 MSET key1 value1 key2 value2…. MGET SETNX key value //當且僅當key不存在時才設置 SETEX key second value //設置k-v對時並且設置過期時間 GETSET key value //獲取舊值設置新值 STRLEN key //字符串長度 APPEMD key value //追加值 GETRANGE key-name start end //返回次字符串的start到end之間的字符 SETRANGE key-name offset value //將value代替從offset開始的字符串 INCR、DECR、INCRBY、DECRBY、INCRBYFLOAT //增加值 GETBIT key-name offset //將字符串看做是二進制位串,並返回位串中的偏移量offset的二進制位的值 SETBIT key-name offset value //將字符串看做是二進制位串,並將位串中偏移量offset的二進制值設置為value BITCOUNT key-name [start end] //統計二進制位串里面值為1的數量 BITOP AND|OR|XOR|NOT dest-key key1 key2… 對多個key執行並或異或非,並將結果存入到dest-key
6、LIST鏈表
列表允許用戶從序列兩端推入或者彈出元素
LPUSH/RPUSH、LPOP/RPOP lset key index value //將key中下標為index更新值為value。Index超過則報錯 linsert key befort|after val value //在key中位於val值前或者后,插入value值。Key或者val不存在,則返回錯誤 LREM key count value count=0 // 刪除全部一樣的;count>0從左邊檢索刪除count個;count<0從右邊檢索,刪除count個 LTRIM key-name start end //保持start到end所有元素,其他刪除 LRANGE key start end //返回偏移量中的值 LINDEX key offset //返回偏移量為offset中的值 LLEN key-name //返回key-name鏈的長度 BLPOP/BRPOP key-name[key-name2…] timeout //多少秒內阻塞並等待可彈出元素出現 RPOPLPUSH key-name1 key-name2 //從key-name1中彈出最右邊的元素,推入key-name2最左邊,並返回value元素 BRPOPLPUSH key-name value timeout //阻塞式
7、SET集合
SADD key member[member2…] //添加一個或者多個member SREM key member[member2…] //移除一個或者多個member SMEMBERS key //返回key中所有的member SISMEMBER key member //判斷member是否在key中 SCARD key //返回集合里包含的元素數量 SPOP key //隨機移除集合中的一個元素,並返回 SRANDMEMBER key //隨機返回一個member,不刪除 SRANDMEMBER key-name n //隨機返回集合里的n個元素。n負數可重復,正數不出現重復 SMOVE key-name1 key-name2 value //將value元素從key-name1中移到key-name2中 SDIFF key-name1 [key-name2…] //差集 SDIFFSTORE dest-key key-name1[key-name2…] //差集存入dest-key中 SINTER key-name1[key-name2…] 返回交集 SINTERSTORE dest-key key-name1[key-name2…] 交集存入dest-key中 SUNION key-name1[key-name2…] //返回並集 SUNIONSTORE dest-key key-name1[key-name2…] //並集存入dest-key中
8、HASH散列、哈希
HSET key field value //設置散列值 hsetnx key field value //當且僅當field不存在時設置 HMSET key field value field2 value2…. //設置多個 HGET key field //獲取值 HMGET key field field2… //獲取多個 HGETALL key //由於redis是單線程操作,假若hgetall返回的數據量大耗時大,將會導致其他客戶端的請求得不到響應 HDEL key field field2… // 刪除一個或者多個值 HLEN key //返回散列包含鍵值對的數量 hexists key-name filed //檢查field是否存key-name中 hkeys key/hvals key //返回key中的field、返回key中的value HINCRBY key-name field num //給key-name中field的值(必須是數字)增加num HINCRBYFLOAT key-name key incre
9、SORT SET有序集合
ZADD key score member //給有序集合key添加member ZREM key member[member2…] //移出一個或者多個成員 ZCRAD key 返回有序集合里的成員數量 ZCOUNT key-name min max //返回分值介於min和max之間的成員數量 ZSCORE key member //返回成員的分值 ZINCRBY key increment member //將member成員分值加上increment ZRANGE key start stop [withscores] //成員按分值從小到大排列,返回有序集合給定排名范圍 ZREVRANGE key start stop [withscores] //成員按分值從大到小排列,返回有序集合給定排名范圍 ZRANK key member //分值從小到大排序,返回member有序集合的排名 ZREVRANK key member //分值從大到小排序,返回member有序集合的排名 ZRANGEBYSCORE key-name min max [withscores][limt offset count] //返回有序集合中介於min和max之間的所有成員、從小到大 ZREVRANGEBYSCORE key-name max min [withscores][limt offset count] //返回有序集合中介於max和min之間的所有成員、從大到小 ZREMRANGEBYRANK key-name start stop //移出所有有序集合排名介於start和stop之間的元素 ZREMRANGEBYSCORE key-name min max //移出所有有序集合score介於min和max之間的元素 ZINTERSTORE dest-key key-count key-name1[key-name2…] [weights weight1 weight2…] [aggregate sum|min|max] //先對應分值乘以weights,再取交集,分值對應后面的aggregate,默認sum。結果存入dest-key中 ZUNIONSTORE dest-key key-count key-name1[key-name2…] [weights weight1 weight2…] [aggregate sum|min|max]
10、發布與訂閱
頻道僅僅只是一個key而已
SUBSCRIBE channel [channel..] // 訂閱頻道 UNSUBSCRIBE [channel1,channel2…] // 退定頻道 PUBLISH channel message // 給頻道發布消息 PSUBSCRIBE pattern [pattern…] // 訂閱匹配給定模式的所有頻道 PUNSUBSCRIBE [pattern…] //退訂匹配給定模式的所有頻道
11、Redis的基本事務
Redis的基本事務需要用到MULTI命令和EXEC命令,這種事務可以讓一個客戶端在不被其他客戶端打斷的情況下執行多個命令。這種事務與關系型數據庫的能夠執行回滾的事務不同,redis中,只要被MULTI和EXEC包圍住的命令將一個接一個的執行,直達執行完畢后才會處理其他客戶端的命令。
WATCH key key2[key3…] // 監視key,假若在事務執行之前key數據有更改,則事務將會失敗 UNWATCH // 取消watch監視的所有key。假若已經執行了exec或者discard那么就不用再執行unwatch了,因為exec是執行事務,此時watch效果已經生效;discard命令則是取消事務 MULTI // 標記一個事務的開始 EXEC // 執行事務塊中的命令,並返回事務塊中每條命令的結果。假若有被監視的key有修改則,則事務將被打斷 DISCARD // 取消事務
12、快照持久化
BGSAVE // 快照持久化
Redis、系統、硬件三個中任意一個崩潰將會造成最近一次已成功創建快照的數據丟失
1、BGSAVE將會調用一個fork創建一個子進程處理持久化數據,父進程繼續處理請求命令
2、SAVE接到save命令后,將快照創建完畢后,才處理其他命令
3、配置文件save 60 1000,自動調用BGSAVE
4、接收到SHUTDOWN命令將會自動調用SAVE,成功創建快照后才關閉redis
5、連接別的redis服務將可能會自動執行BGSAVE
6、LASTSAVE返回最后一次執行快照持久化的時間戳bgsave、save
13、AOF持久化
AOF持久化的實質就是將被執行的命令寫到AOF文件的末尾,以此來記錄數據發生的變化。因此只要執行一次AOF文件中的命令就可以恢復AOF文件所記錄的數據集了。
將文件寫入硬盤的步驟:
1、調用對文件寫入時
2、首先將需要寫入的內容存儲到緩沖區
3、操作系統在某個時候將緩沖區里的內容寫入硬盤。(可通過調用file.flush()方法請求系統盡快將其寫入硬盤中,具體何時寫入仍然是操作系統決定)
appendfsync配置
always 將每個redis寫命令都要同步寫到硬盤中,這將會降低redis的速度
everysec 每秒執行一次同步,顯式地將多個寫命令同步到硬盤中
no 讓系統來決定何時進行同步
缺點:(AOF文件的大小)
1、隨着redis的不斷運行,AOF的文件體積將會不斷變大,甚至將硬盤所有空間都用完。
2、再者就是,當redis重啟的時候需要執行AOF里面的記錄命令來恢復之前的數據,假若AOF文件非常大的話,那么還原操作將會耗費很多時間
解決:
1、手動操作,向redis發送BGREWRITEAOF重寫AOF文件,移出冗余的命令
2、配置自動,auto-aof-rewrite-percentage 100、auto-aof-rewrite-min-size 64M即當AOF文件體積大於64M,並且AOF文件體積比上一次重寫之后的體積大了至少一倍(100%)的時候,則redis將自動執行BGREWRITEAOF
14、Redis主從復制詳細分析
Redis復制即使相當於mysql主從復制一樣
1、前提
配置文件設置好dir選項以及dbfilename選項,並且指示的路徑和文件必須是redis進程可以寫。
2、兩種方法設置redis復制
第一種:在已經運行的redis中,執行SLAVEOF host port
第二種:在配置文件中添加SLAVEOF host port(啟動redis將會自動開啟)
3、相關命令
SLAVEOF no one 終止復制操作
SLAVEOF host port 開始新的復制操作(默認端口6379)
4、redis復制的啟動過程
1、主:等待命令進入;
從:連接主,發送SYNC
2、主:開始執行BGSAVE,並用緩沖區記錄BGSAVE后的寫命令;
從:根據配置選項來決定是否使用當前數據來處理當前客戶端命令(還有數據的情況,即之前有連接);否則返回錯誤
3、主:BGSAVE執行完畢,向從發送快照文件,並且繼續用緩沖區記錄客戶端的寫命令
從:丟棄所有舊數據,載入主發過來的快照文件
4、主:快照文件發送完畢,開始發送緩沖區里的寫命令(保證數據同步)
從:對主發來的快照文件處理完畢,此時正常接收命令請求進行處理
5、主:緩沖區里的命令發送完畢;此時開始每執行一條命令就向從發送相同的命令
從:執行主發過來的所有緩沖區里的命令;此時開始接收並執行主傳過來的命令
注意:
1、從服務器在進行同步時,會清空自己的所有數據
2、redis不支持主主復制
5、多個從服務器進行連接主服務器
出現的兩種情況:
1、新的從服務器在步驟三尚未執行,所有從服務器都接收相同的快照文件和緩沖區的命令
2、新的從服務器在步驟三正在執行或者已經執行,主與較早的從進行五步驟的復制后,再繼續與新的從進行五步驟的復制
注意:假若有多個從服務器恰巧是第二種情況,那么占用的寬帶可能使其他命令請求難以傳遞給主服務器。
6、INFO返回關於 Redis 服務器的各種信息和統計值。
15、處理系統故障
1、驗證快照文件和AOF文件
redis-check-dump <dump.rdb>
redis-check-aof –fix <file.aof>
原理:檢查出錯位置,aof可以將出錯之后的刪除;快照只能檢查出錯位置,不能修復。
2、更換故障主機
A主B從;A宕機
1、換C做主,B執行SAVE,發給C,開啟C,設置B成為C的從。
2、換B做主,C做從。
15、其他
client list // 列出所有連接的客戶端信息 client kill 127.0.0.1:4526 // 關閉某個客戶端
參考書籍:
《Redis實戰》 Josiah.Carlson 著
黃健宏 譯
(以上是自己的一些見解,若有不足或者錯誤的地方請各位指出)
作者:那一葉隨風
聲明:本博客文章為原創,只代表本人在工作學習中某一時間內總結的觀點或結論。轉載時請在文章頁面明顯位置給出原文鏈接