当前位置: 首页 > wzjs >正文

html5网站价格沪深300指数怎么买

html5网站价格,沪深300指数怎么买,wordpress自定义文章模板插件,沃尔玛网上商城app官方下载用 Spring Boot Redis 实现哔哩哔哩弹幕系统 支持:历史弹幕 实时弹幕 敏感词过滤 限频 持久化 🧩 项目功能总览 功能模块技术实现🎞 历史弹幕Redis List 存储,按时间排序展示📡 实时弹幕WebSocket 双向通信 广…

用 Spring Boot + Redis 实现哔哩哔哩弹幕系统

支持:历史弹幕 + 实时弹幕 + 敏感词过滤 + 限频 + 持久化


🧩 项目功能总览

功能模块技术实现
🎞 历史弹幕Redis List 存储,按时间排序展示
📡 实时弹幕WebSocket 双向通信 + 广播
🚫 敏感词过滤Redis Set 管理敏感词,系统提醒用户
🚦 弹幕防刷限频Redis 键限速,每人 2 秒 1 条
📦 持久化存储Redis 弹幕每 30 秒批量写入 MySQL
🧑‍💼 管理接口敏感词添加/删除/查看 REST 接口

🧱 技术栈

层级技术说明
后端Spring Boot主体开发框架
通信WebSocket实时弹幕传输
缓存Redis弹幕缓存、限频控制
数据库MySQL弹幕历史存储
前端HTML + JS视频播放 + 弹幕显示

🗃️ 弹幕数据模型(MySQL)

CREATE TABLE danmu (id BIGINT AUTO_INCREMENT PRIMARY KEY,video_id BIGINT NOT NULL,user_id VARCHAR(50),text VARCHAR(255),time_in_video DOUBLE,send_time DATETIME
);

☁️ Redis 数据结构设计

Key类型示例值
danmu:video:{videoId}List弹幕 JSON,按时间顺序
filter:wordsSet管理敏感词
limit:user:{userId}String限制用户发送频率

☁️ Redis 存弹幕(实时 + 历史)

  • 弹幕按 timeInVideo 入 Redis List
  • 前端加载 Redis 弹幕,根据视频播放进度展示
  • 每隔 30 秒自动将 Redis 弹幕落库并清除缓存

🔐 敏感词过滤系统(服务 + 接口)

🔧 Redis Filter Service

@Service
public class DanmuFilterService {@Autowired RedisTemplate<String, String> redis;public boolean containsForbidden(String text) {Set<String> words = redis.opsForSet().members("filter:words");return words != null && words.stream().anyMatch(text::contains);}
}

🔧 管理接口

@RestController
@RequestMapping("/api/filters")
public class FilterController {@Autowired RedisTemplate<String, String> redis;@PostMapping("/add")public String add(@RequestParam String word) {redis.opsForSet().add("filter:words", word);return "添加成功";}@PostMapping("/remove")public String remove(@RequestParam String word) {redis.opsForSet().remove("filter:words", word);return "删除成功";}@GetMapping("/list")public Set<String> list() {return redis.opsForSet().members("filter:words");}
}

🚦 弹幕限频控制

👮 Redis 限流器

@Service
public class DanmuRateLimitService {@Autowired RedisTemplate<String, String> redis;public boolean isTooFast(String userId) {String key = "limit:user:" + userId;if (redis.hasKey(key)) return true;redis.opsForValue().set(key, "1", Duration.ofSeconds(2));return false;}
}

🔄 定时将弹幕持久化到 MySQL

@Component
public class DanmuBackupTask {@Autowired RedisTemplate<String, String> redis;@Autowired DanmuRepository danmuRepo;Gson gson = new Gson();@Scheduled(fixedRate = 30000) // 每 30 秒public void flushToDb() {Set<String> keys = redis.keys("danmu:video:*");if (keys == null) return;for (String key : keys) {List<String> list = redis.opsForList().range(key, 0, -1);if (list == null || list.isEmpty()) continue;List<Danmu> danmus = list.stream().map(j -> gson.fromJson(j, Danmu.class)).toList();danmuRepo.saveAll(danmus);redis.delete(key); // 清空 Redis}}
}

📡 WebSocket 处理器(敏感词 + 限频 + 广播)

@ServerEndpoint("/ws/danmu/{videoId}/{userId}")
@Component
public class DanmuWebSocket {private static final Map<String, Session> sessions = new ConcurrentHashMap<>();private static DanmuFilterService filterService;private static DanmuRateLimitService rateLimitService;private static RedisTemplate<String, String> redis;@Autowiredpublic void setDeps(DanmuFilterService f, DanmuRateLimitService r, RedisTemplate<String, String> rt) {filterService = f;rateLimitService = r;redis = rt;}@OnOpenpublic void onOpen(Session session) {sessions.put(session.getId(), session);}@OnMessagepublic void onMessage(String msgJson, Session session,@PathParam("videoId") String videoId,@PathParam("userId") String userId) {Danmu danmu = new Gson().fromJson(msgJson, Danmu.class);danmu.setUserId(userId);danmu.setSendTime(LocalDateTime.now());// 限频if (rateLimitService.isTooFast(userId)) {sendTo(session, "[系统通知] 请勿频繁发送弹幕!");return;}// 敏感词if (filterService.containsForbidden(danmu.getText())) {sendTo(session, "[系统通知] 弹幕含违禁词,已屏蔽!");return;}// 存 Redisredis.opsForList().rightPush("danmu:video:" + videoId, new Gson().toJson(danmu));// 广播sessions.values().forEach(s -> sendTo(s, new Gson().toJson(danmu)));}private void sendTo(Session session, String msg) {try { session.getBasicRemote().sendText(msg); } catch (Exception e) {}}@OnClosepublic void onClose(Session session) {sessions.remove(session.getId());}
}

💻 前端弹幕逻辑(伪代码)

// 加载历史弹幕
fetch("/api/danmu/history?videoId=123").then(res => res.json()).then(data => {danmus = data.sort((a, b) => a.time - b.time);});setInterval(() => {const currentTime = video.currentTime;while (danmus.length && danmus[0].time <= currentTime) {showDanmu(danmus.shift().text);}
}, 200);// 连接 WebSocket
const ws = new WebSocket("ws://localhost:8080/ws/danmu/123/userA");
ws.onmessage = e => showDanmu(JSON.parse(e.data).text);// 发送弹幕
function sendDanmu(text) {ws.send(JSON.stringify({ text, time: video.currentTime }));
}

✅ 最终效果

功能效果
实时弹幕多用户同步,实时显示
历史弹幕视频播放自动同步
敏感词拦截系统通知+拦截广播
防刷控制每 2 秒最多 1 条
持久化保障弹幕定时入库


🧪 当前系统存在的缺点分析

分类问题描述影响改进建议
🏗 架构WebSocket 逻辑中 Redis 和 Spring Bean 注入依赖手动静态赋值不规范,难维护,容易出错使用 @Component + @ServerEndpointExporter 或 Spring WebSocket(STOMP)替代
💾 数据存储Redis 弹幕写入后一次性 flush 到 MySQL,每次清空缓存如果任务挂掉,数据可能丢失采用 MQ(如 Kafka)异步写库,或采用 AOF 持久化增强安全性
🧍‍♂️ 用户控制弹幕限频基于 Redis 键,粒度较粗(用户级 2 秒)不能支持每用户每视频限频、动态限速改为 Lua 脚本实现限流(滑动窗口或令牌桶)更精准
🔎 敏感词检测整体为“包含”检测,容易误伤、无法处理变形词用户体验下降 + 容易绕过支持正则、Trie 树、拼音转写等模糊检测方案
📋 管理后台敏感词接口无权限保护,任意人可添加/删除高危漏洞使用 Spring Security + 登录鉴权系统
📈 弹幕密度当前只支持“每秒多条弹幕”的简单展示方式弹幕重叠、遮挡,影响观看加入轨道(轨迹)管理:每条弹幕分配不重复轨道并添加动画队列
📺 前端展示弹幕展示样式较简单,没有封装动画、颜色、字体大小不够炫酷,体验不如 B 站使用 canvas 或独立 JS 弹幕引擎如 danmaku.js
📶 多节点支持当前广播使用内存 Map 保存所有 Session无法扩展多实例部署引入消息中间件(如 Redis Pub/Sub、Kafka)实现弹幕广播中转
💬 消息格式弹幕是纯文本,缺乏弹幕类型(滚动/顶端/底端)、颜色等字段无法实现个性化弹幕样式扩展弹幕数据结构支持样式字段:如 { text, type, color, fontSize }

✅ 总结建议

优化方向推荐技术
高可用架构Spring WebSocket + Redis Pub/Sub + Kafka
数据安全Redis AOF + MQ 异步写库
用户限频Redis Lua 限流脚本(滑动窗口算法)
敏感词检测DFA + 正则匹配 + 后台管理审查
前端动画使用弹幕引擎库,如 danmaku.js / canvas 实现
安全控制Spring Security + RBAC 管理员角色

http://www.dtcms.com/wzjs/73286.html

相关文章:

  • 厦门做企业网站上海seo网站策划
  • 石家庄网站建设找哪家百度热搜榜今日头条排名
  • 哈尔滨住房和城乡建设委员会网站池州网络推广
  • 建设制作网站网站快速排名优化哪家好
  • 用网站做自我介绍自己网络销售是什么
  • seo网站优化代码网络推广哪个平台最好
  • html5网站框架百度大数据
  • 提供邯郸移动网站建设网页设计友情链接怎么做
  • 南昌做购物网站的公司百度首页排名优化多少钱
  • 重庆做网站哪家好旺道seo工具
  • 怎样建设网站内容互联网营销策划
  • 做网站 pc端与手机端兼容东莞做网站公司电话
  • 东莞寮步网站建设互联网域名交易中心
  • 免费推广软件流量精灵江门关键词优化公司
  • 广东手机网站建设报价临沂百度推广多少钱
  • 网络营销导向企业网站建设的原则可以推广发广告的app
  • 做批发是国际购物网站有哪些html网页设计模板
  • 制作网站需要用什么软件关键词提取
  • 做动漫网站如何应用数据绑定郑州竞价托管代运营
  • 网站后台发表文章合肥网站优化seo
  • 佛山html5网站建设sem是什么意思?
  • 互动广告机网站建设东莞网络推广系统
  • 有没有专业帮忙做ppt的网站万网官网域名查询
  • 做网站的做网站麻烦吗购物网站哪个最好
  • 贵阳网站建设专家可以放友情链接的网站
  • wordpress 国内不使用方法seo关键词推广多少钱
  • 建设网站赚钱企业邮箱
  • 郑州企业网站制作怎么做创建属于自己的网站
  • 青海省住房和城乡建设厅网站信息流优化师职业规划
  • 网站开发交流平台建立网站的主要步骤