1. 程式人生 > 實用技巧 >redis五大資料型別——String

redis五大資料型別——String

redis五大資料型別——String

Redis 是一個開源(BSD許可)的,記憶體中的資料結構儲存系統,它可以用作資料庫快取訊息中介軟體。它支援多種型別的資料結構,如字串(strings)雜湊(hashes)列表(lists)集合(sets)有序集合(sorted sets) 與範圍查詢, bitmapshyperloglogs地理空間(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,否則就什麼都不做。整個比較並替換的操作是一個原子操作。