Redis數據結構和經常使用命令

一. 五種數據類型

  1. 字符串(String)——經常使用
  2. 哈希(hash)——經常使用
  3. 字符串列表(list)
  4. 字符串集合(set)
  5. 有序字符串集合(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

  • llen mylist 

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的類型,
相關文章
相關標籤/搜索