1. 程式人生 > >Redis常用資料型別和事物以及併發

Redis常用資料型別和事物以及併發

Redis資料型別

基本型別(String int):

如 set key value 、get key 等 所有命令都是按照 key value

keys * 可以將全部資料列出,其中後面的 " * " 表示資料的匹配。

setnx key value 不覆蓋設定,返回0表示失敗(原來這個key已經有值),返回1表示成功。

setex key time value 設定資料儲存的有效時間(time 單位是秒) 

ttl key 檢視當前資料的有效時間

flushdb 清空倉庫資料。

基本型別適合使用者進行短期的資料儲存

Hash資料型別

其儲存的資料結構為 "key=value"

舉例:儲存一個使用者的使用者名稱、真實姓名、密碼,

hset user-admin username admin   hset user-admin name xiaoming   hset user-admin password 123456

取得使用者名稱)hget user-admin username

取得真實姓名hget user-admin name

取得密碼 hget user-admin password

有了Hash之後 Redis的資料型別可以和JAVA中VO匹配的上(都是key-value格式)

hash型別存在的意義不大,因為基本型別做JSON儲存也可以達到hash的效果

List資料型別

List是一個連結串列結構,連結串列結構的時間複雜度是n

舉例:建立一個List並設定若干個內容。lpush testList  test1 test2 test3(testList是集合的名字,後面的是集合儲存的資料)

進行指定範圍的連結串列資料輸出(連結串列是不能通過index查詢的) lrange testList 0 1 返回 test3 test2 (棧 先進後出)

lrange testList 0 -1表示輸出全部的內容

可以利用List型別實現訊息佇列或者緩衝的功能,在實際開發之中有很多公司可能不直接使用訊息佇列中介軟體,而直接利用Redis代替

Set 資料型別

可以實現集合的比對處理,列如可以實現資料的交集,並集,插集(比如 微博中 共同關注好友,可能關注等。。。)

舉例 sadd user a b c d e(向集合user追加五個元素)

列出所有元素 smembers (set集合無序)

刪除某個元素 srem user a

返回兩個集合的差集合 sdiff set1 set2(返回幾個set1和set2的差集)

儲存差集的執行結果到另一個集合 sdiffstore儲存集合key 集合key1 集合key2

該型別支援集合的運算 可用在相似度檢測,好友推薦等

SortedSet集合

該集合算是Set集合的擴充套件,該集合可以儲存一個分數,這個分數的操作就可以作為資料的統計結果出現

追加有序集合資料:zadd 集合key  分數 內容

資料增長:zincrby 集合key 增長分數 內容

根據分數取得指定範圍的資料 zrangebyscore 集合 開始分數 結束分數 withscores

SotedSet主要進行資料的流式分析(利用分數分析資料,比如一個商品瀏覽了多少次)

Redis事物處理

Redis支援事物處理,但是這種事物處理本身是存在有設計缺陷的。

開啟事物:multi

取消事物:discard

提交事物:exec

支援舉例: Multi ; set i =10; discard;因為取消了事物所以 i的值不會被set成10 所以Redis是支援事物的。

缺陷舉例 :Multi ; set i=10; incr name; exec; 因為 name屬性不是int 所以會出現報錯:ERR Value is not an integer。但是 這種情況i=10;會被正確的執行 存到Redis裡面。

Redis事物不完美也可以說不支援事物,因為Redis設計之初是不考慮事物的。

Redis樂觀鎖

大家都知道Mysql利用版本號欄位實現樂觀鎖。

Redis樂觀鎖的處理比較簡單 利用watch關鍵字監聽redis的一些鍵即可,不需要增加處理列(也就是平時所說的版本號)

事物1 事物2
watch id; 進行該資料的監聽 watch id;
Multi; Multi;
  set id 100
 set id 200; exec;
exec;返回nil,表示本次更新失敗  

此時由於第二個事物更新了原始資料 id,那麼就表示該原始資料上的一個標記列發生了變化(類似於Mysql的版本號),當第一個事物更新的時候,會返回nil表示本次更新失敗。

Redis主從

Redis主從其實是為了資料備份(不同於MySQL  MySQL主從有讀寫分離的功能)。

當資料做出任何處理操作的時候都進行即時的備份,這種設計在Redis裡面叫做主從設計 從伺服器只是做資料備份 除此之外 什麼都不做。常用 一主二從制。

配置(大致說明):

1)主伺服器配置不需要做出任何變化,我不關心你有多少從伺服器

2)編輯redis-->conf下面 redis.conf配置檔案  salveof masterip masterport 

3)在從伺服器上設定 masterauth "主伺服器的密碼"

4) ./redis-server redis.conf 啟動Redsi