zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

SpringBoot进阶-Redis数据类型及应用场景(三)

RedisSpringBoot应用 进阶 场景 数据类型
2023-09-11 14:16:57 时间

List类型

list类型对实现队列类场景很有用,像订阅列表,消息列表。比如我订阅了A,B,C三个人,这三个作者只要发布文章就可以放入我的订阅列表,方便查询

首先把文章放入订阅列表

//在列表左侧加入一个元素,返回列表长度
redisTemplate.opsForList().leftPush("myList", "文章A");
redisTemplate.opsForList().leftPush("myList", "文章B");
redisTemplate.opsForList().leftPush("myList", "文章C");
redisTemplate.opsForList().leftPush("myList", "文章D");

再分页读取

int page = 1; //第几页
int pageSize = 2; //每页几条数据
int start = (page - 1) * pageSize; //start从0开始
int end = start + pageSize - 1; //end是闭区间
List list = redisTemplate.opsForList().range("myList", start, end);
list.stream().forEach(System.out::println);

订阅列表不会无限长,比如列表中只能保存4篇文章,如果新加入文章后超过4篇,则删除最老的文章

//放入新文章,返回列表长度
long len = redisTemplate.opsForList().leftPush("myList", "文章E");
if (len > 4) {
    //如果列表长度大于4,则删掉右边最后一个
    redisTemplate.opsForList().rightPop("myList");
}

有的人会说,这个mysql也能实现,为啥要用redis的,确实,并发量不大的情况下用啥都无所谓,但想象一个场景,有个热门作者,有一万用户订阅,文章一发布,瞬间就要往数据库插入一万条记录,不卡死才怪,而redis单机QPS就能达到8w-10w,还有redis cluster可以水平扩展其性能,这时redis的优势就体现出来了。所以说多数据源架构设计能力是高级程序员的必备技能,而不要只满足于做CRUD工程师.

Set类型

set的特点是无序,不重复的集合。

抽奖案例

用户可以参与抽奖,可以显示参与的用户数,可以从中随机抽取N个人

//参与抽奖,返回新加入人数,会过滤重复值
redisTemplate.opsForSet().add("set1", "柯南", "毛利兰", "灰原哀", "小五郎", "阿笠博士");
//获取参与人数
long count = redisTemplate.opsForSet().size("set1");
System.out.println(count);
//随机抽取两名成员,原有集合中不会删除抽中的成员,就是说可以继续抽奖
List list = redisTemplate.opsForSet().randomMembers("set1", 2);
list.stream().forEach(System.out::println);
//随机抽取两名成员,会删除抽中的成员,就是说不可以继续抽奖
list = redisTemplate.opsForSet().pop("set1", 2);
list.stream().forEach(System.out::println);

朋友圈点赞案例

//判断是否已点赞,没有点赞则点赞,已点赞则取消点赞
String user = "柯南";
if (redisTemplate.opsForSet().isMember("set2", user)) {
    //已点赞,取消点赞
    redisTemplate.opsForSet().remove("set2", user);
} else {
    //未点赞,添加点赞
    redisTemplate.opsForSet().add("set2", user);
}
//点赞统计
long count = redisTemplate.opsForSet().size("set2");
System.out.println(count);
//显示所有点赞用户
Set set = redisTemplate.opsForSet().members("set2");
set.stream().forEach(System.out::println);

共同关注案例

set类型可以做集合的交集,并集,差集操作,如实现微博的共同关注功能

//我关注的人
redisTemplate.opsForSet().add("set3", "柯南", "毛利兰", "灰原哀", "小五郎");
//他关注的人
redisTemplate.opsForSet().add("set4", "灰原哀", "小五郎", "阿笠博士");
//返回两个集合的交集,也就是共同关注
Set set = redisTemplate.opsForSet().intersect("set3", "set4");
set.stream().forEach(System.out::println);