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