Redis系列(二):Redis的數據類型及命令操做

Redis 中經常使用命令

Redis 官方的文檔是英文版的,固然網上也有大量的中文翻譯版,例如:Redis 命令參考。這裏只列舉經常使用到幾個基本命令。html

命令 行爲
set key value 設置 key 值爲 value
get key 讀取 key 的值
del key 刪除 key
expire key seconds 設置 key 的生存時間(seconds 秒後自動刪除)
ttl key 查看 key 剩餘生存時間
exists key 判斷 key 是否存在
ping 測試與服務端是否聯通
keys * 匹配數據庫中全部 key
dbsize 查詢當前數據庫中 key 的數量
info 返回關於 Redis 服務器的各類信息和統計數值
flushdb 清空當前數據庫中的全部 key
flushall 清空整個 Redis 服務器的數據( 刪除全部數據庫的全部 key )
quit 請求服務器關閉與當前客戶端的鏈接( 斷開鏈接 )

Redis數據類型簡介

數據類型 存儲的值 讀寫能力
String 字符串,整數或浮點數 對字符串或一部分字符串執行操做;對整數進行自增和自減操做等
Hash 包含鍵值對的無序散列表 對單個 元素進行增、刪、改;獲取因此的鍵值對等
List 鏈表上的節點字符串元素 推入、彈出元素;修剪、查找、移除元素等
Set 各不相同的字符串元素 對單個 元素進行增、刪、改;計算集合 交,並補集等
Sorted Set 帶分數的有序集合 對單個 元素進行增、刪、改;按照分數範圍查元素等

字符串類型(String)

redis string 介紹

雖然 redis 是用 C 編寫的,可是在 redis 中沒有使用 C 語言的字符串,而是自定義了一個數據結構叫 SDS (simple dynamic string) ——簡單動態字符串。是能夠修改的,相似java中的 ArrayList。同時它也不像 C 中的字符串那樣遇到 \0字符就認爲字符串結束,他不會對存儲進去的字符串數據進行任何處理,所以 redis 中的字符串也是二進制安全的。java

redis 的 string 類型能夠包含任意數據,包括圖片等二進制或者序列化的對象等。單個 value 的值最大上限爲 1G字節。python

純字符串操做命令

#後面是命令的註釋,不可執行c++

127.0.0.1:6379> set key1 'hello redis' # 存值
OK
127.0.0.1:6379> get key1 # 取值
"hello redis"
127.0.0.1:6379> getset key1 redis # 將給定key1的值設爲redis,並返回key1的舊值(old value)
"hello redis"
127.0.0.1:6379> get key1
"redis"
127.0.0.1:6379> del key1 # 刪除 key1
(integer) 1

整數自增自減操做命令

127.0.0.1:6379> set key2 10 # 存入一個值爲10的整數字符串
OK
127.0.0.1:6379> incr key2 # 自增
(integer) 11
127.0.0.1:6379> incr key2 # 自增
(integer) 12
127.0.0.1:6379> incrby key2 5 # 自增指定數值 -- 5
(integer) 17
127.0.0.1:6379> decr key2 # 自減
(integer) 16
127.0.0.1:6379> decr key2 # 自減
(integer) 15
127.0.0.1:6379>  decrby key2 5 # 自減指定數值 -- 5
(integer) 10

其餘命令

127.0.0.1:6379> set key1 redis
OK
127.0.0.1:6379> append key1 hello # 將 hello 追加到 key1 原來的值的末尾,放回追加後字符串長度
(integer) 10
127.0.0.1:6379> get key1
"redishello"
127.0.0.1:6379> strlen key1 # 返回 key1 所儲存的字符串值的長度
(integer) 10
127.0.0.1:6379> mset key1 v1 key2 v2 key3 v3 # 批量同時設置一個或多個 key-value 對
OK
127.0.0.1:6379> mget key1 key2 key3 # 返回全部(一個或多個)給定 key 的值
1) "v1"
2) "v2"
3) "v3"

應用場景

  • 商品編號,訂單號採用string 的遞增數字特性生成

散列類型(Hash)

redis hash介紹

hash 叫散列類型。等價於Java 中的 HashMap。可是在 redis 中 hash 的 key 必須是 string 類型。不支持其餘類型。這個特性很是適合存儲對象。由於一個對象能夠有不少屬性,存儲起來就是鍵值對形式的。在 Reids 中,每一個 Hash 能夠存儲多達 4 億個鍵值對。redis

圖示

相關操做命令

127.0.0.1:6379> hset user name zhangsan # 使用 hset 爲 user 添加一個鍵值對 name = zhangsan
(integer) 1
127.0.0.1:6379> hset user age 18 # 使用 hset 爲 user 添加一個鍵值對 age = 18
(integer) 1
127.0.0.1:6379> hget user name # 使用 hget 獲取 user 中鍵爲 name 的值
"zhangsan"
127.0.0.1:6379> hget user age # 使用 hget 獲取 user 中鍵爲 age 的值
"18"
127.0.0.1:6379> hgetall user # 使用 hgetall 獲取 user 中全部的鍵值對
1) "name"
2) "zhangsan"
3) "age"
4) "18"
127.0.0.1:6379> hmset user name lisi age 20 # 使用 hmset 爲 user 批量添加鍵值對
OK
127.0.0.1:6379> hmget user name age # 使用 hmget 批量獲取 user 中鍵的值
1) "lisi"
2) "20"
127.0.0.1:6379> hdel user name# 使用 hdel 刪除 user 一個(或多個)鍵值對
(integer) 1
127.0.0.1:6379> hexists user name # 使用 hexists 判斷 user 中 name 元素是否存在
(integer) 0
127.0.0.1:6379> hexists user age # 使用 hexists  user 中 age 元素是否存在
(integer) 1
127.0.0.1:6379> hkeys user # 使用 hkeys 只得到 user 中的字段名
1) "age"
127.0.0.1:6379> hvals user # 使用 hvals 只得到 user 中的字段值
1) "20"
127.0.0.1:6379> hlen user # 使用 hlen 得到  user 中字段(鍵值對)數量
(integer) 1

其餘特性

Redis 中的 Hash 結構有擴容縮容特性,擴容主要應用在當 hash 內部比較擁擠的時候,容易產生 hash 碰撞,這時須要擴容 hash 。申請新的兩倍大小的數組;而縮容與擴容偏偏相反,雖然原理同樣,可是申請的新數組要比舊的小一倍。shell

應用場景

  • 保存大量的對象數據

列表類型(List)

redis list介紹

在 java 中,列表類型有兩種,一種是 ArrayList,實現方式是數組,因此根據索引查詢數據速度快,而插入或者刪除某個元素涉及到位移操做,會比較慢;另外一種是 LinkedList,實現方式是雙向鏈表(double linked list),每一個元素都記錄着先後元素的指針。因此在插入或刪除某個元素時只須要更改該元素的先後指針指向就行,很是快,可是在查詢上須要從頭索引,特別是當數據量大的時候,索引發來仍是比較慢的。數據庫

在 Redis 中的 List 類型,其內部使用的是雙向鏈表實現的,因此它具備雙向鏈表具備的相關特性。其經常使用操做就是向列表兩端添加或刪除元素。這使得 List 既能夠當作棧(先進後出)來使用,也能夠當作隊列(先進先出)來使用。segmentfault

相關操做命令

127.0.0.1:6379> lpush list 1 2 3 4 # 使用 lpush 將 1 2 3 4 依次插入到 list 的左端
(integer) 4
127.0.0.1:6379> rpush list 5 6 7 8 # 使用 rpush 將 5 6 7 8 依次插入到 list 的右端
(integer) 8
127.0.0.1:6379> lrange list 0 -1 # 使用 lrange 獲取 指定區間上全部值(0 -1 表示獲取所有)
1) "4"
2) "3"
3) "2"
4) "1"
5) "5"
6) "6"
7) "7"
8) "8"
127.0.0.1:6379> lpop list # 使用 lpop 彈出 list 左端的一個值,並返回彈出的值
"4"
127.0.0.1:6379> lpop list 
"3"
127.0.0.1:6379> rpop list # 使用 rpop 彈出 list 右端的一個值,並返回彈出的值
"8"
127.0.0.1:6379> rpop list
"7"
127.0.0.1:6379> lrange list 0 -1
1) "2"
2) "1"
3) "5"
4) "6"
127.0.0.1:6379> llen list # 使用 llen 獲取 list 中元素個數
(integer) 4

應用場景

  • 商品,博客,文章下面的評論列表。

集合類型(Set)

redis set 介紹

redis 中的 set 類型和 java 中的 HashSet 相似,其底層都是用HashMap 實現的,只不過全部的 value 都指向同一個對象。在 set 中,沒有重複的元素。而且沒有順序。其經常使用的操做就是向集合中加入或刪除一個元素、判斷某個元素是否在集合中。另外 redis 還提供了多個集合之間的 交集、並集、差集的運算。數組

相關操做命令

127.0.0.1:6379> sadd set a b c 1 2 3  # 使用 sadd 將 a b c 1 2 3 添加到 set 集合中
(integer) 6
127.0.0.1:6379> sadd set a b 2  # 添加劇復元素,返回成功添加 0 個,說明 set 中元素不重複
(integer) 0
127.0.0.1:6379> srem set a b 1  # 使用 srem 刪除 set 集合中的 a b 1 三個元素
(integer) 3
127.0.0.1:6379> smembers set  # 使用 smembers 獲取 set 集合中因此元素
1) "2"
2) "c"
3) "3"
127.0.0.1:6379> sismember set a  # 使用 sismember 判斷 a 是否在 set 集合中
(integer) 0
127.0.0.1:6379> sismember set c  # 使用 sismember 判斷 c 是否在 set 集合中
(integer) 1

集合間的相關運算

集合的並集運算 A ∪ B

並集

127.0.0.1:6379> sadd seta 1 2 3
(integer) 3
127.0.0.1:6379> sadd setb 3 4 5
(integer) 3
127.0.0.1:6379> sunion seta setb # 使用 sunion 計算 seta 和 setb 的並集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
集合的交集運算 A ∩ B

交集

127.0.0.1:6379> sadd seta 1 2 3
(integer) 3
127.0.0.1:6379> sadd setb 3 4 5
(integer) 3
127.0.0.1:6379> sinter seta setb # 使用 sinter 計算 seta 和 setb 的交集
1) "3"
集合的差集運算 A - B

差集

127.0.0.1:6379> sadd seta 1 2 3
(integer) 3
127.0.0.1:6379> sadd setb 3 4 5
(integer) 3
127.0.0.1:6379> sdiff seta setb # 使用 sdiff 計算 seta - setb (屬於seta 但不屬於 setb)
1) "1"
2) "2"
127.0.0.1:6379> sdiff setb seta # 使用 sdiff 計算 setb - setb (屬於setb 但不屬於 seta)
1) "4"
2) "5"

有序集合類型 (sorted set)

redis sorted set介紹

SortedSet(zset)是 redis 提供的一個很是特別的數據結構,它在集合的基礎上爲每個元素都關聯了一個分數,這至關於 java 中的 Map<String,Double>,能夠給每個元素賦予一個score權重。另外一方面又像TreeSet,內部的元素會按照權重score進行排序。安全

相關操做命令

127.0.0.1:6379> zadd board 81 java 75 python 90 c++ # 使用 zadd 增長一到多個value/score對,score 放在前面
(integer) 3
127.0.0.1:6379> zscore board java # 使用 zscore 獲取 java 的 score
"81"
127.0.0.1:6379> zrange board 0 -1 # 使用 zrange 獲取指定區間(0 -1 表示所有)上的降序排名
1) "python"
2) "java"
3) "c++"
127.0.0.1:6379> zrange board 0 -1 withscores # 帶上 winthscores 能夠一併獲取元素的 score
1) "python" 
2) "75"
3) "java"
4) "81"
5) "c++"
6) "90"
127.0.0.1:6379> zrevrange board 0 -1 withscores # 使用 zrevrange 獲取指定區間(0 -1 表示所有)上的升序排名
1) "c++"
2) "90"
3) "java"
4) "81"
5) "python"
6) "75"
127.0.0.1:6379> zrangebyscore board -inf +inf withscores # 使用 zrangebyscore 獲取 負無窮(-inf)到 正無窮(+inf)區間上因此元素的降序排名
1) "python"
2) "75"
3) "java"
4) "81"
5) "c++"
6) "90"
127.0.0.1:6379> zrevrangebyscore board +inf -inf withscores # 使用 zrevrangebyscore 獲取正無窮(+inf)到 負無窮(-inf)區間上因此元素的升序排名 
1) "c++"
2) "90"
3) "java"
4) "81"
5) "python"
6) "75"
127.0.0.1:6379> zcard board # 使用 zcard 計算 board 集合的元素個數
(integer) 3
127.0.0.1:6379> zrem board java python # 使用 zrem 刪除 board 集合中的一個或多個元素 
(integer) 2

應用場景

  • 商品銷售,軟件下載等各類排行榜

參考

相關文章
相關標籤/搜索