作者介紹:
本人Java特工舰罚,代號:Cris Li ; 中文名:克瑞斯理
簡書地址: http://www.reibang.com/u/c508b0afaaee
CSDN地址: https://blog.csdn.net/jianli95
個人純潔版博客: https://lijian69.github.io/blog/
一、Redis 基礎(chǔ)知識
1.什么是Redis?
Redis現(xiàn)今已經(jīng)成為程序員開發(fā)的必備技能,要是你聽都沒聽說過,回去養(yǎng)豬吧虎眨。也能月入上萬。言歸正傳镶摘。
Redis是由 C語言 編寫嗽桩、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型凄敢、Key-Value數(shù)據(jù)庫碌冶,并提供多種語言的API。redis是nosql(也是個巨大的map) 單線程非關(guān)系型數(shù)據(jù)庫涝缝,可處理1秒10w的并發(fā)(因為數(shù)據(jù)都在內(nèi)存中)扑庞;
2.Redis數(shù)據(jù)類型有哪些?
這個是面試的時候面試官經(jīng)常問到的話題之一拒逮,一不小心你就會掉進(jìn)坑里罐氨。總結(jié)如下
序號 | 類型 | 含義 |
---|---|---|
1 | String | redis的string可以包含任何數(shù)據(jù)滩援。一個鍵最大能存儲512MB栅隐。 |
2 | Hash | 與java中的map類似 |
3 | List | 可做List,隊列或者棧 |
4 | Set | 無序集合 |
5 | ZSet | 可以通過分?jǐn)?shù)進(jìn)行有序排序 |
注意: 隨著你的開發(fā)經(jīng)驗的增加玩徊,僅僅回答以上常用的五種是不太有突破的租悄,還有兩種數(shù)據(jù)類型,如果在面試回答的時候佣赖,面試的時候一定會脫穎而出恰矩,讓面試官對你有印象的记盒。
補充一:Redis 2.8.6之后用于計數(shù)的 HyperLogLong
補充二:用于存儲地理位置信息的 Gro
3.Redis常用的命令憎蛤?
清空Redis所有key
flush db # 清除當(dāng)前數(shù)據(jù)庫的所有keys
flush all # 清除所有數(shù)據(jù)庫的所有keys
查詢匹配key
keys * # 查看所有keys
keys prefix_* # 查看前綴為"prefix_"的所有keys
key基本操作
exists key # 確認(rèn)一個key是否存在
set key value # 設(shè)置key和value
get key # 獲取key的value
del key # 刪除一個key
type key # 返回值的類型
keys pattern # 返回滿足給定pattern的所有key
random key # 隨機返回key空間的一個
key rename oldname newname # 重命名key
db size # 返回當(dāng)前數(shù)據(jù)庫中key的數(shù)目
select index # 選擇第0~15中的庫
move key dbindex # 移動當(dāng)前數(shù)據(jù)庫中的key到dbindex數(shù)據(jù)庫
設(shè)置key的生存時間
expire key seconds #設(shè)置key的有效時間 單位為秒
ttl key #獲取key的剩余有效時間,持久key返回-1,key不存在返回-2俩檬,具體時間返回秒數(shù)
persist key #設(shè)置有時效性的key為持久key
String類型
INCR key # 遞增數(shù)字萎胰,僅僅對數(shù)字類型的鍵有用,相當(dāng)于Java的i++運算
INCRBY key increment # key自增increment,increment可以為負(fù)數(shù)棚辽,表示減少技竟。
DECR key # 遞減數(shù)字,僅僅對數(shù)字類型的鍵有用屈藐,相當(dāng)于Java的i–-
DECRBY key decrement # key自減decrement榔组,decrement可以為正數(shù),表示增加联逻。
INCRBYFLOAT key increment # 增加指定浮點數(shù)搓扯,僅僅對數(shù)字類型的鍵有用
APPEND key value # 向尾部追加值,相當(dāng)于append方法
STRLEN key # 獲取字符串長度
MSET key1 value1 [key2 value2 ...] # 同時設(shè)置多個key的值
MGET key1 [key2 ...] # 同時獲取多個key的值
List類型
rpush key value # 在名稱為key的list尾添加一個值為value的元素
lpush key value # 在名稱為key的list頭添加一個值為value的 元素
llen key # 返回名稱為key的list的長度
lrange key start end # 返回名稱為key的list中start至end之間的元素
ltrim key start end # 截取名稱為key的list
lindex key index # 返回名稱為key的list中index位置的元素
lset key index value # 給名稱為key的list中index位置的元素賦值
lrem key count value # 刪除count個key的list中值為value的元素
lpop key # 返回并刪除名稱為key的list中的首元素
rpop key # 返回并刪除名稱為key的list中的尾元素
rpoplpush srckey dstkey # 返回并刪除名稱為srckey的list的尾元素,并將該元素添加到名稱為dstkey的list的頭部
Set類型
sadd key member # 向名稱為key的set中添加元素member
srem key member # 刪除名稱為key的set中的元素member
spop key # 隨機返回并刪除名稱為key的set中一個元素
smove srckey dstkey member # 移到集合元素
scard key # 返回名稱為key的set的基數(shù)
sismember key member # member是否是名稱為key的set的元素
sinter key1 key2 …key # 求交集
sinterstore dstkey keys # 求交集并將交集保存到dstkey的集合
sunion key1 keys # 求并集
sunionstore dstkey keys # 求并集并將并集保存到dstkey的集合
sdiff key1 keys # 求差集
sdiffstore dstkey keys # 求差集并將差集保存到dstkey的集合
smembers key # 返回名稱為key的set的所有元素
srandmember key # 隨機返回名稱為key的set的一個元素
Zset類型
ZADD key score1 value1 [score2 value2 score3 value3 ...] # 添加元素
ZSCORE key value # 獲取元素的分?jǐn)?shù)
ZRANGE key start stop [WITHSCORE] # 獲取排名在某個范圍的元素包归,按照元素從小到大的順序排序锨推,從0開始編號,包含start和stop對應(yīng)的元素公壤,WITHSCORE選項表示是否返回元素分?jǐn)?shù)
ZREVRANGE key start stop [WITHSCORE] # 獲取排名在某個范圍的元素换可,和上一個命令用法一樣,只是這個倒序排序的厦幅。
ZRANGEBYSCORE key min max # 獲取指定分?jǐn)?shù)范圍內(nèi)的元素沾鳄,包含min和max,(min表示不包含min确憨,(max表示不包含max洞渔,+inf表示無窮大
ZINCRBY key increment value # 增加某個元素的分?jǐn)?shù)
ZCARD key # 獲取集合中元素的個數(shù)
ZCOUNT key min max # 獲取指定分?jǐn)?shù)范圍內(nèi)的元素個數(shù),min和max的用法和5中的一樣
ZREM key value1 [value2 ...] # 刪除一個或多個元素
ZREMRANGEBYRANK key start stop # 按照排名范圍刪除元素
ZREMRANGEBYSCORE key min max # 按照分?jǐn)?shù)范圍刪除元素缚态,min和max的用法和4中的一樣
ZRANK key value # 獲取正序排序的元素的排名
ZREVRANK key value # 獲取逆序排序的元素的排名
Hash類型
HSET key field value # 賦值
HMSET key field1 value1 [field2 values] # 一次賦值多個字段
HSET key field # 取值
HMSET key field1 [field2] # 一次取多個字段的值
HGETALL key # 一次取所有字段的值
HEXISTS key field # 判斷字段是否存在
HSETNX key field value # 當(dāng)字段不存在時賦值
HDEL key field # 刪除字段
HKEYS key # 獲取所有字段名
HVALS key # 獲取所有字段值
HLEN key # 獲取字段數(shù)量
3.Redis持久化
為什么需要Redis持久化技術(shù)磁椒?Redis數(shù)據(jù)放在主機的內(nèi)存中,若無持久化玫芦,在主機意外關(guān)機浆熔,宕機等非正常操作的時候,數(shù)據(jù)將全部丟失桥帆,開啟持久化,使 Redis數(shù)據(jù) <=======> 磁盤數(shù)據(jù) 可以進(jìn)行雙向操作医增。
Redis的三種持久化方式
序號 | 方式 | 優(yōu)缺點 |
---|---|---|
1 | RDB | 它是Redis早期版本默認(rèn)的持久化方式,通過在指定時間間隔內(nèi)生成數(shù)據(jù)集的時間點快照進(jìn)行數(shù)據(jù)的持久化老虫。 |
2 | AOF | 記錄服務(wù)器所有的寫操作叶骨,持久化時,重新執(zhí)行寫命令 |
3 | RDB+AOF混合 | Redis-4.0默認(rèn)的持久化方式 |
RDB介紹
通過以下命令進(jìn)行持久化
Save # 堵塞式持久化 不推薦使用
BGSave # 非堵塞式持久化方式祈匙,推薦使用
RDB方式的優(yōu)點: 性能好忽刽、恢復(fù)數(shù)據(jù)的速度快天揖、全量進(jìn)行、隨時還原不同版本
AOF方式的優(yōu)點: 生成的備份文件可讀性高跪帝、增量進(jìn)行今膊、但是文件的體積大,恢復(fù)的時間長