redis五大資料型別——String
redis五大資料型別——String
Redis 是一個開源(BSD許可)的,記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。它支援多種型別的資料結構,如字串(strings), 雜湊(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內建了 複製(replication),LUA指令碼(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的磁碟持久化(persistence), 並通過Redis哨兵(Sentinel)和自動分割槽(Cluster)提供高可用性(high availability)。
String
90%的Java程式設計師使用redis只會使用一個string型別。
命令操作
127.0.0.1:6379> set key1 v1 OK 127.0.0.1:6379> exists key1 (integer) 1 127.0.0.1:6379> append key1 "hello" (integer) 7 127.0.0.1:6379> get key1 "v1hello" 127.0.0.1:6379> STRLEN key1 (integer) 7 127.0.0.1:6379> APPEND key2 v2 # 如果key不存在則建立 (integer) 2 127.0.0.1:6379> keys * 1) "key2" 2) "key1"
redis自增或自減的操作
127.0.0.1:6379> SET views 0 OK 127.0.0.1:6379> INCR views (integer) 1 127.0.0.1:6379> GET views "1" 127.0.0.1:6379> INCR views (integer) 2 127.0.0.1:6379> DECR views (integer) 1 127.0.0.1:6379> GET views "1" 127.0.0.1:6379> INCRBY views 10 # 設定自增步長 (integer) 11 127.0.0.1:6379> DECRBY views 5 # 設定自減步長 (integer) 6 127.0.0.1:6379> get key1 "v1hello" 127.0.0.1:6379> GETRANGE key1 1 2 # 從指定位置讀取字串 "1h" 127.0.0.1:6379> GETRANGE key1 0 -1 # 獲取全部字串 "v1hello" 127.0.0.1:6379> set key2 abcdefg OK 127.0.0.1:6379> SETRANGE key2 1 x (integer) 7 127.0.0.1:6379> get key2 "axcdefg"
redis過期時間設定
setex(set with expire) # 設定過期時間
setnx(set if not exist) # 不存在再設定,在分散式鎖中非常常用
127.0.0.1:6379> SETEX key3 30 "hello"
OK
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx key4 "redis" # 建立成功返回1
(integer) 1
127.0.0.1:6379> setnx key4 "MongoDB" # 建立失敗返回0
(integer) 0
mset與mestnx
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> MSETNX k1 v1 k4 v4 # 是個原子性操作
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
(integer) 0
操作物件
127.0.0.1:6379> mset user1:name zhangsan user1:age 18
OK
127.0.0.1:6379> mget user1:name user1:age
1) "zhangsan"
2) "18"
這裡的key是一個巧妙的設計,user:{id}:{field},如此設計在redis中是完全沒問題的。比如在微信瀏覽量的時候,我們就可以對這個key進行復用
127.0.0.1:6379> SET article:art_id:views 0 # 初始瀏覽量為0
OK
127.0.0.1:6379> INCR views
(integer) 1
127.0.0.1:6379> GET views
"1"
getset操作
# 先get然後再set
127.0.0.1:6379> GETSET db redis # 如果不存在則返回nil
(nil)
127.0.0.1:6379> GET db
"redis"
127.0.0.1:6379> GETSET db mysql
"redis"
127.0.0.1:6379> get db # 如果存在值,則返回當前值,然後設定新的值
"mysql"
記錄使用者呼叫介面次數的功能,如果實時寫入資料庫,效能很慢。加了一層 redis 快取,把每分鐘內的呼叫次數先快取至 redis counter(每呼叫一次 INCR 一下)。然後有一個類似 cron 程序,會每隔一分鐘讀取這個計數值,一次性將次數記錄到資料庫中。
之前的 cron 程序是這樣的:GET 讀取 counter 值 -> SET 將 counter 置 0 -> 更新資料庫。在流量小的情況下還很難發現問題,但是一旦流量一大,在讀取 counter 和 counter 置零的之間的計數就被丟失掉了。現在只需要呼叫一次 GETSET 操作,確保不會有遺漏。
資料結構是相通的。
String型別的使用場景:value除了是我們的字串,還可以是我們的數字
- 計數器
- 統計多單位的數量
- 粉絲數
- 物件快取儲存
CAS
CAS是什麼?
CAS是英文單詞CompareAndSwap的縮寫,中文意思是:比較並替換。CAS需要有3個運算元:記憶體地址V,舊的預期值A,即將要更新的目標值B。
CAS指令執行時,當且僅當記憶體地址V的值與預期值A相等時,將記憶體地址V的值修改為B,否則就什麼都不做。整個比較並替換的操作是一個原子操作。