Redis學習筆記(REmote DIctionary Server遠端字典伺服器)
在分散式資料庫中CAP原理CAP+BASE:C:Consistency:強一致性,A:Availability:可用性,P:Partition tolerance:分割槽容錯性。
CAP理論的核心是:**一個分散式系統不可能同時很好的滿足一致性,可用性和分割槽容錯性這三個需求,
最多隻能同時較好的滿足兩個。**
因此,根據 CAP 原理將 NoSQL 資料庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:
CA - 單點叢集,滿足一致性,可用性的系統,通常在可擴充套件性上不太強大。(msyql/oracle);
CP - 滿足一致性,分割槽容忍必的系統,通常效能不是特別高。(redis/mongdb);
AP - 滿足可用性,分割槽容忍性的系統,通常可能對一致性要求低一些。(大多數網站架構選擇淘寶,京東);
BASE就是為了解決關係資料庫強一致性引起的問題而引起的可用性降低而提出的解決方案。
BASE其實是下面三個術語的縮寫:
基本可用(Basically Available)
軟狀態(Soft state)
最終一致(Eventually consistent)
它的思想是通過讓系統放鬆對某一時刻資料一致性的要求來換取系統整體伸縮性和效能上改觀。為什麼這麼說呢,緣由就在於大型系統往往由於地域分佈和極高效能的要求,不可能採用分散式事務來完成這些指標,要想獲得這些指標,我們必須採用另外一種方式來完成,這裡BASE就是解決這個問題的辦法。
再redis.conf
Set the number of databases. The default database is DB 0, you can select a different one on a per-connection basis using SELECT where dbid is a number between 0 and ‘databases’-1
databases 16
可知,redis有16個簇。索引(index)從0開始,到15.
redis命令:
KEYS * 檢視當前庫中所有的key,SELECT index查詢到簇
//查詢redis下標為0也就是第一個庫中所有的key;
127.0.0.1:6379> keys *
//select 1查詢redis下標為1也就是第二個庫;
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>
FLUSHALL 清空16個庫中所有的key,FLUSHDB只清空當前庫中的key
清除庫中的key:FLUSHALL會清除16個庫中的所有key
127.0.0.1:6379> FLUSHALL
FLUSHDB會清除當前所在的庫。
127.0.0.1:6379> FLUSHDB
EXISTS key 檢視key是否存在
通過KEYS *可知目前庫中存有k1和k2; exists k1是用來判斷key k1是否存在,存在為1,不存在為0。
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> KEYS *
1) "k1"
2) "k2"
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> EXISTS k3
(integer) 0
MOVE key index剪下key到另一個庫中
MOVE k2 2 表示把k2剪下到2號庫中。
127.0.0.1:6379> MOVE k2 2
(integer) 1
127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> KEYS *
1) "k2"
127.0.0.1:6379[2]> SELECT 0
OK
127.0.0.1:6379> KEYS *
1) "k1"
ttl key 檢查key還有多少秒過期, -1表示永不過期,-2表示已過期
EXPIRE key second 設定key還有多少秒過期,過期後該key會被清空
SETEX key seconds value
將值 value 關聯到 key ,並將 key 的生存時間設為 seconds (以秒為單位)。如果 key 已經存在, SETEX 命令將覆寫舊值。
**這個命令類似於
**SET key value
EXPIRE key seconds # 設定生存時間**
兩者不同之處是, SETEX 是一個原子性(atomic)操作,關聯值和設定生存時間兩個動作會在同一時間內完成,該命令在 Redis 用作快取時,非常實用。
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> EXPIRE k1 10
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 4
127.0.0.1:6379> ttl k1
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 0
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> get k1
(nil)
#設定k5 值為"10sLifeCycle"生命週期是10s。
127.0.0.1:6379> SETEX k5 10 "10sLifeCycle"
OK
127.0.0.1:6379> get k5
"10sLifeCycle"
127.0.0.1:6379> ttl 廫5
(integer) -2
127.0.0.1:6379> ttl k5
(integer) -2
127.0.0.1:6379> SETEX k5 10 "10sLifeCycle"
OK
127.0.0.1:6379> ttl k5
(integer) 8
127.0.0.1:6379> get k5
"10sLifeCycle"
127.0.0.1:6379> ttl k5
(integer) 1
127.0.0.1:6379> get k5
(nil)
127.0.0.1:6379> ttl k5
(integer) -2
127.0.0.1:6379>
SETNX key value
將 key 的值設為 value ,當且僅當 key 不存在。若給定的 key 已經存在,則 SETNX 不做任何動作。SETNX 是『SET if Not eXists』(如果不存在,則 SET)的簡寫。
127.0.0.1:6379> get k6
(nil)
127.0.0.1:6379> SETNX k6 notexist
(integer) 1
127.0.0.1:6379> get k6
"notexist"
127.0.0.1:6379> SETNX k6 alreadyexist
(integer) 0
127.0.0.1:6379> get k6
"notexist"
MSET key value [key value …]
同時設定一個或多個 key-value 對。
如果某個給定 key 已經存在,那麼 MSET 會用新值覆蓋原來的舊值,如果這不是你所希望的效果,請考慮使用 MSETNX 命令:它只會在所有給定 key 都不存在的情況下進行設定操作。
MSET 是一個原子性(atomic)操作,所有給定 key 都會在同一時間內被設定,某些給定 key 被更新而另一些給定 key 沒有改變的情況,不可能發生。
MGET key [key …]
返回所有(一個或多個)給定 key 的值。
如果給定的 key 裡面,有某個 key 不存在,那麼這個 key 返回特殊值 nil 。因此,該命令永不失敗。
MSETNX key value [key value …]
同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在。即使只有一個給定 key 已存在, MSETNX 也會拒絕執行所有給定 key 的設定操作。
MSETNX 是原子性的,因此它可以用作設定多個不同 key 表示不同欄位(field)的唯一性邏輯物件(unique logic object),所有欄位要麼全被設定,要麼全不被設定。
127.0.0.1:6379> GET k1
"helloredis"
127.0.0.1:6379> MSET k1 v1 k2 v2 kk vv
OK
127.0.0.1:6379> MGET k1 k2 kk
1) "v1"
2) "v2"
3) "vv"
127.0.0.1:6379> MGET k1 k2 kk no
1) "v1"
2) "v2"
3) "vv"
4) (nil)
# 對不存在的 key 進行 MSETNX
redis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"
(integer) 1
redis> MGET rmdbs nosql key-value-store
1) "MySQL"
2) "MongoDB"
3) "redis"
# MSET 的給定 key 當中有已存在的 key
redis> MSETNX rmdbs "Sqlite" language "python" # rmdbs 鍵已經存在,操作失敗
(integer) 0
redis> EXISTS language # 因為 MSET 是原子性操作,language 沒有被設定
(integer) 0
redis> GET rmdbs # rmdbs 也沒有被修改
"MySQL"