Redis實時快取的一點小總結
阿新 • • 發佈:2018-11-20
筆者最近在寫一個關於部落格系統的畢業設計,其中用到了Reis實時快取,對於一個部落格首頁資訊來說,需要分頁展示一些部落格資訊,而這些資訊的變化性不是很大,所以採用Reis實時快取可以有效緩解資料庫訪問壓力;
對於筆者的部落格系統中的Reis實時快取來說,筆者考慮的最佳Redis資料型別是字串和連結串列。
首先來分析下二者的優劣:
字串型別:可以將分頁資料按照“頁數-資料(list集合)”的形式儲存,這樣做的優點在於操作簡單,而缺點也很明顯,如果某篇部落格發生改動,則需要將該頁資料全部取出,修改後再存入,而對於刪除的資料補齊則更加麻煩,假設頁數為10頁,每頁10條資料,那麼第一頁的第一篇部落格刪除的話需要補齊9次資料(第二頁的第一條資料補至第一頁最後一條,第三頁的。。。);
連結串列型別:可以將所有的資料以連結串列形式存入一個key,每次查詢分頁資料按照range方法設定下標範圍來取值,這樣做的優點在於修改資料很靈活,不需要訪問大量資料,而缺點則在於訪問中間位置的資料比較繁瑣(leftPop和rigthPop方法只能首尾刪除,而remove(count,value)方法則可以直接刪除,count代表刪除的值的個數,value代表值,這麼設計的原因是值可以重複);
分析完二者優劣之後開始介紹二者的使用方式:
字串型別:
@Autowired private RedisTemplate redisTemplate; @GetMapping("test1") public Object test1() { // 存值 redisTemplate.opsForValue().set("key",new Object()); // 取值 Object obj=redisTemplate.opsForValue().get("key"); System.out.print(obj); return redisTemplate.toString(); }
連結串列型別:
@GetMapping("test2") public Object test2() { // 將連結串列繫結到一個key,這樣的話不需要每次指定key BoundListOperations listOps = redisTemplate.boundListOps("key_1"); // 右邊插入,相當於尾部插入 listOps.rightPush("張三"); listOps.rightPush("李四"); listOps.rightPush("王五"); // 左邊插入,相當於頭部插入 listOps.leftPush("項羽"); listOps.rightPush("李四"); listOps.rightPush("李四"); // 刪除前2個‘李四’ listOps.remove(2, "李四"); // 根據下標範圍取值,以取出全部資料為例 List list = listOps.range(0, listOps.size() - 1); // 不繫結的情況 // ListOperations listOperations = redisTemplate.opsForList(); // listOperations.rightPush("key_1", "張三"); // listOperations.rightPush("key_1", "李四"); // listOperations.rightPush("key_1", "王五"); // listOperations.leftPush("key_1", "項羽u"); // return "list長度=" + listOperations.size("key_1"); return list; }