Redis基礎(三)—— 基本命令與數據類型

這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰web

一、Redis基本命令

# 切換數據庫
	SELECT index
# 當前數據庫有的數據量
	DBSIZE
# 清空當前數據庫內容
	FLUSHDB
# 清空全部數據庫內容
	FLUSHALL
複製代碼

1.1 key

# 刪除指定key(一個或多個)
	DEL key [key ...] 
# 序列化指定key的值
	DUMP key 
# 查詢key是否存在
	EXISTS key 
 # 設置一個key的過時時間(s)
	EXPIRE key seconds 
# 獲取key的有效時間(s)(-1,永久有效;-2,無效,沒有該key)
	TTL key 
# 移除key的過時時間
	PERSIST key
 # 查找全部匹配給定的模式的鍵(通配符: *: 表明全部; ?: 表明一個字符)
	KEYS pattern 
# 返回一個隨機的key
	RANDOMKEY
# 將一個key重命名
	RENAME key newkey
# 重命名一個key,新的key必須是一個不存在的key
	RENAMENX key newkey
# 移動一個key到另外一個數據庫
	MOVE key db
複製代碼

EXPIRE key命令,應用場景redis

  • 限時的優惠活動信息
  • 手機驗證碼
  • 限制網站訪客訪問頻率

1.2 key命名規範

​ redis中單個key存入512M大小。算法

​ NOSQL中數據與數據間是沒有任何關聯的,經過命名來解決。數據庫

  1. key不要太長,儘可能不要超過1024字節,這不只消耗內存,並且下降查詢效率;
  2. key也不要過短,過短的話,可讀性下降;
  3. 在一個項目中,key最好使用統一的命名模式,例如:user:id :name、user&id&name;
  4. key的名稱區分大小寫,命令不區分大小寫。

二、Redis 數據類型

2.1 String

2.1.1 簡介:

string 是 redis最基本的數據類型,一個key對應一個value,一個鍵最大能存儲512MB;json

string 類型是二進制安全的,意思是 redis 的string 能夠包含任何數據,好比:jpg圖片或序列化的對象。緩存

二進制安全是指,在傳輸數據時,保證二進制數據的信息安全,也就是不被篡改、破譯等,若是被攻擊,可以及時檢測出。安全

二進制安全特色:markdown

  • 編碼、解碼發生在客戶端完成,執行效率高;
  • 不須要頻繁的編碼解碼,不會出現亂碼

2.1.2 string命令

# 賦值語法
# 設置給定 key的值,若是key已經存在值,覆蓋舊值,且無視類型
	SET key value
# key不存在時,爲key賦值;key存在,命令失效
	SETNX key value // 重要,分佈式鎖問題
# 爲多個key-value賦值
	MSET key value [key value...]
# 追加一個值到key上,返回字符串長度
	APPEND key value
複製代碼
# 取值語法
# 返回 key 的value
	GET key
# 獲取存儲在key上的值的一個字符串,start - end表示取值範圍(0-x) 
	GETRANGE key start end
# 設置一個key的值,並獲取設置前的值(應用場景普遍)
	GETSET key value
# 獲取指定key值的長度
	STRLEN key
# 返回位的值存儲在關鍵的字符串值的偏移量
	GETBIT key offset
複製代碼
# 刪除語法
# 刪除指定key,若是存在,返回數字類型(刪除的個數)
	DEL key
複製代碼
# 自增、自減,並返回結果數
# 將key存儲的值自增長一,若是key不存在,那麼key的值會先初始爲0,再執行incr操做
	INCR key
# 將key存儲的值自增自定義的數,若是key不存在,那麼key的值會先初始爲0,在執行incrby操做
	INCRBY key increment
# 自減一
	DECR key
# 自減自定義的值
	DECRBY key increment
複製代碼

2.1.3 應用場景

  • String 一般用於保存單個字符串或JSON字符串數據;
  • 因String是二進制安全的,因此徹底能夠把一個圖片文件的內容做爲字符串來存儲;
  • 計數器,(常規key-value 緩存應用,常規技術:閱讀數、評論數)

**INCR 等指令自己就是具備原子操做的特性,**因此咱們徹底能夠利用 INCR、INCRBY、DECR、DECRBY等指令來實現原子計數的效果。併發

很多網站都利用redis的這個特性來實現業務上的統計計數需求。分佈式

2.2 hash類型

2.2.1 簡介

  • hash 是一個string類型的 field 和 value 的映射表,hash特別適合用與存儲對象。

  • redis 中能夠存儲 2^32 - 1 鍵值對(40多億),能夠看作具備KEY和VALUE的map容器,該類型很是適合於存儲值對象的信息,如:uname,ugender,uage。該類型的數據僅佔用不多的磁盤空間(相比於JSON)。

2.2.2 hash命令

# 賦值語法
# 爲指定的key,設定key/value.至關於 key:對象名 field:屬性名 value:屬性值
	HSET key field value
# 同時將多個 field-value(域-值)對設置到哈希表key中
	HMSET key field value [field value]...
複製代碼
# 取值語法
# 取出 key 的field的值
	HGET key field
# 取出 key 中多個field的值
	HMGET key field [field...]
# 獲取 key 的全部 field 和 value
	HGETALL key
# 獲取key中全部field
	HKEYS key
# 獲取 key 中field的數量
	HLEN key
複製代碼
# 刪除語法
# 刪除key中一個或多個field,當key的全部field的值都刪除完了,redis會刪除這個key
		HDEL key field [field...]
複製代碼
# 其餘語法
# 只有key不存在時,設置字段的值 
	HSETNX key field value
# 爲哈希表key中的指定字段的整數值加上增量increment
	HINCRBY key field increment
# 爲哈希表key中的指定字段的浮點數值加上增量increment
	HINCRBYFLOAT key field increment
# 查看哈希表key中,指定的field是否存在
	HEXISTS key field
複製代碼

2.2.3 應用場景

  • 經常使用於存儲一個對象;

  • 爲何不用string存儲一個對象

    • hash是最接近關係型數據庫結構的數據類型,能夠將數據庫一條記錄或程序中一個對象轉換成hashmap存放到redis中;

    • 用string存儲對象的兩種方式:

      • 第一種,將用戶id做爲查找的key,把其餘信息封裝成一個對象以序列化的方式存儲(json)。缺點:增長了序列化/反序列化的開銷,而且在須要修改其中一項信息中,須要把整個對象取出,而且修改操做須要對併發進行保護,引入CAS等複雜問題;
      例:key:id,value:{json串}
      複製代碼
      • 第二種,這個用戶信息對象有多少成員就存成多少個key-vale對,用戶ID+對應屬性的名稱做爲惟一表示來取得對應屬性的值。(例:set user:id 1;set user:name xiaojian;set user:gender "男" )雖然省去了序列化開銷和併發問題,可是用戶ID爲重複存儲,若是存在大量這樣的數據,內存浪費巨大。
    例:
    key:user:id 1
        user:name xiaojian
        user:age 22
    複製代碼

2.3 List類型

2.3.1 簡介

簡單的字符串列表,按照插入順序排序。能夠添加一個元素到列表的頭部(左邊)或尾部(右邊)

List 存入的元素的結構就像棧堆,先進後出

相似於 Java 的 LinkedList

127.0.0.1:6379> lpush list2 1
(integer) 1
127.0.0.1:6379> lpush list2 2
(integer) 2
127.0.0.1:6379> lpush list2 3
(integer) 3
127.0.0.1:6379> lpush list2 3
(integer) 4
127.0.0.1:6379> lrange list2 0 -1
1) "3"
2) "3"
3) "2"
4) "1"
複製代碼

2.3.2 List命令

# 賦值語法
# 從列表左邊存入一個或多個元素
	LPUSH key value[value...]
# 當列表存在時,從列表左邊存入一個(列表不存在,沒法存入)
	LPUSHX key value
# 從列表右邊存入一個或多個元素
	RPUSH key value[value...]
# 當列表存在時,從列表右邊存入一個(列表不存在,沒法存入)
	RPUSHX key value
 # 在列表中的另外一個元素以前或以後插入一個元素
	LINSERT key BEFORE|AFTER pivot value
如:linsert list1 BEFORE "c" "b" # 在元素 "c" 以前插入 "b"
 # 根據索引,設置列表裏面一個元素的值
	LSET key index value
	
複製代碼
# 取值語法
# 經過其索引獲取一個元素
	LINDEX key index
# 從列表獲取指定範圍內的元素,start和stop偏移量爲 -1 指最後一個元素,-2指倒數第二個,一次類推
	LRANGE key start stop
# 獲取列表長度
	LLEN key
# 截取指定範圍的數據,列表中的數據改變成截取的數據
	LTRIM key start stop
複製代碼
# 刪除語法
# 從列表最左邊移除一個元素,並返回這個元素
	LPOP key
# 從列表最右邊移除一個元素,並返回這個元素
	RPOP key
# 從存於 key 的列表裏移除前 count 次出現的值爲 value 的元素。
# count爲正數時,移除前count個;爲負數時,移除後count個;爲0,移除全部value
	LREM key count value
複製代碼

2.3.3 應用場景

  • 對數據量顯示、關注列表、粉絲列表、留言評價等...分頁、熱點新聞(Top5)等;

    利用 LRANGE 還能夠很方便的實現分頁的功能;在博客系統中,每篇博文的評論也能夠存入一個單獨的list中。

  • 任務隊列

    list一般用來實現一個消息隊列,並且能夠確保前後順序,沒必要像MySQL那樣還須要經過 ORDER BY來進行排序

    #任務隊列介紹(生產者和消費者模式):
    # 在處理web客戶端發送的命令請求時,某些操做的執行時間可能會比咱們預期的更長一些,經過將待執行任務的相關信息放入隊
    列裏面,並在以後對隊列進行處理,用戶能夠推遲執行那些須要一段時間才能完成的操做,這種將工做交給任務處理器來執行的作法
    被稱爲任務隊列(task queue)。
    
    	RPOPLPUSH source destination
    # 一處列表的最後一個元素,並將該元素添加到另外一個列表並返回(對同一個list使用,把最後一個元素,調到首個)
    複製代碼

2.4 Set 類型

2.4.1 簡介

不容許存在重複元素的集合,無序

Redis集合時經過哈希表實現的,因此添加,刪除,查找的複雜度都是 O(1),

set是經過 hashtable 實現的,

集合中的最大成員數爲 2^32^ - 1(4294967295,每一個集合可存儲40多億個成員)

相似 Java 中的成員 Hashtable 集合

2.4.2 Set 命令

# 賦值語法
# 添加一個或多個元素
	SADD key member [member...]
複製代碼
# 取值語法
# 獲取集合中全部元素
	SMEMBERS key 
# 獲取集合長度
	SCARD key
# 判斷 member 元素是不是集合 key 的成員(開發中:驗證是否存在判斷)
	SISMEMBER key member
# 返回集合中一個或多個隨機數
	SRANDMEMBER key [count]
 # 差集語法:
	SDIFF key1 [key2] : 返回給定 key1 集合與其餘集合的差集
	SDIFFSTORE destination key1 [key2] : 返回給定全部集合的差集並存儲在 destination 中(destination是一個新建的key的名稱)
# 交集語法:
	SINTER key1 [key2] : 返回給定全部集合的交集(共有數據)
	SINTERSTORE destination key1 [key2] : 返回給定全部集合的交集並存儲在 destination 中(destination是一個新建的key的名稱)
# 並集語法:
	SUNION key1 [key2] : 返回全部給定集合的並集
	SUNIONSTORE destination key1 [key2] : 返回給定全部集合的並集並存儲在 destination 
	
複製代碼
# 刪除語法
# 刪除一個或多個元素
	SREM key member1 [member2]
# 移除並返回集合的一個隨機元素
	SPOP key [count]
# 將 member 元素從 source 集合移動到 destination 集合
	SMOVE source destination member 
複製代碼

2.4.3 應用場景

常應用於:對兩個集合間的數據 [計算] 進行交集、並集、差集運算

  • 利用集合操做,能夠取不一樣興趣圈子的交集,以很是方便的實現如共同關注、共同喜愛、二度好友等功能。對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存儲到一個新的集合中。
  • 利用惟一性,能夠統計訪問網站的全部獨立 IP、存取當天(或某天)的活躍用戶列表。

2.5 ZSet 類型

2.5.1 簡介

有序集合(sorted set)

不容許重複元素,且元素有序

插入元素時都會關聯一個double類型的分數(score),以分數從小到大排序

有序集合的成員是惟一的,但分數(score)卻能夠重複

(咱們將在redis中的有序集合叫作zsets,這是由於在 redis 中,有序集合相關的操做指令都是以z開頭的)

2.5.2 ZSet 命令

# 賦值語法
	ZADD key score member [score member...]
複製代碼
# 取值語法
# 獲取有序集合的成員數
	ZACARD key 
# 計算在有序集合中指定區間分數的成員數
	ZCOUNT key min max
# 返回有序集合中指定成員的索引
	ZRANK key member
 # 經過索引區間返回有序集合中指定區間的成員(0,-1)
	ZRANGE key start end [WITHSCORES]
# 經過分數返回有序集合指定區間內的成員
	ZRANGBYSCORE key min max [WITHSCORES] [LIMIT]
 # 返回有序集合指定區間內的成員,經過索引,分數從高到低
	ZREVRANGE key start stop [WITHSCORES]
# 返回有序集合指定分數區間內的成員,經過索引,分數從高到低
	ZREVRANGEBySCORE key max min [WITHSCORES]
複製代碼
# 刪除語法
# 移除集合
	DEL key
# 移除有序集合中的一個或多個成員
	ZREM key member [member ...]
複製代碼

2.5.3 應用場景

常應用於:排行榜

銷量排名,積分排名等

2.6 HyperLogLog

簡介

Redis 在2.8.9 版本添加了 HyperLogLog 結構
Redis HyperLogLog 是用來作基數統計的算法,HyperLogLog 的優勢是,在輸入元素的數量或體積很是大時,計算基數所需的空間老是固定的,而且是很小的
複製代碼
在 Redis 裏面,每一個 HyperLogLog 鍵只須要花費 12 KB內存,就能夠計算接近 2^64 個不一樣元素的基數。這和計算基數時,元素越多耗費內存就越多的集合造成鮮明對比。
可是,由於 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素自己,因此 HyperLogLog 不能像集合那樣,返回輸入的各個元素。
複製代碼
什麼是基數?
	好比數據集{1,3,5,7,5,7,8},那麼這個數據集的基數集爲{1,3,5,7,8},基數(不重複元素)爲5。
	基數估計就是在偏差可接受的範圍內,快速計算基數.
複製代碼

2.6.1 經常使用命令

# 添加指定元素到 HyperLogLog 中
	PFADD key element [element ...]
# 返回給定 HyperLogLog 的基數估算值
	PFCOUNT key [key ...]
# 將多個 HyperLogLog 合併爲一個 HyperLogLog
	PFMERGE destkey sourcekey [sourcekey ...]
複製代碼

2.6.2 應用場景

基數不大,數據量不大就用不上,會有點大材小用浪費空間

有侷限性,就是隻能統計基數數量,而沒有辦法知道具體內容是什麼

統計註冊 IP 數
統計每日訪問 IP 數
統計頁面實時  UV 數
統計在線用戶數
統計用戶天天搜索不一樣詞條的個數
統計真是文章閱讀數
複製代碼
相關文章
相關標籤/搜索