SpringBoot进阶-Redis数据类型及应用场景(三)
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);
相关文章
- springboot+shiro+redis(单机redis版)整合教程
- 【Redis】yum安装redis
- SpringBoot之整合Redis分析和实现-基于Spring Boot2.0.2版本
- springboot整合redis
- Redis 持久化问题定位与优化
- 【SpringBoot笔记22】SpringBoot框架集成Redis数据库
- 【项目实战】Redis的序列化与反序列化
- 【SpringBoot系列】Spring Boot+Redis 分布式锁:模拟抢单
- 【SpringBoot系列】最详细demo-- 集成Redis数据库
- 〖Python 数据库开发实战 - Python与Redis交互篇⑦〗- 利用 redis-py 实现缓存学生考试信息
- 〖Python 数据库开发实战 - Python与Redis交互篇⑧〗- 利用 redis-py 实现缓存观众投票数据信息案例
- 〖Python 数据库开发实战 - Python与Redis交互篇⑪〗- 综合案例 - 新闻管理系统 - 缓存新闻数据至redis
- 平衡树:为什么Redis内部实现用跳跃表
- Redis的安装以及在项目中使用Redis的一些总结和体会
- redis_05 _ 内存快照:宕机后,Redis如何实现快速恢复
- Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析
- redis设置密码(redis-cli)
- 【服务器安装Redis】Centos7离线安装redis
- Docker 实践经验:Docker上部署 redis 三主三从集群