redis入門到精通系列(一):入門redis看這一篇就夠了

(一)爲什麼要用Nosql

如果你是計算機本科學生 ,那麼一定使用過關係型數據庫mysql。在請求量小的情況下,使用mysql不會有任何問題,但是一旦同時有成千上萬個請求同時來訪問系統時,就會出現卡頓甚至系統崩潰的情況。最典型的例子就是早期的12306購票網站,一旦到了購票高峯期,12306肯定崩潰。造成這個原因的罪魁禍首就是關係型數據庫

關係型數據庫存在兩個問題

1.性能:磁盤IO性能低下

2.擴展性:數據關係複雜,擴展性差,不利於大規模集羣

爲了解決這兩個問題,非關係型數據庫出現了,非關係型數據庫有兩個特點:

1.內存存儲 :解決磁盤IO性能低的問題

2.不存儲關係,只存儲數據  : 解決數據關係複雜的問題

而redis就是常見的一種非關係型數據庫。

(二)redis介紹

Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫,他有如下幾個特徵:

1.數據間沒有必然的聯繫

2.內部採用單線程機制工作

3.性能高,支持每秒十幾萬次的讀寫操作

4.多數據類型支持:字符串類型(string)、列表類型(list)、散列類型(hash)、集合類型(set)、有序集合類型(sorted_set)

5.持久化支持

Redis的應用場景也非常廣泛,如熱點新聞、購票搶票、即時信息查詢、時效性信息控制、消息隊列、分佈式鎖等等。

(三)redis數據類型操作

介紹完nosql和redis後就開始正式操作redis了,確保你此時已經下載安裝redis服務,並且已經打開服務。

3.1 string類型

添加/修改數據

set key value

獲取數據(若爲空,則返回nil)

get key

刪除數據(返回1代表成功,0代表失敗)

del key

 

 添加修改多個數據

mset key1 value1 key2 value2 ...

獲取多個數據

mget key1 key2...

獲取字符串的長度

strlen key

追加信息到原始信息之後

append key value

多操作指令看上去似乎是對單操作指令的簡單相加,但其實不然。一條指令執行有三個地方需要耗時:發送指令、處理指令、返回結果。當使用多操作指令的時候,發送和返回都只執行一次,相比較多次只從單操作指令減少了大筆時間。

設置數值增加

incr key 
incrby key increment 
incrbtfloat key increment

設置數值減少

decr key 
decrby key increment

設置數據具有指定的生命週期(用於秒殺等有時間限制的場景)

setex key seconds value 
psetex key milliseconds value

以上就是string類型的語法操作,對於key值的命名規範也有指定的約定,比如對於一個微博大V的粉絲數,微博數,關注數可以用下面的方法命名:

user:id:123456:fans 
user:id:123456:blogs
user:id:123456:focus

3.2hash類型

hash類型主要用於在一個存儲空間內保存多個鍵值對信息。比如上面微博的三項基本數據,如果按照上面的方式就需要三條數據,這裏就可以中hash存儲。

添加/修改數據

hset key field value

獲取數據

hget key field 
hgetall key

刪除數據

hdel key field

添加/修改多個數據

hmset key field1 value1 field2 value2...

獲取多個數據

hmget key field1 field2

獲取哈希表中字段的數量

hlen key

獲取哈希表中是否存在指定的字段

hexists key field

獲取哈希表中所有的字段名或字段值

hkeys key
hvals key

設置指定字段的數值增加

hincrby key field increment
hincrbyfloat key field increment

hash類型的操作至此也結束了,需要注意的是,hash類型下的value只能存儲字符串,不允許存儲其他數據類型,不存在嵌套現象。每個hash可以存儲2^32-1個鍵值對。

3.3 list類型

list類型數據用於存儲多個數據,並對數據進入存儲空間的順序進行區分。list類型的數據可以保存多個數據,底層使用雙向鏈表存儲結構實現。

既然是雙向鏈表的方式實現,那麼就可以從左右兩邊添加和修改數據,下面是具體操作

添加/修改數據

lpush key value1 value2...
rpush key value1 value2...

獲取數據

lrange key start stop (stop=-1時表示最後一個元素)
lindex key index
llen key

獲取並刪除數據

lpop key
rpop key

規定時間內獲取並移除數據

blpop key1 key2 timeout
brpop key1 key2 timeout

這條命令的意思是當列表中沒有元素時,會等待timeout指定的時間,期間一旦有數據加入到List列表中,就會顯示出來,否則時間到了後就顯示爲空。

移除指定數據

lrem key count value

3.4 set類型

set類型與hash存儲結構完全相同,不同點在於,set僅存儲鍵,不存儲值,並且值不允許爲空。

set類型可以存儲大量數據,在查詢方面提供更高的效率。

添加數據

sadd key member1 member2...

獲取全部數據

smembers key

刪除數據

srem key member1 member2...

獲取集和數據總量

scard key

判斷集合中是否包含指定數據(1表示包含,0表示不包含)

sismember key member

隨機獲取集合中指定數量的數據

srandmember key [count]

隨機獲取集合中的某個數據並將該數據移出集合

spop key

求兩個集合的交併差集

sinter key1 key2 ..
sunion key1 key2 ..
sdiff key1 key2 ..

求兩個集合的交併差集並存儲到指定集合中

sinterstore destination key1 key2 ..
sunionstore destination key1 key2 ..
sdiffstore destination key1 key2 ..

將指定數據從原始集合中移動到目標集合中

smove source destination member

set的操作到這裏就結束了,要注意set類型的數據不允許重複,且set雖然與hash存儲結構相同,但是無法啓用hash中的存儲空間

3.5 sorted_set類型

sorted_set在set的基礎上添加了可排序字段,使得存儲可按可排序字段來排序,這個可排序字段稱爲score。

添加數據

zadd key score1 member1 score2 member2 ...

獲取全部數據

zrange key start stop [withscores]
zrevrange key start stop [withscores]

刪除數據

zrem key member1 member2...

按條件獲取數據(limit用來限制查詢結果的數量)

zrangebyscore key min max [withscores] [limit]
zrevrangebyscore key max min [withscores]

條件刪除數據

zremrangebyrank key start stop
zremrangebyscore key min max

獲取集合數據總量

zcard key
zcount key min max

集合並交操作

zinterstore destination numkeys key1 key2...(求交集,默認求出score的和,可以修改爲最大值最小值等等)
zunionstore destination numkeys key1 key2...

(四)總結

至此,五種數據類型的基本操作就結束了,當然redis的操作並不止這些,剩下的等用到的時候查閱相關文檔即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章