1. 程式人生 > >Redis安裝以及簡單使用

Redis安裝以及簡單使用

key

EXISTS key

檢查給定key是否存在,存在返回1,否則返回0

KEYS pattern

pattern是正則匹配模式。
查詢所有符合給定模式pattern的key。
KEYS *匹配資料庫中所有key 。
KEYS h?llo 匹配hello , hallo和 hxllo 等。
KEYS h*llo 匹配 hllo和heeeeello等。
KEYS h[ae]llo匹配 hello和hallo,但不匹配hillo 。

MOVE key db

將當前資料庫的key移動到給定的資料庫db當中。如果當前資料庫(源資料庫)和給定資料庫(目標資料庫)有相同名字的給定 key,或者key不存在於當前資料庫,那麼MOVE沒有任何效果。因此,可以利用這一特性,將MOVE當作鎖(locking)原語(primitive)。移動成功返回1,失敗則返回0。

# key 存在於當前資料庫
redis> SELECT 0      # redis預設使用資料庫 0,為了清晰起見,這裡再顯式指定一次。
OK

redis> SET song "secret base - Zone"
OK

redis> MOVE song 1                          # 將 song 移動到資料庫 1
(integer) 1

redis> EXISTS song                          # song 已經被移走
(integer) 0

redis> SELECT 1                             # 使用資料庫 1
OK redis:1> EXISTS song # 證實 song 被移到了資料庫 1 (注意命令提示符變成了"redis:1",表明正在使用資料庫 1) (integer) 1 # 當 key 不存在的時候 redis:1> EXISTS fake_key (integer) 0 redis:1> MOVE fake_key 0 # 試圖從資料庫 1 移動一個不存在的 key 到資料庫 0,失敗 (integer) 0 redis:1> select 0 # 使用資料庫0
OK redis> EXISTS fake_key # 證實 fake_key 不存在 (integer) 0 # 當源資料庫和目標資料庫有相同的 key 時 redis> SELECT 0 # 使用資料庫0 OK redis> SET favorite_fruit "banana" OK redis> SELECT 1 # 使用資料庫1 OK redis:1> SET favorite_fruit "apple" OK redis:1> SELECT 0 # 使用資料庫0,並試圖將 favorite_fruit 移動到資料庫 1 OK redis> MOVE favorite_fruit 1 # 因為兩個資料庫有相同的 key,MOVE 失敗 (integer) 0 redis> GET favorite_fruit # 資料庫 0 的 favorite_fruit 沒變 "banana" redis> SELECT 1 OK redis:1> GET favorite_fruit # 資料庫 1 的 favorite_fruit 也是 "apple"

EXPIRE key seconds、PERSIST key、TTL key

EXPIRE為給定key設定/更新生存時間,當key過期時(生存時間為0),它會被自動刪除。

redis> SET cache_page "www.google.com"
OK

redis> EXPIRE cache_page 30  # 設定過期時間為 30 秒
(integer) 1

redis> TTL cache_page    # 檢視剩餘生存時間
(integer) 23

redis> EXPIRE cache_page 30000   # 更新過期時間
(integer) 1

redis> TTL cache_page
(integer) 29996

PERSIST移除給定key的生存時間,使得key永久有效。
TTL檢視給定key的生存時間。

DEL key [key …]

刪除給定的一個或多個key。不存在的key會被忽略,返回被刪除key的數量。

#  刪除單個 key
redis> SET name huangz
OK

redis> DEL name
(integer) 1


# 刪除一個不存在的 key
redis> EXISTS phone
(integer) 0

redis> DEL phone # 失敗,沒有 key 被刪除
(integer) 0


# 同時刪除多個 key
redis> SET name "redis"
OK

redis> SET type "key-value store"
OK

redis> SET website "redis.com"
OK

redis> DEL name type website
(integer) 3

TYPE key

返回key所儲存的值的型別。返回值為none (key不存在)、string (字串)、list (列表)、set (集合)、zset (有序集)、hash (雜湊表)。

String字串

String(字串),string是redis最基本的型別,你可以理解成與Memcached一模一樣的型別,一個key對應一個value,string型別是二進位制安全的。意思是redis的string可以包含任何資料。比如jpg圖片或者序列化的物件,string型別是Redis最基本的資料型別,一個redis中字串value最多可以是512M。是一個key單Value。

set、get、del、append、strlen、mset、mget、msetnx

1、SET key value [EX seconds] [PX milliseconds] [NX|XX]

將字串值value關聯到key。如果key已經持有其他值,SET就全部覆寫舊值包括屬性(過期時間等),
EX過期時間為second秒。PX設定鍵的過期時間為millisecond毫秒。
NX :只在鍵不存在時,才對鍵進行設定操作。
XX :只在鍵已經存在時,才對鍵進行設定操作。

2、GET key
返回key所關聯的字串值。如果key不存在那麼返回特殊值nil。假如key儲存的值不是字串型別,返回一個錯誤,因為GET只能用於處理字串值。

3、APPEND key value
如果key已經存在並且是一個字串, APPEND命令將value追加到key原來的值的末尾。如果key不存在,APPEND就簡單地將給定key設為value,就像執行SET key value一樣。
4、strlen
返回key所儲存的字串值的長度。當key儲存的不是字串值時,返回一個錯誤。

5、MSET key value [key value …]
同時設定一個或多個key-value對。
如果某個給定key已經存在,那麼MSET會用新值覆蓋原來的舊值,如果這不是你所希望的效果,請考慮使用MSETNX命令:它只會在所有給定key都不存在的情況下進行設定操作。
MSET是一個原子性(atomic)操作,所有給定key都會在同一時間內被設定,某些給定 key被更新而另一些給定key沒有改變的情況,不可能發生。

redis> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"
OK
redis> MGET date time weather
1) "2012.3.30"
2) "11:00 a.m."
3) "sunny"

# MSET 覆蓋舊值例子
redis> SET google "google.hk"
OK
redis> MSET google "google.com"
OK
redis> GET google
"google.com"

6、MGET key [key …]
返回所有(一個或多個)給定key的值。如果給定的key裡面,有某個key不存在,那麼這個key返回特殊值nil 。因此,該命令永不失敗。

redis> SET redis redis.com
OK

redis> SET mongodb mongodb.org
OK

redis> MGET redis mongodb
1) "redis.com"
2) "mongodb.org"

redis> MGET redis mongodb mysql     #不存在的 mysql 返回 nil
1) "redis.com"
2) "mongodb.org"
3) (nil)

setrange、getrange

1、SETRANGE key offset value
用value引數覆寫(overwrite)給定key所儲存的字串值,從偏移量offset開始。不存在的key當作空白字串處理。該命令會確保字串足夠長以便將value設定在指定的偏移量上,如果給定key原來儲存的字串長度比偏移量小(比如字串只有5個字元長,但你設定的offset是10),那麼原字元和偏移量之間的空白將用零位元組(zerobytes, “\x00” )來填充。
注意你能使用的最大偏移量是 2^29-1(536870911) ,因為Redis字串的大小被限制在512兆(megabytes)以內。如果你需要使用比這更大的空間,你可以使用多個key。

# 對非空字串進行 SETRANGE
redis> SET greeting "hello world"
OK

redis> SETRANGE greeting 6 "Redis"
(integer) 11

redis> GET greeting
"hello Redis"

# 對空字串/不存在的 key 進行 SETRANGE
redis> EXISTS empty_string
(integer) 0

redis> SETRANGE empty_string 5 "Redis!"   # 對不存在的 key 使用 SETRANGE
(integer) 11

redis> GET empty_string                   # 空白處被"\x00"填充
"\x00\x00\x00\x00\x00Redis!"

2、GETRANGE key start end
返回key中字串值的子字串,字串的擷取範圍由start和end兩個偏移量決定(包括start和end在內)。負數偏移量表示從字串最後開始計數, -1表示最後一個字元, -2表示倒數第二個,以此類推。
GETRANGE通過保證子字串的值域(range)不超過實際字串的值域來處理超出範圍的值域請求。

redis> SET greeting "hello, my friend"
OK

redis> GETRANGE greeting 0 4          # 返回索引0-4的字元,包括4"hello"

redis> GETRANGE greeting -1 -5        # 不支援迴繞操作
""

redis> GETRANGE greeting -3 -1        # 負數索引
"end"

redis> GETRANGE greeting 0 -1         # 從第一個到最後一個
"hello, my friend"

redis> GETRANGE greeting 0 1008611    # 值域範圍不超過實際字串,超過部分自動被符略
"hello, my friend"

incr、decr、incr by、decr by

redis的遞增必定是原子了,因為內部操作鍵值的時候,必須會加鎖處理。因此,這種操作比在本地簡單多了,本地還需要同步處理,這裡redis內部已經幫助我們同步了很簡單。
1、可以使用自增記錄文章訪問量統計,很簡單,來了,直接往redis資料庫裡面自增即可,快速又簡單。鍵的命名可以使用物件:物件型別:物件屬性命令。
2、可以為每篇文章自動生成ID。每個物件使用名為count的鍵來儲存文章數目。增加物件則自增1即可。比傳統的關係型資料庫涉及簡單多了。
3、儲存文章資料,將文章序列化成字串,然後儲存到redis之中。

list(列表)

列表內部使用雙向連結串列實現,因此頭部和尾部插入是O(1)。一個列表最多容納2^32-1個元素。列表比較適合用來做記錄日誌,例如新鮮事幾千萬,最新的也就100條資料。直接從頭部返回即可。以下指令全部是對連結串列進行操作的方法。

lpush lpushx rpush rpushx lrange

1、LPUSH key value [value …]
將一個或多個值value插入到列表key的表頭。如果有多個value值,那麼各個value值按從左到右的順序依次插入到表頭:比如說,對空列表mylist執行命令LPUSH mylist a b c ,列表的值將是 c b a ,這等同於原子性地執行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三個命令。
如果 key 不存在,一個空列表會被建立並執行 LPUSH 操作。
當 key 存在但不是列表型別時,返回一個錯誤。
LPUSHX(exist) key value:將值value插入到列表key的表頭,當且僅當key存在並且是一個列表。和LPUSH命令相反,當key不存在時,LPUSHX命令什麼也不做。

# 加入單個元素

redis> LPUSH languages python
(integer) 1

# 加入重複元素
redis> LPUSH languages python
(integer) 2

redis> LRANGE languages 0 -1     # 列表允許重複元素
1) "python"
2) "python"


# 加入多個元素
redis> LPUSH mylist a b c
(integer) 3

redis> LRANGE mylist 0 -1
1) "c"
2) "b"
3) "a"

2、LPUSH key value [value …]
將一個或多個值value插入到列表key的表尾(最右邊)。
如果有多個value值,那麼各個value值按從左到右的順序依次插入到表尾,比如對一個空列表mylist執行RPUSH mylist a b c,得出的結果列表為 a b c ,等同於執行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
如果 key 不存在,一個空列表會被建立並執行 RPUSH 操作。
當 key 存在但不是列表型別時,返回一個錯誤。
和RPUSH命令相反,當key不存在時, RPUSHX命令什麼也不做。

3、LRANGE key start stop
返回列表key中指定區間內的元素,區間以偏移量start和stop指定。
下標(index)引數start和stop都以0為底,也就是說,以0表示列表的第一個元素,以1 表示列表的第二個元素,以此類推。你也可以使用負數下標,以-1表示列表的最後一個元素,-2表示列表的倒數第二個元素,以此類推。

redis> RPUSH fp-language lisp
(integer) 1

redis> LRANGE fp-language 0 0
1) "lisp"

redis> RPUSH fp-language scheme
(integer) 2

redis> LRANGE fp-language 0 1
1) "lisp"
2) "scheme"

lpop、rpop

1、LPOP key
移除並返回列表key的頭元素。
2、RPOP key
移除並返回列表key的尾元素。

直接可以使用這幾個push和pop命令,當做棧和佇列使用。並且這個佇列是天然不需要加鎖的,非常容易使用。根本不同考慮競爭問題。

lindex llen lrem ltrim

1、LLEN key
返回key列表中元素的數目。
llen類似於SQL中的select count(*) from tablename;,但是llen時間複雜度是O(1),redis會直接讀取現成的值。不會和InnoDB一樣遍歷表。

2、LREM key count value
根據引數count的值,移除列表中與引數value相等的元素。
count 的值可以是以下幾種:

  • count > 0 : 從表頭開始向表尾搜尋,移除與 value 相等的元素,數量為 count
  • count < 0 : 從表尾開始向表頭搜尋,移除與 value 相等的元素,數量為 count 的絕對值。
  • count = 0 : 移除表中所有與 value 相等的值。

3、LINDEX key index
返回列表key中,下標為index的元素。
下標(index)引數start和stop都以0為底,也就是說,以0表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。
你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。
如果 key 不是列表型別,返回一個錯誤。

4、LTRIM key start stop
對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。

rpoplpush lset linsert

1、RPOPLPUSH source destination

命令RPOPLPUSH在一個原子時間內,執行以下兩個動作:
將列表source中的最後一個元素(尾元素)彈出,並返回給客戶端。
source彈出的元素插入到列表destination,作為destination列表的的頭元素。

2、LSET key index value
將列表key下標為index的元素的值設定為value。

3、LINSERT key BEFORE|AFTER pivot value

將值value插入到列表key當中,位於值pivot之前或之後。
pivot不存在於列表key時,不執行任何操作。
key不存在時,key被視為空列表,不執行任何操作。
如果key不是列表型別,返回一個錯誤。

實踐

1、儲存文章ID列表,可以通過LRANGE顯示每頁的文章。
2、儲存每篇文章的評論列表,將一條評論元素序列化後通過列表儲存。

Set(集合)

Redis的Set是String型別的無序集合,裡面不允許有重複元素,是鍵值中值為空的hashtable。它是通過HashTable實現的,於是對於集合之間的並集、交集、差集都很快。於是這個使用者就很明顯了。

sadd smembers sismember

1、SADD key member [member ...]
將一個或多個member元素加入到集合key當中,已經存在於集合的member元素將被忽略。假如key不存在,則建立一個只包含member元素作成員的集合。
當key不是集合型別時,返回一個錯誤。

#新增單個元素
redis> SADD bbs "discuz.net"
(integer) 1

#新增重複元素
redis> SADD bbs "discuz.net"
(integer) 0

#新增多個元素
redis> SADD bbs "tianya.cn" "groups.google.com"
(integer) 2

redis> SMEMBERS bbs
1) "discuz.net"
2) "groups.google.com"
3) "tianya.cn"

2、SMEMBERS key
返回集合key中的所有成員,不存在的key被視為空集合。

3、SISMEMBER key member
判斷member元素是否集合key的成員
如果member元素是集合的成員,返回1,如果member元素不是集合的成員,或key不存在,返回 0 。

scard srem

1、SCARD key
返回集合key的基數(集合中元素的數量)。

2、SREM key member [member ...]
移除集合key中的一個或多個member元素,不存在的member元素會被忽略。

#測試資料
redis> SMEMBERS languages
1) "c"
2) "lisp"
3) "python"
4) "ruby"

#移除單個元素
redis> SREM languages ruby
(integer) 1

#移除不存在元素
redis> SREM languages non-exists-language
(integer) 0

# 移除多個元素
redis> SREM languages lisp python c
(integer) 3

redis> SMEMBERS languages
(empty list or set)

srandmember spop smove

1、SRANDMEMBER key [count]
如果命令執行時,只提供了key引數,那麼返回集合中的一個隨機元素。
從Redis 2.6版本開始,SRANDMEMBER命令接受可選的count引數:

  • 如果count為正數,且小於集合基數,那麼命令返回一個包含count個元素的陣列,陣列中的元素各不相同。如果count大於等於集合基數,那麼返回整個集合。
  • 如果count為負數,那麼命令返回一個數組,陣列中的元素可能會重複出現多次,而陣列的長度為count的絕對值。
    該操作和SPOP相似,但SPOP將隨機元素從集合中移除並返回,而SRANDMEMBER則僅僅返回隨機元素,而不對集合進行任何改動。
#新增元素
redis> SADD fruit apple banana cherry
(integer) 3

#只給定 key 引數,返回一個隨機元素
redis> SRANDMEMBER fruit
"cherry"

redis> SRANDMEMBER fruit
"apple"

# 給定 3 為 count 引數,返回 3 個隨機元素
# 每個隨機元素都不相同
redis> SRANDMEMBER fruit 3
1) "apple"
2) "banana"
3) "cherry"

# 給定 -3 為 count 引數,返回 3 個隨機元素
# 元素可能會重複出現多次
redis> SRANDMEMBER fruit -3
1) "banana"
2) "cherry"
3) "apple"

redis> SRANDMEMBER fruit -3
1) "apple"
2) "apple"
3) "cherry"

# 如果 count 是整數,且大於等於集合基數,那麼返回整個集合
redis> SRANDMEMBER fruit 10
1) "apple"
2) "banana"
3) "cherry"

# 如果 count 是負數,且 count 的絕對值大於集合的基數
# 那麼返回的陣列的長度為 count 的絕對值
redis> SRANDMEMBER fruit -10
1) "banana"
2) "apple"
3) "banana"
4) "cherry"
5) "apple"
6) "apple"
7) "cherry"
8) "apple"
9) "apple"
10) "banana"

# SRANDMEMBER 並不會修改集合內容
redis> SMEMBERS fruit
1) "apple"
2) "cherry"
3) "banana"

# 集合為空時返回 nil 或者空陣列
redis> SRANDMEMBER not-exists
(nil)

redis> SRANDMEMBER not-eixsts 10
(empty list or set)

2、SPOP key
移除並返回集合中的一個隨機元素。如果只想獲取一個隨機元素,但不想該元素從集合中被移除的話,可以使用SRANDMEMBER命令。

3、SMOVE source destination member
將member元素從source集合移動到destination集合。
SMOVE是原子性操作。
如果source集合不存在或不包含指定的member元素,則SMOVE命令不執行任何操作,僅返回0。否則, member元素從source集合中被移除,並新增到destination集合中去。
當destination集合已經包含member元素時, SMOVE命令只是簡單地將source集合中的member元素刪除。
當source或destination不是集合型別時,返回一個錯誤。

sdiff sinter sunion

1、SDIFF key [key ...]
返回所有給定集合之間的差集。不存在的key被視為空集。
A並B=屬於A或屬於B。
A交B=屬於A且屬於B。
A差B=屬於A不屬於B。
這裡寫圖片描述

redis> SMEMBERS peter's_movies
1) "bet man"
2) "start war"
3) "2012"

redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"

redis> SDIFF peter's_movies joe's_movies
1) "bet man"
2) "start war"

2、SUNION key [key ...]
返回一個集合的全部成員,該集合是所有給定集合的並集。

3、SINTER key [key ...]
返回一個集合的全部成員,該集合是所有給定集合的交集。

實踐

1、文章的標籤,都是不同的並且對排序並沒有要求,因此可以使用集合型別儲存文章標籤。
2、通過標籤搜尋文章。redis使用起來就非常簡單,如果是傳統關係資料庫,則需要聯合幾張表進行處理。每篇文章對應一個標籤集合,並且每個標籤中記錄一個文章ID集合。這樣,直接求幾個文章ID的交集即可。這樣可以直接在redis資料庫中將所以的操作全部用來處理。
這裡寫圖片描述

zset(有序集合)

在集合型別的基礎上有序集合型別為集合中的每個元素都關聯了一個分數,這使得我們不僅可以完成插入、刪除和判斷元素是否存在等集合型別支援的操作,還能夠獲得分數最高(或最低)的前N個元素、獲得指定分數範圍內的元素等與分數有關的操作。雖然集合中每個元素都是不同的,但是它們的分數卻可以相同。(內部通過分數排序了,hash很容易實現)。
有序集合可以直接實現文章訪問量排序的功能,最適合做有排名的鬼東西,這樣可以減輕客戶端處理的任務,直接讓資料庫處理了,很機智,很聰明。
列表和有序集合二者都是有序,且可以獲取某一範圍的元素,區別如下:

  • 列表型別是通過連結串列實現的,獲取靠近兩端的資料速度極快,而當元素增多後,
    訪問中間資料的速度會較慢,所以它更加適合實現如”新鮮事 ” 或”日誌”這樣很少訪 問中間元素的應用。
  • 有序集合型別是使用散列表和跳躍表(Skip list)實現的,所以即使讀取位於中間
    部分的資料速度也很快(時間複雜度是O(log(N)) )。
  • 列表中不能簡單地調整某個元素的位置,但是有序集合可以(通過更改這個元素
    的分數)。
  • 有序集合要比列表型別更耗費記憶體。

zadd zrange

1、ZADD key score member [[score member] [score member] ...]
將一個或多個member及其score加入key中。

# 新增單個元素
redis> ZADD page_rank 10 google.com
(integer) 1


# 新增多個元素
redis> ZADD page_rank 9 baidu.com 8 bing.com
(integer) 2

redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 新增已存在元素,且 score 值不變
redis> ZADD page_rank 10 google.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  # 沒有改變
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 新增已存在元素,但是改變 score 值
redis> ZADD page_rank 6 bing.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  # bing.com 元素的 score 值被改變
1) "bing.com"
2) "6"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

2、ZRANGE key start stop [WITHSCORES]
返回有序集key中,指定區間內的成員。其中成員的位置按score值遞增(從小到大)來排序。具有相同score值的成員按字典序(lexicographical order )來排列。可以通過使用WITHSCORES選項,來讓成員和它的score值一併返回。

redis > ZRANGE salary 0 -1 WITHSCORES             # 顯示整個有序整合員
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"

redis > ZRANGE salary 1 2 WITHSCORES              # 顯示有序集下標區間 1 至 2 的成員
1) "tom"
2) "5000"
3) "boss"
4) "10086"

redis > ZRANGE salary 0 200000 WITHSCORES         # 測試 end 下標超出最大下標時的情況
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"

redis > ZRANGE salary 200000 3000000 WITHSCORES   # 測試當給定區間不存在於有序集時的情況
(empty list or set)

zrangebyscore

1、ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回有序集key中,所有score值介於min和max之間(包括等於min或max)的成員。有序整合員按score值遞增(從小到大)次序排列。
具有相同score值的成員按字典序(lexicographical order)來排列。
可選的LIMIT引數指定返回結果的數量及區間(就像SQL中的SELECT LIMIT offset, count)。

zrem zcard zcount zrank

1、ZREM key member [member ...]
移除有序集key中的一個或多個成員,不存在的成員將被忽略。
2、ZCARD key
返回有序集合中成員的數量。

3、ZCOUNT key min max
統計有序集合中,score位於min和max之間的成員的數量。

3、ZRANK key member
返回member在key中的排名,這是通過score排名的。

zrevrank zrevrange zrevrangebyscore

1、ZREVRANGE key start stop [WITHSCORES]
區別與ZRANGE,只不過這個score從大到小排列。
2、ZREVRANK key member
倒數第幾名。
3、ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
返回有序集key中, score值介於max和min之間(預設包括等於max或min)的所有的成員。有序整合員按 score 值遞減(從大到小)的次序排列。
4、ZINCRBY key increment member
增加某個member的分數。increment是正數,則是增加, 負數則是減少。

實踐

文章按訪問量排序、或按實現排序,實現起來就很容易了,直接用一個有序集合,然後以文章id作為成員,分數用時間或者點選率即可實現。

hash

散列表適合儲存一個物件,在鍵中可以放多個域名和值對。
hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。
KV模式不變,但是V是一個鍵值對。
這裡寫圖片描述
這種hash操作,會比較簡單,刪除和新增內容都比較好管理。

hset hsetnx hget hmset hmget hgetall hdel

1、HSET key field value
將雜湊表key中的域field的值設為value 。
如果key不存在,一個新的雜湊表被建立並進行HSET操作。
如果域field已經存在於雜湊表中,舊值將被覆蓋。

2、HMSET key field value [field value ...]
同時將多個field-value (域-值)對設定到雜湊表key中,重複則覆蓋

3、HGET key field
獲取某個域的值。
4、HMGET key field [field ...]
獲取多個域的值。

hlen hexists

1、HLEN key
hlen獲取key中域的數量

2、HEXISTS key field
檢視key中的某個域是否存在。

hkeys hvals hincrby hincrbyfloat

1、HKEYS key
返回key中所有域
2、HVALS key
返回key中所有域對應的值
3、HINCRBY key field increment
key中域的值增加increment。
4、HINCRBYFLOAT key field increment
增加浮點而已,很簡單。

解析配置檔案

引數說明
redis.conf 配置項說明如下:
1. Redis預設不是以守護程序的方式執行,可以通過該配置項修改,使用yes啟用守護程序
daemonize no
2. 當Redis以守護程序方式執行時,Redis預設會把pid寫入/var/run/redis.pid檔案,可以通過pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis監聽埠,預設埠為6379,作者在自己的一篇博文中解釋了為什麼選用6379作為預設埠,因為6379在手機按鍵上MERZ對應的號碼,而MERZ取自義大利歌女Alessia Merz的名字
port 6379
4. 繫結的主機地址
bind 127.0.0.1
5.當 客戶端閒置多長時間後關閉連線,如果指定為0,表示關閉該功能
timeout 300
6. 指定日誌記錄級別,Redis總共支援四個級別:debug、verbose、notice、warning,預設為verbose
loglevel verbose
7. 日誌記錄方式,預設為標準輸出,如果配置Redis為守護程序方式執行,而這裡又配置為日誌記錄方式為標準輸出,則日誌將會發送給/dev/null
logfile stdout
8. 設定資料庫的數量,預設資料庫為0,可以使用SELECT 命令在連線上指定資料庫id
databases 16
9. 指定在多長時間內,有多少次更新操作,就將資料同步到資料檔案,可以多個條件配合
save
Redis預設配置檔案中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。

  1. 指定儲存至本地資料庫時是否壓縮資料,預設為yes,Redis採用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致資料庫檔案變的巨大
    rdbcompression yes
  2. 指定本地資料庫檔名,預設值為dump.rdb
    dbfilename dump.rdb
  3. 指定本地資料庫存放目錄
    dir ./
  4. 設定當本機為slav服務時,設定master服務的IP地址及埠,在Redis啟動時,它會自動從master進行資料同步
    slaveof
  5. 當master服務設定了密碼保護時,slav服務連線master的密碼
    masterauth
  6. 設定Redis連線密碼,如果配置了連線密碼,客戶端在連線Redis時需要通過AUTH 命令提供密碼,預設關閉
    requirepass foobared
  7. 設定同一時間最大客戶端連線數,預設無限制,Redis可以同時開啟的客戶端連線數為Redis程序可以開啟的最大檔案描述符數,如果設定 maxclients 0,表示不作限制。當客戶端連線數到達限制時,Redis會關閉新的連線並向客戶端返回max number of clients reached錯誤資訊
    maxclients 128
  8. 指定Redis最大記憶體限制,Redis在啟動時會把資料載入到記憶體中,達到最大記憶體後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大記憶體設定,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放記憶體,Value會存放在swap區
    maxmemory
  9. 指定是否在每次更新操作後進行日誌記錄,Redis在預設情況下是非同步的把資料寫入磁碟,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為 redis本身同步資料檔案是按上面save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設為no
    appendonly no
  10. 指定更新日誌檔名,預設為appendonly.aof
    appendfilename appendonly.aof
  11. 指定更新日誌條件,共有3個可選值:
    no:表示等作業系統進行資料快取同步到磁碟(快)
    always:表示每次更新操作後手動呼叫fsync()將資料寫到磁碟(慢,安全)
    everysec:表示每秒同步一次(折衷,預設值)
    appendfsync everysec

  12. 指定是否啟用虛擬記憶體機制,預設值為no,簡單的介紹一下,VM機制將資料分頁存放,由Redis將訪問量較少的頁即冷資料swap到磁碟上,訪問多的頁面由磁碟自動換出到記憶體中(在後面的文章我會仔細分析Redis的VM機制)
    vm-enabled no

  13. 虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis例項共享
    vm-swap-file /tmp/redis.swap
  14. 將所有大於vm-max-memory的資料存入虛擬記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體儲存的(Redis的索引資料 就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在於磁碟。預設值為0
    vm-max-memory 0
  15. Redis swap檔案分成了很多的page,一個物件可以儲存在多個page上面,但一個page上不能被多個物件共享,vm-page-size是要根據儲存的 資料大小來設定的,作者建議如果儲存很多小物件,page大小最好設定為32或者64bytes;如果儲存很大大物件,則可以使用更大的page,如果不 確定,就使用預設值
    vm-page-size 32
  16. 設定swap檔案中的page數量,由於頁表(一種表示頁面空閒或使用的bitmap)是在放在記憶體中的,,在磁碟上每8個pages將消耗1byte的記憶體。
    vm-pages 134217728
  17. 設定訪問swap檔案的執行緒數,最好不要超過機器的核數,如果設定為0,那麼所有對swap檔案的操作都是序列的,可能會造成比較長時間的延遲。預設值為4
    vm-max-threads 4
  18. 設定在向客戶端應答時,是否把較小的包合併為一個包傳送,預設為開啟
    glueoutputbuf yes
  19. 指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的雜湊演算法
    hash-max-zipmap-entries 64
    hash-max-zipmap-value 512
  20. 指定是否啟用重置雜湊,預設為開啟(後面在介紹Redis的雜湊演算法時具體介紹)
    activerehashing yes
  21. 指定包含其它的配置檔案,可以在同一主機上多個Redis例項之間使用同一份配置檔案,而同時各個例項又擁有自己的特定配置檔案include /path/to/local.conf

Redis持久化

Redis事務

事務(transaction)是一組命令的集合。集合中的命令要麼全部都執行,要麼都不執行,並不能支援執行過程中錯誤發生之後進行回滾操作。事務的原理是先將屬於一個事務的命令傳送給Redis,然後再讓Redis依次執行這些命令。

Redis釋出訂閱

Redis主從複製和讀寫分離和故障恢復