第五節 唯一性與無序性的好朋友Set

2021-10-02 21:23:47 字數 1343 閱讀 2496

redis 的 set 是 string 型別的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的資料。從實際業務角度來考慮其應用場景。首先,set它是乙個集合,自然能夠存放多個物件。多個物件之間各不相同,另外存放的順序也是不固定的。

典型的應用場景就是來做唯一性校驗。如果某張表有個字段是唯一的,例如使用者繫結的**號碼,那麼在插入這張表之前,需要校驗插入的**號碼是否已經與資料庫中已經有的資料出現重複。

另外乙個無序性的特點的典型應用場景是隨機返回乙個資料。例如隨機展示你感興趣的歌曲、隨機展示問卷調查資料、遊戲裡隨機的防掛機的驗證題目等等等等。只要是隨機的,都可以考慮redis的set這種資料型別。

註冊的時候,要求郵箱號不能重複。下面是具體的業務邏輯。

先檢查email在不在快取裡面,

如果在快取裡面,說明已經被註冊,拋異常

如果不在快取裡面 ,則查詢資料庫

如果在資料庫裡面,說明已經被註冊,拋異常

如果不在資料庫裡面,插入資料庫

插入成功,則加入快取。 

插入失敗,則拋異常,事務回滾

public integer registeruser(muser user) 

//查詢資料庫

if (userindb != null && userindb.getid() > 0) else else }}

private setoperationsgetsetoperations()

上面的例子展示了校驗註冊使用者的郵箱。

下面的例子是,隨機返回乙個使用者資料。業務場景很簡單,就是把所有使用者的資料存放到redis的set中,每次隨機返回乙個,並且返回的使用者資料從set中刪除。如果set中的所有使用者資料都被刪除了,那麼就再重新查詢所有使用者資料,並把它們加入到redis的set中。

初始化快取資料是新增操作,返回使用者資料是刪除操作。這兩步操作在同乙個方法裡,因此這個方法是可能出現執行緒安全問題的。所以編寫方法的時候需要考慮執行緒安全問題,為方法加鎖就能解決。

業務邏輯:

從快取中取隨機乙個使用者資料

如果有使用者資料,則返回

如果沒有使用者資料,則查詢所有使用者資料並加入快取中。再拿一次快取使用者資料。

public synchronized muser randomuser() 

//取出隨機一條快取中的使用者資料

user = getusersetoperations().pop(constant.user_random_key);

}return user;

}

跟著大宇學redis--------目錄帖

第五節 web爬蟲之urllib(一)

一 urllib.request.urlopen url,data none,timeout,cafile none,capath none,cadefault false,context none 簡介 urllib.request.urlopen 函式用於實現對目標url的訪問 引數詳解 url...

主鍵與唯一性索引

其實指定列的索引就相當於對指定的列進行排序,為什麼要排序呢?因為排序有利於對該列的查詢,可以大大增加查詢效率。那麼可能有人認為應該對所有的列排序,這樣就可以增加整個資料庫的查詢效率?這樣的想法是錯誤的,原因是建立索引也是要消耗系統資源的,給每個表裡的每個列都建立索引那麼將對系統造成極大的負擔,那就更...

主鍵與唯一性索引

其實指定列的索引就相當於對指定的列進行排序,為什麼要排序呢?因為排序有利於對該列的查詢,可以大大增加查詢效率。那麼可能有人認為應該對所有的列排序,這樣就可以增加整個資料庫的查詢效率?這樣的想法是錯誤的,原因是建立索引也是要消耗系統資源的,給每個表裡的每個列都建立索引那麼將對系統造成極大的負擔,那就更...