笔者最近在写一个关于博客系统的毕业设计,其中用到了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;
}