redis數據類型--個人常規用法
一.String
1.可以容納最高512M的value。
2.經常用於通過expire來實現自動過期的一些值,直接通過setex 來。
3.通過incrby的方式,來實現value值得增長。
4.執行setnx會返回加成後的值來決定誰獲取到了鎖,比如同時往一個空的key寫 setnx key value,哪個線程返回值是1,即為搶到了鎖。
基於以上,則可以實現簡單的分布式鎖:
public void lock(){ if(jedis.setnx("test.lock","1") == 1){ jedis.expire("test.lock",3);//TODO } } public void unlock(){ jedis.del("test.lock"); }
二.hash
hash是一個string類型的field和value的映射表,hash很多操作指令都類似於string類型的指令,經常用於存儲數據。
1.hash 常常用於存儲數據。
2.hash 是 key field value的數據結構,與String相比,更省內存,但是對應自動過期粒度到Key,因此選擇哪種數據結構依賴於需求決定。
三.List
List 簡單就是隊列,一般都是用於做簡單的FIFO隊列。
1.采用rpush key value 把值賽進去,通過lpop把值取出來。
2.如果是一次取出多個可以用另外一種方式減少交互的次數,降低往返的時延。
a.pipeline 降低交互次數。
b.lrange 獲取數據
c.ltrim 移除數據
1 Jedis client = clientManager.getPooledClient(); 2 Pipeline pipeline = client.pipelined(); 3 pipeline.lrange(key,start,end); 4 pipeline.ltrim(key,end + 1, -1); 5 List<Object> rs = pipeline.syncAndReturnAll();6 List<String> result = (List<String>) rs.get(0);
四.Set
Set 就是set,String 類型的無序集合,不允許重復
1.set類型可以簡單通過sadd 判定某個值是否存在,不存在則返回 1,存在返回0.
2.在一些不允許重復值的場景下還是非常好用的。
五.sortedSet
有序集合,默認根據score排序,可使用場景非常多。
1.熱門排序,由於在寫入的時候就根據score排序,因此根據score獲取非常快,但是在寫入時候時間復雜度會相對高些。
2.分布式定時任務,這個當時無意中發現的,再一些時間精度要求沒那麽高的場景時候非常好用。
a.設置定時任務,key score(時間戳) member(定時任務參數)
b.zrangebyscore,獲取某個區間內的任務。返回值是Set<String> 即member的列表
c.zrem key member,根據爭搶有移除到的返回值為1,未移除到的返回值為0,來判斷這個定時任務在哪臺機器上執行。
d.根據具體的member來執行任務
//添加定時任務 jedis.zadd("cronKey",1554739013,"{‘param‘:‘123‘}"); //獲取區間定時任務 Set<String> members = jeids.zrangeByScore("cronKey",0,currentTime); for(String value:members){ if(jedis.zrem("cronKey",value) > 0){ //TODO } }
redis數據類型--個人常規用法