筆者最近在寫一個關於博客系統的畢業設計,其中用到了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;
}