项目地址

前端地址
后端地址

此项目的几个重点
1、缓存击穿、缓存雪崩、缓存穿透的解决方案

2、全局唯一id实现方案

雪花算法,原理这里就不说了,直接上代码

package com.rd.utils;import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.Random;// 雪花算法
public class SnowflakeIdWorker {/** 时间部分所占长度 */private static final int TIME_LEN = 41;/** 数据中心id所占长度 */private static final int DATA_LEN = 5;/** 机器id所占长度 */private static final int WORK_LEN = 5;/** 毫秒内存序列所占长度 */private static final int SEQ_LEN = 12;/** 定义起始时间2020-07-27 (秒数)*/private static final long START_TIME = 1595835560497L;/** 上次生成ID的时间戳 */private static long LAST_TIME_STAMP = -1L;/** 时间部分向左移动的位数 22 */private static final int TIME_LEFT_BIT = 64 - 1 - TIME_LEN;/** 自动获取数据中心id(可以手动定义0-31之间的数) */private static final long DATA_ID = getDataId();/** 自动机器id(可以手动定义0-31之间的数) */private static final long WORK_ID = getWorkId();/** 数据中心id最大值 31 */private static final int DATA_MAX_NUM = ~(-1 << DATA_LEN);/** 机器id最大值 31 */private static final int WORK_MAX_NUM = ~(-1 << WORK_LEN);/** 随机获取数据中心id的参数 32 */private static final int DATA_RANDOM = DATA_MAX_NUM + 1;/** 随机获取机器id的参数 32 */private static final int WORK_RANDOM = WORK_MAX_NUM + 1;/** 数据中心id左移位数 17 */private static final int DATA_LEFT_BIT = TIME_LEFT_BIT - DATA_LEN;/** 机器id左移位数 12 */private static final int WORK_LEFT_BIT = DATA_LEFT_BIT - WORK_LEN;/** 上一次毫秒内存序列值 */private static long LAST_SEQ = 0L;/** 毫秒内存列的最大值 4095 */private static final long SEQ_MAX_NUM = ~(-1 << SEQ_LEN);/*** 获取字符串S的字节数组,然后将数组的元素相加,对(max+1)取余* @param s 本地机器的hostName/hostAddress* @param max 机房/机器的id最大值* @return*/private static int getHostId(String s, int max) {byte[] bytes = s.getBytes();int sums = 0;for (int b : bytes) {sums += b;}return sums % (max + 1);}/*** 根据 host address 取余, 发送异常就返回 0-31 之间的随机数* @return 机器ID*/private static int getWorkId() {try {return getHostId(Inet4Address.getLocalHost().getHostAddress(), WORK_MAX_NUM);} catch (UnknownHostException e) {return new Random().nextInt(WORK_RANDOM);}}/*** 根据 host name 取余, 发送异常就返回 0-31 之间的随机数* @return 机房ID(数据中心ID)*/private static int getDataId() {try{return getHostId(Inet4Address.getLocalHost().getHostName(), DATA_MAX_NUM);}catch(Exception e){return new Random().nextInt(DATA_RANDOM);}}/*** 获取下一不同毫秒的时间戳* @param lastMillis* @return 下一毫秒的时间戳*/private static long nextMillis(long lastMillis) {long now = System.currentTimeMillis();while (now <= lastMillis) {now = System.currentTimeMillis();}return now;}/*** 核心算法,需要加锁保证并发安全* @return 返回唯一ID*/public synchronized static long getUUID() {long now = System.currentTimeMillis();// 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过,此时因抛出异常if (now < LAST_TIME_STAMP) {throw new RuntimeException(String.format("系统时间错误! %d 毫秒内拒绝生成雪花ID", START_TIME));}// 如果是同一时间生成的,则进行毫秒内序列if (now == LAST_TIME_STAMP) {LAST_SEQ = (LAST_SEQ + 1) & SEQ_MAX_NUM;// 若序列溢出if (LAST_SEQ == 0) {// 阻塞到下一个毫秒,获得新的时间戳now = nextMillis(LAST_TIME_STAMP);}// 时间戳改变,序列重置} else {LAST_SEQ = 0;}// 上次生成ID的时间戳LAST_TIME_STAMP = now;// 通过移位和或操作将时间戳、工作机器id、序列号拼接起来return ((now - START_TIME) << TIME_LEFT_BIT | (DATA_ID << DATA_LEFT_BIT) | (WORK_ID << WORK_LEFT_BIT) | LAST_SEQ);}/*** 主函数测试* @param args*/public static void main(String[] args) {long start = System.currentTimeMillis();int num = 10000;for (int i = 0; i < num; i++) {System.out.println(getUUID());}long end = System.currentTimeMillis();System.out.println("共生成 " + num + " 个ID,用时 " + (end - start) + " 毫秒");}
}

redis id生成策略

@Component
public class RedisIdWorker {// 开始时间戳 (以某个时间段)private static final long BEGIN_TIMESTAMP = 1640995200L;@AutowiredStringRedisTemplate stringRedisTemplate;public long nextId(String keyPrefix){// 1、生成时间戳//1.1、获取当前时间秒数LocalDateTime now = LocalDateTime.now();long nowSeconds = now.toEpochSecond(ZoneOffset.UTC);//1.1、获取当前时间戳long curTimestamp = nowSeconds - BEGIN_TIMESTAMP;// 2、生成序列号String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));// 该key的值自增long incr = stringRedisTemplate.opsForValue().increment("incr:" + keyPrefix + ":" + date);///3、拼接并返回// curTimestamp 左移 32 ,这样空出32位// 然后在 或上 incr ,这样得到64位IDreturn curTimestamp << 32 | incr;}public static void main(String[] args) {// 2022-1-1 至今的秒数LocalDateTime time = LocalDateTime.of(2022,1,1,0,0,0);long seconds = time.toEpochSecond(ZoneOffset.UTC);System.out.println(seconds);}
}

3、库存超卖问题
4、并发下线程安全问题
5、分布式锁及lua脚本
6、异步秒杀
7、redis消息队列
8、feed流
9、geo数据结构
10、bitmap数据结构
11、滚动分页

黑马redis这门课的这个老师讲得很好,强烈推荐

b站视频地址:https://www.bilibili.com/video/BV1cr4y1671t?spm_id_from=333.337.search-card.all.click

springboot+redis实战项目——黑马点评相关推荐

  1. 【Redis】Redis实战:黑马点评之优惠券秒杀

    Redis实战:黑马点评之优惠券秒杀 1 全局唯一ID 1.1全局唯一ID 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据 ...

  2. Iris+Redis实战项目应用

    目录 一.项目结构 二.服务器配置 1.Redis在配置文件中的配置情况如下:config.json 2.读取配置文件初始化服务器配置:config.go 3.Redis连接对象实例化:redis.g ...

  3. 【Java项目推荐】值得写到简历上的项目--黑马点评

    优惠卷秒杀 前言 优惠券秒杀 实现优惠券秒杀下单 超卖问题 一人一单 分布式锁 redis中加锁的一些特殊情况 手动实现分布式锁 分布式锁误删情况1 分布式锁误删情况2 lua脚本解决多条命令的原子性 ...

  4. Redis消息队列 | 黑马点评

    目录 一.认识消息队列 二.List模拟消息队列 三.PubSub的消息队列 四.Stream的消息队列(重点) 1.单消费模式 2.消费者组 五.redis三种消息队列对比 六.优化秒杀实战 1.创 ...

  5. springboot+veu实战项目-天猫整站

    目录 天猫整站 Springboot 一:技术准备 二:开发流程 三:本地演示 1 : 下载并运行 2 : 访问地址 3 : nginx 4 : nginx.conf 配置文件 5 : 启动nginx ...

  6. SpringBoot入门实战项目各阶段目录

    场景 项目搭建专栏: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/column/info/35688 实现 1.Eclipse中新建SpringBoot项目并输 ...

  7. Redis分布式锁 | 黑马点评

    目录 一.分布式锁概述 二.基于Redis的分布式锁 1.思路分析 2.初级版本 3.误删问题 4.改进分布式锁 5.原子性问题 6.使用Lua脚本解决原子性问题 7.setnx实现分布式锁存在问题 ...

  8. Redis优惠券秒杀 | 黑马点评

    目录 一.全局唯一ID 1.全局ID生成器 二.实现秒杀下单 1.基本的下单功能 2.超卖问题 3.乐观锁解决并发问题 三.实现一人一单 1.思路分析 2.代码初步实现 3.关于锁的范围 4.关于事务 ...

  9. 项目前期准备 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(一)

    文章目录 前言 一.导学内容 1.前置知识(必备) 2.博客收获 3.效果展示 4.软件开发流程整体介绍 4.瑞吉外卖整体项目介绍 二.开发环境搭建 1.数据库环境搭建 2.maven环境搭建 总结 ...

最新文章

  1. 原来这才是 Kafka!(多图+深入)
  2. 数据蒋堂 | Hadoop - 一把杀鸡用的牛刀
  3. 预处理器预处理变量头文件保护条件编译
  4. C#高级编程9 第17章 使用VS2013-C#特性
  5. DUBBO 使用问题记录
  6. 移动硬盘提示无法访问设备硬件出现致命错误,导致请求失败的资料寻回方案
  7. 计算机支持的游戏化教学,初中信息技术教学中游戏化教学的应用探究
  8. 安卓学习笔记12:安卓按键事件
  9. iPhone SE 3共有三款:或将提供全面屏版本
  10. pandas合并数据集-【老鱼学pandas】
  11. Java 四种权限修饰符
  12. windows服务定时重启软件的实现
  13. java 省市县数据_Jsoup获取全国地区数据(省市县镇村)
  14. Tesla M40 24G 在Win11上的双显卡显示实现、改风冷
  15. Q3净利润同比涨超313%,金山办公为何不能松懈?
  16. Flink容错机制(一)
  17. ndoutils2.2.0(ndo2db)中文乱码问题解决
  18. Kibana坐标地图example
  19. 【计算机图形学】壹 · 光栅图形学之直线段的扫描转换算法
  20. Resetting first dirty offset of __consumer_offsets

热门文章

  1. 再见极域(Python水水水)
  2. 视频监控分辨率CIF、DCIF、D1格式的简介
  3. 一文详解 HTTP 协议
  4. 老罗笔记人工智能文字处理软件 Rogabet Notepad v1.5-2023-616
  5. 区块链中的密码学系列之SHA256算法(三)
  6. 如何设计一套完整的订单系统,或者完整的业务流程?
  7. VC++中播放声音wav
  8. kettle下载百度网盘地址含入门教程
  9. 基于java MySQL 毕业设计 超市进销存系统
  10. 【BCH码3】BCH码的彼得森译码原理详解及MATLAB实现(不使用MATLAB库函数『需要完整代码请先私信』)