Redis实战项目(三)
本篇博客总结了我在学习redis中做的实战项目,实现了网红探店、好友关注、附近商铺和用户签到功能,其中业务部分代码和注释都是我手敲的,前端代码和图片来自黑马程序员虽然这个项目已经烂大街,但是对于学习项目开发和redis来说仍是一份不错的教材,感谢黑马程序员课程链接:https://www.bilibili.com/video/BV1cr4y1671t?p=1&vd_source=40ac0553f204ea9791dc385431e71f1c
网红探店查看探店笔记
在BlogController中创建:
1234@GetMapping("/{id}")public Result queryBlogById(@PathVariable("id") Long id) { return blogService.queryBlogById(id);}
在service包下实现queryBlogById方法
123456789101112131415161718@Overridepublic Re ...
Redis实战项目(二)
本篇博客总结了我在学习redis中做的实战项目,实现了优惠券秒杀功能,并用分布式锁、消息队列等对其进行了优化,其中业务部分代码和注释都是我手敲的,前端代码和图片来自黑马程序员虽然这个项目已经烂大街,但是对于学习项目开发和redis来说仍是一份不错的教材,感谢黑马程序员课程链接:https://www.bilibili.com/video/BV1cr4y1671t?p=1&vd_source=40ac0553f204ea9791dc385431e71f1c
redis实现全局唯一id不使用id自增的原因:
id规律性太明显,暴露信息
受单表数据量的限制
分布式系统中不能保证唯一性
全局ID生成器:ID组成部分:
符号位:1bit,永远为0
时间戳:31bit,可以使用69年
序列号:32bit,秒内计数器,支持每秒产生2^32个不同ID
代码实现:
123456789101112131415161718192021222324252627282930@Componentpublic class RedisIdWorker { //开始时间戳 ...
Redis实战项目(一)
本篇博客总结了我在学习redis中做的实战项目,实现了短信登录和添加缓存,并对缓存使用时出现的各种问题做了总结,其中业务部分代码和注释都是我手敲的,前端代码和图片来自黑马程序员虽然这个项目已经烂大街,但是对于学习项目开发和redis来说仍是一份不错的教材,感谢黑马程序员课程链接:https://www.bilibili.com/video/BV1cr4y1671t?p=1&vd_source=40ac0553f204ea9791dc385431e71f1c
项目结构:
短信登录功能基于session实现发送手机验证码
实现流程:
代码实现:
1234567891011121314151617181920212223242526272829303132333435363738394041/** * Controller包下 * 发送手机验证码 */@PostMapping("code")public Result sendCode(@RequestParam("phone") String phone, HttpSession ses ...
Redis实战项目-数据库设计
用户表123456789101112DROP TABLE IF EXISTS `tb_user`;CREATE TABLE `tb_user` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '手机号码', `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码,加密存储', `nick_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '昵称, ...
刷题笔记之动态规划(三)
打家劫舍LeetCode 198. 打家劫舍LeetCode题目链接动态规划五部曲:
确定dp数组以及下标的含义dp[i]: 考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]
确定递推公式分为两种情况:不偷i房间:dp[i] = dp[i - 1],即保持上一次的状态。偷i房间: dp[i] = dp[i - 2] + nums[i]。那不偷i房间就一定会偷i - 1房间吗?这里我们对dp数组的定义就很关键,考虑下标i(包括i)以内的房屋,并不是一定会偷i房间,到底偷不偷由递推公式推导得出。所以状态转移方程为:dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
dp数组初始化因为递推公式中有dp[i - 1]和dp[i - 2],所以应当初始化dp[0]和dp[1]。
12dp[0] = nums[0];//考虑0号房间,最多可以偷窃的金额为nums[0]dp[1] = Math.max(nums[0], nums[1]);//考虑1号(包括1号)以内的房屋,最多可以偷窃的金额选最大
确定遍历顺序 ...
刷题笔记之动态规划(二)
在动态规划(一)中我已经列出了动态规划五部曲,这里不再赘述,本篇博客主要总结动态规划中的背包问腿。
0-1背包理论基础有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。举个简单的例子:背包的最大重量为4。物品为:
物品
重量
价值
物品0
1
15
物品1
3
20
物品2
4
30
问背包能背的物品最大价值是多少?
二维dp数组01背包动态规划五部曲:
确定dp数组以及下标的含义do[i][j]: 从下标为[0-i]的物品中任取,放进容量为j的背包,价值总和为dp[i][j]
确定递推公式两种情况:1.不放物品i:dp[i][j] = dp[i - 1][j];由上式推出,背包容量为j,不放物品i的价值就是dp[i - 1][j]2.放入物品i: dp[i][j] = dp[i - 1][j - weight[i]] + value[i];与不放物品i不同的是,此时背包容量已经减去了物品i的重量,即j - weight[i],那当然要 ...