一. 五種數據類型
- 字符串(String)——經常使用
- 哈希(hash)——經常使用
- 字符串列表(list)
- 字符串集合(set)
- 有序字符串集合(sorted set)
二. Key定義的注意點
- 不要過長(消耗內存,下降查找效率)
- 不要太短(下降可讀性)
- 統一的命名規範
三. 存儲String
1.經常使用命令:
- set [key] [value] 設值
- get [key] 取值
- getset [key] [value] 先獲取key的值,再把key的值更新爲value
- del [key] 刪除,刪完後再get,會返回(nil),表明值不存在
- incr [key] 將指定的key的值遞增1,若該key的值不存在,則默認其爲0,再遞增1. 若該值不能轉成整型,好比String類型,使用該操做會報錯
- decr [key] 與上面相反,是遞減1.
- incrby [key] [num] 遞增的數額是[num]的值
- decby [key] [num] 遞減的數額是[num]的值
- append [key] [value] 拼湊字符串,若key存在,則會在原有的value後追加[value]的值,若key不存在,則會建立這個(key,value)
四. 存儲Hash
Redis中的Hash類型能夠當作是一個具備String Key和String Value的map容器,這個類型很是適合存儲值對象類型,好比:用戶名、密碼、年齡等等。每個Hash能夠存儲4294967295個鍵值對redis
1.經常使用命令:
- hset [hashName] [key] [value] 設值,如:hset myhash username jack,hset myhash age 18
- hmset [hashName] [key] [value] [key] [value] 一次存入多個鍵值對,如:hmset myhash2 username rose age 21
- hget [hashName] [key] 取值,如:hget myhash username
- hmget [hashName] [key] [key] 一次取得多個屬性的值,如:hmget myhash username age
- hgetall [hashName] 獲取一個集合中全部屬性和屬性和屬性值,如:hgetall myhash
- hdel [hashName] [key] [key] 刪除一個集合下的多個屬性,如:hdel myhash2 username age
- del [hashName] 刪除整個集合,如:del myhash2
- hincrby [hashName] [key] [num] 給某屬性值增長數值,如:hincrby myhash age 5
- hexists [hashName] [key] 判斷某個hash中的屬性是否存在,若存在會返回1.如:hexists myhash username
- hlen [hashName] 獲取屬性數量,如:hlen myhash
- hkeys [hashName] 得到全部屬性名稱,如:hkeys myhash
- hvals [hashName] 獲取全部屬性值,如:hvalues myhash
五. 存儲list
Redis中的list類型,是按照插入順序排序的字符串鏈表,和數據結構中的普通鏈表是同樣的,咱們能夠在他的頭部和尾部添加新的元素,在插入時,若該鍵不存在,那麼redis就會爲這個鍵建立一個新的鏈表,與此相反,若是鏈表中的全部元素都被移除了,那麼該鍵也會被刪除。若是鏈表元素的插入與刪除是做用在鏈表的兩頭,那麼這是比較高效的操做,即便鏈表中已經存在百萬條數據,這個操做也能夠在常量時間內完成。如果在鏈表的中間進行元素的插入與刪除操做,那麼這樣操做的效率就比較低了數組
1.存儲數據的方式:
- ArrayList使用數組方式。根據索引查詢速度很是快,可是新增和刪除操做須要涉及到位移操做,因此比較慢
- LinkedList使用雙向鏈表方式。每一個元素都記錄了先後元素的指針,因此插入和刪除數據的時候,只是改變了先後元素指針的指向,速度較快
- 雙向鏈表中添加數據
- 雙向鏈表中刪除數據
2.經常使用命令:
1. 兩端添加:服務器
- lpush mylist a b c 向鏈表mylist頭部(左側)添加a,b,c
- rpush mylist 1 2 3 向鏈表mylist尾部(右側)添加1,2,3
2. 查看鏈表中元素:數據結構
- lrange mylist 0 5 查看鏈表mylist中的元素,從位置0開始,到位置5結束。也能夠用負數,-1表示鏈表尾部的元素,-2表示倒數第二個,以此類推
- lrange mulist 0 -1 查看鏈表mylist中全部元素(從頭部到尾部)
3. 兩端彈出:app
- lpop mylist 左端彈出鏈表頭部第一個元素,此時鏈表中就沒有這個元素了
- rpop mylist 右端彈出鏈表尾部第一個元素,此時鏈表中就沒有這個元素了
4. 獲取鏈表中元素個數:spa
5. 擴展命令線程
- lpushx mylist x 僅當mylist關聯的鏈表存在時,往該鏈表頭部插入值x,若是不存在,則不會插入值
- rpushx mulist y 僅當mylist關聯的鏈表存在時,往該鏈表尾部插入值y,若是不存在,則不會插入值
- lrem mylist 2 3 從mylist鏈表頭部開始,刪去兩個3
- lrem mylist -2 1 從mylist鏈表尾部開始,刪去兩個1
- lrem mylist 0 2 從mylist鏈表中刪除全部2
- lset mylist 3 mmm 把mylist鏈表中腳標爲3的值設爲mmm
- linsert mylist before b 11 從鏈表頭部開始,在第一個b以前插入11
- linsert mylist after b 22 從鏈表左側開始,在第一個b以後插入22
6. rpoplpush mylist5 mylist6 將mylist5中的尾部元素彈出,壓入到mylist6的頭部中去。指針
3.使用場景:
redis鏈表常常會被用於消息隊列的一些服務,來完成多個程序之間的消息交互。假設一個應用程序正在執行lpush向鏈表中添加新的元素,我麼一般將這樣的程序稱之爲"生產者",另一個程序正在執行從鏈表中取出元素,咱們稱之爲「消費者」,於此同時,消費者程序在取出元素後當即崩潰,因爲該消息已經被取出,卻沒有被正常處理,能夠認爲該消息已經丟失,由此可能會致使業務數據的丟失或者業務狀態的不一致。經過rpoplpush操做,消費者程序在主消息隊列中取出元素以後,再將它插入到一個備份的隊列之中,直到消費者程序完成正常的邏輯處理以後,再將消息從備份隊列中刪除,這樣能夠提供一個守護的線程,當發現備份隊列中的消息過時的時候,能夠將它從新放回到主消息隊列中,以便其餘的消費者能夠繼續的處理code
六. 存儲set
和List類型不一樣的是,Set集合中不容許出現重複的元素,若是屢次添加相同的元素,set中僅保留一份該元素的拷貝,set可包含最大元素數量是4294967295對象
1.經常使用命令:
1. 添加/刪除元素
- sadd myset a b c 向集合myset中添加了a,b,c
- srem myset a b 刪除myset中的a,b
2.得到集合中的元素
- smembers myset 得到集合中的元素
- sismember myset a 判斷a是否存在與myset中,若返回1,則存在;返回0,則不存在
3.集合中的差集運算(返回兩個集合中相差的成員,並且與key的順序有關)
sadd mya1 a b c
sadd myb1 a c 1 2
sdiff mya1 myb1
#結果返回 b,求差集結果和key的順序有關
sdiff myb1 mya1
#結果返回 1 2
4.集合中的交集運算
sadd mya2 a b c
sadd myb2 a c 1 2
sinter mya2 myb2
#返回交集 a c
5.集合中的並集運算
sadd mya3 a b c
sadd myb3 a c 1 2
sunion mya3 myb3
#返回並集 a b c 1 2
6.拓展命令
- scard myset 獲得集合中元素的數量
- srandmember myset 隨機返回一個集合中的元素
- sdiffstore my1 mya1 myb1 把mya1和myb1相差的值存儲到集合my1中
- sinterstore my2 mya2 myb2 把mya2和myb2的交集存儲到集合my2中
- sunionstore my3 mya3 myb3 把 mya3和myb3的並集存儲到集合my3中
2.使用場景:
可使用redis的set數據類型跟蹤一些具備惟一性的數據,好比訪問某一博客的惟一ip地址的信息,對於這種場景,咱們只須要在每次訪問該博客的時候,將訪問者的ip存入到redis當中,set數據類型就會自動保證ip地址的惟一性。還能夠利用set類型服務器端聚合操做的方便高效的特性,來維護數據對象之間的關聯關係。好比購買商品A的用戶id被存入到某一指定set當中,購買商品B的用戶id被存放的另外一個set當中,若此時想查詢哪些用戶同時購買了這兩種商品,只須要使用交集的操做便可
七. 存儲Sorted-Set
1.和Set的相同點:
都是字符串的集合,都不容許出現重複的元素
2.主要區別:
Sorted-Set中每個成員都有一個分數與之關聯,redis經過這個分數將集合中的成員從小到大進行排序。該類型集合中成員必須惟一,但分數沒必要惟一。在該類型集合中進行添加刪除與更新操做都是十分快速的,時間複雜度爲集合中成員個數的對數。Sorted-Set中的成員在集合中的位置是有序的,即便訪問集合中部的成員也是十分高效的。
3.經常使用命令:
a).添加元素
zadd mysort 70 zs 80 ls 90 ww
#分數+元素
#返回添加的元素個數
zadd mysort 100 zs
#若集合中已經存在該元素,則會用新的分數替換原有的分數
#集合中已經有zs 此處返回0
zadd mysort 60 tom
#添加了一個原集合中沒有的元素,返回1
b).得到元素
zscore mysort zs
#得到zs的分數,此處返回100
zcard mysort
#返回集合中成員的數量
c).刪除元素
zrem mysort tom ww
#刪除集合中tom,ww
zcard mysort
#此時返回集合長度爲2
d).範圍查詢
zrange mysort 0 -1
#查出全部元素,由小到大顯示,-1表明最後一個
zrange mysort 0 -1 withscores
#由小到大顯示元素和其相對應的分數
zrevrange mysort 0 -1 withscores
#從大到小顯示
zremrangebyrank mysort 0 4
#按照範圍刪除,把位置從第0個到第4個的都刪掉
zremrangebyscore mysort 80 100
#按分數刪除,把80到100的都刪掉
e).擴展命令
zrangebyscore mysort 0 100
#按分數查詢,查分數從0到100的元素
zrangebyscore mysort 0 100 withscores
#按分數查詢,查分數從0到100的元素,而且帶着分數進行顯示
zrangebyscore mysort 0 100 withscores limit 0 2
##按分數查詢,查分數從0到100的元素,而且帶着分數進行顯示,而且只顯示頭兩條
zincrby mysort 3 ls
#設置指定成員分數增長,此處ls的分數加3
zcount mysort 80 90
#獲取80到90分的元素的個數
4.使用場景:
- 遊戲排名、微博熱點話題等
- 大型在線遊戲積分排行榜,每當遊戲玩家的積分發生變化的時候,能夠執行zadd命令,去更新玩家的分數,再經過zrange命令去獲取用戶積分多少等信息,或者經過zrank命令獲取玩家排行信息
- 構建索引數據
八. keys 的通用操做
- keys * 查詢全部的key
- keys my? ?是一個佔位符,表明一個字符,找出以my開頭,後面還有1位字符的key
- exists [key] 判斷key是否存在,若存在返回1,不存在返回0
- del [key] 刪除my1
- rename [oldkey] [newkey] 將oldkey重命名爲newkey
- expire [key] 1000 設置key的過時時間爲1000秒
- ttl [key] 查看指定key還剩多少時間就會超時,若key沒有設置超時時間,會返回-1
- type [key] 得到指定key的類型,