這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰web
# 切換數據庫
SELECT index
# 當前數據庫有的數據量
DBSIZE
# 清空當前數據庫內容
FLUSHDB
# 清空全部數據庫內容
FLUSHALL
複製代碼
# 刪除指定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
redis中單個key存入512M大小。算法
NOSQL中數據與數據間是沒有任何關聯的,經過命名來解決。數據庫
string 是 redis最基本的數據類型,一個key對應一個value,一個鍵最大能存儲512MB;json
string 類型是二進制安全的,意思是 redis 的string 能夠包含任何數據,好比:jpg圖片或序列化的對象。緩存
二進制安全是指,在傳輸數據時,保證二進制數據的信息安全,也就是不被篡改、破譯等,若是被攻擊,可以及時檢測出。安全
二進制安全特色:markdown
# 賦值語法
# 設置給定 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
複製代碼
**INCR 等指令自己就是具備原子操做的特性,**因此咱們徹底能夠利用 INCR、INCRBY、DECR、DECRBY等指令來實現原子計數的效果。併發
很多網站都利用redis的這個特性來實現業務上的統計計數需求。分佈式
hash 是一個string類型的 field 和 value 的映射表,hash特別適合用與存儲對象。
redis 中能夠存儲 2^32 - 1 鍵值對(40多億),能夠看作具備KEY和VALUE的map容器,該類型很是適合於存儲值對象的信息,如:uname,ugender,uage。該類型的數據僅佔用不多的磁盤空間(相比於JSON)。
# 賦值語法
# 爲指定的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
複製代碼
經常使用於存儲一個對象;
爲何不用string存儲一個對象?
hash是最接近關係型數據庫結構的數據類型,能夠將數據庫一條記錄或程序中一個對象轉換成hashmap存放到redis中;
用string存儲對象的兩種方式:
例:key:id,value:{json串}
複製代碼
例:
key:user:id 1
user:name xiaojian
user:age 22
複製代碼
簡單的字符串列表,按照插入順序排序。能夠添加一個元素到列表的頭部(左邊)或尾部(右邊)
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"
複製代碼
# 賦值語法
# 從列表左邊存入一個或多個元素
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
複製代碼
對數據量顯示、關注列表、粉絲列表、留言評價等...分頁、熱點新聞(Top5)等;
利用 LRANGE 還能夠很方便的實現分頁的功能;在博客系統中,每篇博文的評論也能夠存入一個單獨的list中。
任務隊列
list一般用來實現一個消息隊列,並且能夠確保前後順序,沒必要像MySQL那樣還須要經過 ORDER BY來進行排序
#任務隊列介紹(生產者和消費者模式):
# 在處理web客戶端發送的命令請求時,某些操做的執行時間可能會比咱們預期的更長一些,經過將待執行任務的相關信息放入隊
列裏面,並在以後對隊列進行處理,用戶能夠推遲執行那些須要一段時間才能完成的操做,這種將工做交給任務處理器來執行的作法
被稱爲任務隊列(task queue)。
RPOPLPUSH source destination
# 一處列表的最後一個元素,並將該元素添加到另外一個列表並返回(對同一個list使用,把最後一個元素,調到首個)
複製代碼
不容許存在重複元素的集合,無序
Redis集合時經過哈希表實現的,因此添加,刪除,查找的複雜度都是 O(1),
set是經過 hashtable
實現的,
集合中的最大成員數爲 2^32^ - 1(4294967295,每一個集合可存儲40多億個成員)
相似 Java 中的成員 Hashtable
集合
# 賦值語法
# 添加一個或多個元素
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
複製代碼
常應用於:對兩個集合間的數據 [計算] 進行交集、並集、差集運算
有序集合(sorted set)
不容許重複元素,且元素有序
插入元素時都會關聯一個double類型的分數(score),以分數從小到大排序
有序集合的成員是惟一的,但分數(score)卻能夠重複
(咱們將在redis中的有序集合叫作zsets,這是由於在 redis 中,有序集合相關的操做指令都是以z開頭的)
# 賦值語法
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 ...]
複製代碼
常應用於:排行榜
銷量排名,積分排名等
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。
基數估計就是在偏差可接受的範圍內,快速計算基數.
複製代碼
# 添加指定元素到 HyperLogLog 中
PFADD key element [element ...]
# 返回給定 HyperLogLog 的基數估算值
PFCOUNT key [key ...]
# 將多個 HyperLogLog 合併爲一個 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]
複製代碼
基數不大,數據量不大就用不上,會有點大材小用浪費空間
有侷限性,就是隻能統計基數數量,而沒有辦法知道具體內容是什麼
統計註冊 IP 數
統計每日訪問 IP 數
統計頁面實時 UV 數
統計在線用戶數
統計用戶天天搜索不一樣詞條的個數
統計真是文章閱讀數
複製代碼