因此选择用redis,数据结构:
手机号:验证码code
随机码为token:用户信息(保存为一个Map<String,Object>对象,具体为key与value)
(1) 发送验证码
(2) 短信验证码登录、注册
(3) 校验登录状态 token
(4) 拦截器优化
防止死锁?添加过期时间
什么是误删? 线程1发生了业务阻塞,锁超时释放了自己的锁,后面正常执行业务后,线程1又执行锁释放把线程2的锁给释放了
如何解决?:在释放锁的时候判断锁是否属于自己
判断锁和释放锁是两个不同的动作!需要让判断和释放锁变成一个原子操作
利用lua脚本
不可重入
不可重试
超时释放
主从一致性
redission提出来了MutiLock锁,使用这把锁咱们就不使用主从了,每个节点的地位都是一样的, 这把锁加锁的逻辑需要写入到每一个主丛节点上,只有所有的服务器都写入成功,此时才是加锁成功,假设现在某个节点挂了,那么他去获得锁的时候,只要有一个节点拿不到,都不能算是加锁成功,就保证了加锁的可靠性
SortedSet数据结构 根据时间进行排行的
List<UserDTO> userDTOS = userService.query()
.in("id", ids).last("ORDER BY FIELD(id," + idStr + ")").list()
.stream()
.map(user -> BeanUtil.copyProperties(user, UserDTO.class))
.collect(Collectors.toList());
Bitmap
bitMap返回的数据是10进制
@Override
public Result sign() {
// 1.获取当前登录用户
Long userId = UserHolder.getUser().getId();
// 2.获取日期
LocalDateTime now = LocalDateTime.now();
// 3.拼接key
String keySuffix = now.format(DateTimeFormatter.ofPattern(":yyyyMM"));
String key = USER_SIGN_KEY + userId + keySuffix; //user:sign:5:202302
// 4.获取今天是本月的第几天
int dayOfMonth = now.getDayOfMonth();
// 5.写入Redis SETBIT key offset 1
stringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);
return Result.ok();
}
思路:
bitMap返回的数据是10进制,哪假如说返回一个数字8,那么我哪儿知道到底哪些是0,哪些是1呢?我们只需要让得到的10进制数字和1做与运算就可以了,因为1只有遇见1 才是1,其他数字都是0 ,我们把签到结果和1进行与操作,每与一次,就把签到结果向右移动一位,依次内推,我们就能完成逐个遍历的效果了。
数据结构的选择HyperLogLog
选择的数据结构是set,比如用户1关注了A B C,那么就是 1:A B C
同理对用户2有同样的操作,求共同关注就是求两个set的交集
//设置key:当前登录用户,关注的对象
stringRedisTemplate.opsForSet().add(key, followUserId.toString());
//求交集
Set<String> intersect = stringRedisTemplate.opsForSet().intersect(key, key2);
在保存完探店笔记后,获得到当前笔记的粉丝,然后把数据推送到粉丝的redis中去。按照时间顺序feed,数据结构
@Override
public Result saveBlog(Blog blog) {
// 1.获取登录用户
UserDTO user = UserHolder.getUser();
blog.setUserId(user.getId());
// 2.保存探店笔记
boolean isSuccess = save(blog);
if(!isSuccess){
return Result.fail("新增笔记失败!");
}
// 3.查询笔记作者的所有粉丝 select * from tb_follow where follow_user_id = ?
List<Follow> follows = followService.query().eq("follow_user_id", user.getId()).list();
// 4.推送笔记id给所有粉丝
for (Follow follow : follows) {
// 4.1.获取粉丝id
Long userId = follow.getUserId();
// 4.2.推送
String key = FEED_KEY + userId;
stringRedisTemplate.opsForZSet().add(key, blog.getId().toString(), System.currentTimeMillis());
}
// 5.返回id
return Result.ok(blog.getId());
}
功能二:实现分页查询
思路分析
1、每次查询完成后,我们要分析出查询出数据的最小时间戳,这个值会作为下一次查询的条件
2、我们需要找到与上一次查询相同的查询个数作为偏移量,下次查询时,跳过这些查询过的数据,拿到我们需要的数据
综上:我们的请求参数中就需要携带 lastId:上一次查询的最小时间戳 和偏移量这两个参数。
这两个参数第一次会由前端来指定,以后的查询就根据后台结果作为条件,再次传递到后台。
文章浏览阅读2w次,点赞284次,收藏328次。撤销已经add,但是没有commit的问题git reset HEAD撤销已经commit,但是没有push到远端的文件(仅撤销commit 保留add操作)git reset --soft HEAD^查看状态查看没有git add的文件git checkout 查看当前提交状态git status......_git 取消add
文章浏览阅读4.3k次,点赞10次,收藏113次。西南交通大学电气学院电子信息工程专业课----微机原理知识点总结,含部分习题。讨论基于8086/8088的CPU及系统结构,汇编语言基础编程_微机原理
文章浏览阅读1.8w次,点赞3次,收藏18次。解决H5应用中存在Vuex中的数据在刷新页面后丢失_uniapp vuex持久化
文章浏览阅读7k次,点赞4次,收藏24次。1.html文件先引入vue.js再引入httpVueLoader.js注册httpVueLoader。在script中Vue.use(httpVueLoader);在components中注册组件,httpVueLoader的注册方式有好几种,具体引用方式看个人习惯,更多的可以去看httpVueLoader官网:https://www.npmjs.com/package/http-vue-loader;<!DOCTYPE html><html lang="en_html引入vue
文章浏览阅读366次。本文介绍camera dtsi配置相关内容。参考平台:qcom sdm660_高通 cci
文章浏览阅读1.2k次。python内置数据集Python modules containing built-in datasets and ways to access them 包含内置数据集的Python模块及其访问方式 Built-in datasets prove to be very useful when it comes to practicing ML algorithms and you are i..._python内置数据集
文章浏览阅读846次,点赞18次,收藏12次。作为一名热爱音乐的资深用户,我体验过众多品牌的开放式耳机,希望通过我的评测,能够帮助大家找到最适合自己的耳机。不过,在中高频方面,耳机的表现略显刺耳,音质和音量可能不尽如人意,这可能会对用户的整体听觉体验产生一定影响。不过,延迟性相对较高,对于需要实时音视频同步的场景,如追剧或游戏,可能不太适合,存在明显的延迟问题。然而,在使用这项技术的耳机时,尤其是在游戏过程中,可能会遇到较高的延迟问题,这可能导致音画不同步的现象更加明显。然而,在剧烈运动时,耳机的稳固性可能需要加强,以避免因动作过大而导致脱落。
文章浏览阅读3.8k次,点赞6次,收藏24次。在多标签分类的问题中,模型的训练集由实例组成,每个实例可以被分配多个类别,表示为一组目标标签,最终任务是准确预测测试数据的标签集。例如:文本可以同时涉及宗教、政治、金融或教育,也可以不属于其中任何一个。电影按其抽象内容可分为动作片、喜剧片和浪漫片。电影有可能属于多种类型,比如周星驰的《大话西游》,同时属于浪漫片与喜剧片。多标签和多分类有什么区别?在多分类中,每个样本被分配到一个且只有一个标签:水果..._tensorflow bert
文章浏览阅读6.1k次,点赞4次,收藏29次。jupyter notebook 常用快捷键及编辑语法jupyter 单元格有两种模式:命令模式(蓝色标签)和编辑模式(绿色标签)。点击单元格外可进入命令模式,点击单元格内进入编辑模式。编辑模式又分为code模式(单元格外有 ‘In [ ]’)即写代码模式和markdown模式(无‘In [ ]’)即写文档模式。一、快捷键根据jupyter单元格所处模式不同,快捷键可分为两类:具体可在jupyter文件编辑界面的‘HELP’选项中查看,这里列出本人认为较为常用的几个。命令模式下的快捷键:_jupyter notebook怎么换行
文章浏览阅读89次。教材编者,请多点儿“钻研”精神——《计算机程序设计艺术》一书带来的启示 苏运霖 《计算机程序设计艺术》这本关于算法分析的多卷论著已长期被公认为经典计算机科学的定义性描述。近期在翻译该书的第1卷第1版的过程中,我深刻体会到国外作者在教材编写上的“执着”,主要表现在以下三方面: 一是勤于创新。该书作者Donald E. Knuth曾开拓了以多卷书的形式来系统介绍“计算机程序设计艺术”的创举,现在又以分..._教材编写中编者主要贡献有哪些
文章浏览阅读3.9k次。MySQL如何更改数据库名字_mysql update数据库名称
文章浏览阅读9w次,点赞24次,收藏65次。windows上最好用的文件管理软件 Directory Opuswindows 自带的文件管理软件就不用提了,垃圾的一比。而市面上比较流行的文件管理软件 xyploer,total commander 之类我都使用过,其中 total commander 的确是神器,但是界面太难看,还有学习路径比较陡峭,最后还是放弃了。后来我使用了 windows 上的资源管理器增强软件 clover 感觉..._directory ops