牛客论坛笔记~

文章目录

  • Redis
    • spring整合redis
    • 实现点赞
      • 帖子的赞
      • 用户的赞
  • 关注功能
    • 热帖排行
    • redis存储验证码、登录凭证、用户信息
  • kafka
    • 阻塞队列
    • kafka![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d35be55986344b548710985cd8ecbd87.png)
    • 触发事件
    • 处理事件
  • Redis高级
    • 网站数据统计
  • 实现搜索功能
    • 实现的功能
    • 1. elasticsearch基本设置
    • 2. 实现数据同步
    • 3. es搜索并分页、高亮的功能
    • 4. 实现搜索功能
  • Quarzt
    • 任务调度

Redis

在这里插入图片描述

redis-cli
select 0
# 加值减值
incr count decr count
# 查询库中所有的key
keys *
# 以test开头的所有的key
keys test*
# key的类型, 名为test:user的key
type test:user
# key是否存在
exists test:user
del test:user# 删除
#过期时间, 10秒过期
expire test:user 10

在这里插入图片描述

spring整合redis

在这里插入图片描述

实现点赞

帖子的赞

like:entity:entityType:entityId 实体的赞中存的是用户id, 可以更好的适应各种需求–>set(userId)–无序唯一

  • 点一次是点赞,再点一次是取消赞
  • 先看集合中有没有userId,operations.opsForSet().isMember(entityLikeKey, userId) 如果存在,就删除。不存在就添加
public void like(int userId,int entityType,int entityId,int entityUserId){//  事务redisTemplate.execute(new SessionCallback() {@Overridepublic Object execute(RedisOperations operations) throws DataAccessException {String entityLikeKey= RedisKeyUtil.getEntityLikeKey(entityType,entityId);// 用户该帖子获得的赞String userLikeKey=RedisKeyUtil.getUserLikeKey(entityUserId);Boolean isMember = operations.opsForSet().isMember(entityLikeKey, userId);operations.multi();//开启事务if(isMember){operations.opsForSet().remove(entityLikeKey,userId);operations.opsForValue().decrement(userLikeKey);}else {operations.opsForSet().add(entityLikeKey,userId);operations.opsForValue().increment(userLikeKey);}return operations.exec();//执行事务}});}
  • 查询某实体(帖子)的点赞数量
  • 查询用户是否给实体点赞
  • 查询某个用户获得的赞
// 查询某实体点赞的数量public long findEntityLikeCount(int entityType,int entityId){String entityLikeKey=RedisKeyUtil.getEntityLikeKey(entityType,entityId);return redisTemplate.opsForSet().size(entityLikeKey);}//查询某人对某实体的点赞状态public int findEntityLikeStatus(int userId,int entityType,int entityId){String entityLikeKey=RedisKeyUtil.getEntityLikeKey(entityType,entityId);return redisTemplate.opsForSet().isMember(entityLikeKey,userId)?1:0;//查询某个用户的赞的数量public int findUserLikeCount(int userId){String userLikeKey = RedisKeyUtil.getUserLikeKey(userId);Integer count = (Integer) redisTemplate.opsForValue().get(userLikeKey);return count==null?0:count.intValue();}}

用户的赞

like:user:userId

关注功能

  • 某个用户关注的所有实体
    followee:userId:entityType ->Zset(entityId,now) 按时间排序
  • 实体的粉丝
    follower:entityType:entityId ->Zset(userId,now)

关注取关的功能实现

 public void follow(int userId,int entityType,int entityId){redisTemplate.execute(new SessionCallback() {@Overridepublic Object execute(RedisOperations operations) throws DataAccessException {String followeeKey= RedisKeyUtil.getFolloweeKey(userId,entityType);String followerKey= RedisKeyUtil.getFollowerKey(entityId,entityType);operations.multi();operations.opsForZSet().add(followeeKey,entityId,System.currentTimeMillis());operations.opsForZSet().add(followerKey,userId,System.currentTimeMillis());return operations.exec();}});}public void unfollow(int userId,int entityType,int entityId){redisTemplate.execute(new SessionCallback() {@Overridepublic Object execute(RedisOperations operations) throws DataAccessException {String followeeKey= RedisKeyUtil.getFolloweeKey(userId,entityType);String followerKey= RedisKeyUtil.getFollowerKey(entityId,entityType);operations.multi();operations.opsForZSet().remove(followeeKey,entityId);operations.opsForZSet().remove(followerKey,userId);return operations.exec();}});}
  • 查询关注实体的数量
  • 查询实体粉丝的数量
  • 查询当前用户是否已关注这个实体
    粉丝列表、关注列表
  • 查询某用户关注的人
  • 查询某用户的粉丝
//查询某用户关注的人public List<Map<String,Object>> findFollowees(int userId,int offset,int limit){String followeeKey= RedisKeyUtil.getFolloweeKey(userId,ENTITY_TYPE_USER);Set<Integer> targetIds=redisTemplate.opsForZSet().reverseRange(followeeKey,offset,offset+limit-1);if(targetIds==null){return null;}List<Map<String,Object>> list=new ArrayList<>();for(Integer targetId:targetIds){Map<String,Object> map=new HashMap<>();User user = userService.findUserById(targetId);map.put("user",user);Double score=redisTemplate.opsForZSet().score(followeeKey,targetId);map.put("followTime",new Date(score.longValue()));list.add(map);}return list;}//查询某用户的粉丝public List<Map<String,Object>> findFollowers(int userId,int offset,int limit){String followerKey= RedisKeyUtil.getFollowerKey(userId,ENTITY_TYPE_USER);Set<Integer> targetIds=redisTemplate.opsForZSet().reverseRange(followerKey,offset,offset+limit-1);if(targetIds==null){return null;}List<Map<String,Object>> list=new ArrayList<>();for(Integer targetId:targetIds){Map<String,Object> map=new HashMap<>();User user = userService.findUserById(targetId);map.put("user",user);Double score=redisTemplate.opsForZSet().score(followerKey,targetId);map.put("followTime",new Date(score.longValue()));list.add(map);}return list;}

热帖排行

在这里插入图片描述

// 帖子分数public static String getPostScoreKey() {return PREFIX_POST + SPLIT + "score";}
  • 评论、加精、点赞、收藏时,对帖子算分数
  • 将需要重新计算分数的帖子Id存入Redis中
// 保存需要计算帖子分数的idString redisKey = RedisKeyUtil.getPostScoreKey();redisTemplate.opsForSet().add(redisKey, discussPostId);
  • 定时刷新分数,五分钟一次
  • quartz对帖子分数进行计算
    private void refresh(int postId) {DiscussPost post = discussPostService.findDiscussPostById(postId);if(post == null) {logger.error("该帖子不存在:id=" + postId);return;}// 是否精华boolean wonderful = post.getStatus() == 1;// 评论数量int commentCount = post.getCommentCount();// 点赞数量long likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_POST, postId);// 计算权重double w = (wonderful ? 75 : 0) + commentCount * 10 + likeCount * 2;// 分数 = 帖子权重 + 距离天数double score = Math.log10(Math.max(w, 1)) + (post.getCreateTime().getTime()-epoch.getTime()) / (1000 * 3600 * 24);// 更新帖子分数discussPostService.updateScore(postId, score);// 同步搜索的数据post.setScore(score);elasticSearchService.saveDiscussPost(post);}

配置quartz

    // 刷新帖子分数任务@Beanpublic JobDetailFactoryBean postScoreRefreshJobDetail(){JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();factoryBean.setJobClass(PostScoreRefreshJob.class);factoryBean.setName("postScoreRefreshJob");factoryBean.setGroup("communityJobJobGroup");factoryBean.setDurability(true); // 持久化factoryBean.setRequestsRecovery(true);return factoryBean;}@Beanpublic SimpleTriggerFactoryBean postScoreRefreshTrigger(JobDetail postScoreRefreshJobDetail){SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();factoryBean.setJobDetail(postScoreRefreshJobDetail);factoryBean.setName("postScoreRefreshTrigger");factoryBean.setGroup("communityTriggerGroup");factoryBean.setRepeatInterval(1000 * 60 * 5); // 频率factoryBean.setJobDataMap(new JobDataMap()); // 存储job的状态return factoryBean;}

redis存储验证码、登录凭证、用户信息

在这里插入图片描述

  • 存储验证码时,可以给用户生成一个临时的随机字符串,用于标识用户。
  • 登录凭证,退出后,将状态改变,再存入
  • 缓存用户信息
    • 优先从缓存中取值
    • 取不到数据时,初始化缓存数据
    • 数据变更时,清除缓存数据
    //1.优先从缓存中读取数据public User getCache(int userId){String redisKey = RedisKeyUtil.getUserKey(userId);return (User) redisTemplate.opsForValue().get(redisKey);}//2.在缓存中读不到数据时,初始化缓存数据public User initCache(int userId){User user = userMapper.selectById(userId);String redisKey = RedisKeyUtil.getUserKey(userId);redisTemplate.opsForValue().set(redisKey,user,3600, TimeUnit.SECONDS);return user;}//3.数据变更时清除缓存private void clearCache(int userId){String redisKey = RedisKeyUtil.getUserKey(userId);redisTemplate.delete(redisKey);}

kafka

阻塞队列

在这里插入图片描述

kafka在这里插入图片描述

数据存到硬盘上,主副本,从副本

触发事件

将消息放入队列中
封装成事件,

  • 评论后,发布通知
    触发发帖事件
Event event=new Event().setTopic(TOPIC_COMMENT).setUserId(hostHolder.getUser().getId()).setEntityType(comment.getEntityType()).setEntityId(comment.getEntityId()).setData("postId", discussPostId);if(comment.getEntityType()==ENTITY_TYPE_POST){DiscussPost target = discussPostService.findDiscussPostById(comment.getEntityId());event.setEntityUserId(target.getUserId());}else if(comment.getEntityType()==ENTITY_TYPE_COMMENT){Comment target=commentService.findCommentsById(comment.getEntityId());event.setEntityUserId(target.getUserId());}eventProducer.fireEvent(event);
  • 点赞后, 发布通知
  • 关注后,发布通知
public class EventProducer {@Autowiredprivate KafkaTemplate kafkaTemplate;//处理事件public void fireEvent(Event event){//将事件发布到指定的主题kafkaTemplate.send(event.getTopic(), JSONObject.toJSONString(event));}
}

在这里插入图片描述

处理事件

消费事件

//发送站内消息Message message = new Message();message.setFromId(SYSTEM_USER_ID);message.setToId(event.getEntityUserId());message.setConversationId(event.getTopic());message.setCreateTime(new Date());Map<String,Object> content=new HashMap<>();content.put("userId",event.getUserId());content.put("entityType",event.getEntityType());content.put("entityId",event.getEntityId());if(!event.getData().isEmpty()){for (Map.Entry<String ,Object> entry:event.getData().entrySet()) {content.put(entry.getKey(),entry.getValue());}}message.setContent(JSONObject.toJSONString(content));messageService.addMessage(message);
  • 封装事件对象
  • 开发事件的生产者
  • 开发事件的消费者

Redis高级

在这里插入图片描述

网站数据统计

在这里插入图片描述

  1. 设定redis键值
    用时间来当做rediskey
// 单日uvpublic static String getUVKey(String date){return PREFIX_UV + SPLIT + date;}// 区间uvpublic static String getUVKey(String startDate, String endDate){return PREFIX_UV + SPLIT + startDate + SPLIT + endDate;}// 单日活跃用户public static String getDAUKey(String date){return PREFIX_DAU + SPLIT + date;}// 区间活跃用户public static String getDAUKey(String startDate, String endDate){return PREFIX_DAU + SPLIT + startDate + SPLIT + endDate;}
  1. service层
// 将指定的IP计入UVpublic void recordUV(String ip){// 访问的日期作为rediskeyString redisKey = RedisKeyUtil.getUVKey(df.format(new Date()));// ip地址作为值存入redisredisTemplate.opsForHyperLogLog().add(redisKey, ip);}// 指定统计日期范围内的UVpublic long calculateUV(Date start, Date end){if(start == null || end == null){throw new IllegalArgumentException("参数不能为空!");}// 整理该日期范围内的keyList<String> keyList = new ArrayList<>();// 实例化,获取当前时间Calendar calendar = Calendar.getInstance();calendar.setTime(start);while(!calendar.getTime().after(end)){String key = RedisKeyUtil.getUVKey(df.format(calendar.getTime()));keyList.add(key);// 日期往后增加一天calendar.add(Calendar.DATE, 1);}// 合并数据String redisKey = RedisKeyUtil.getUVKey(df.format(start), df.format(end));redisTemplate.opsForHyperLogLog().union(redisKey, keyList.toArray());// 返回统计的结果return redisTemplate.opsForHyperLogLog().size(redisKey);}// 将指定用户计入DAUpublic void recordDAU(int userId){String redisKey = RedisKeyUtil.getDAUKey(df.format(new Date()));redisTemplate.opsForValue().setBit(redisKey, userId, true);}// 统计指定日期范围内的DAUpublic long calculateDAU(Date start, Date end){if(start == null || end == null){throw new IllegalArgumentException("参数不能为空!");}// 整理该日期范围内的keyList<byte[]> keyList = new ArrayList<>();// 实例化Calendar calendar = Calendar.getInstance();calendar.setTime(start);while(!calendar.getTime().after(end)){String key = RedisKeyUtil.getDAUKey(df.format(calendar.getTime()));keyList.add(key.getBytes());calendar.add(Calendar.DATE, 1);}// 进行OR运算return (long) redisTemplate.execute(new RedisCallback() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {String redisKey = RedisKeyUtil.getDAUKey(df.format(start),df.format(end));connection.bitOp(RedisStringCommands.BitOperation.OR, redisKey.getBytes(),keyList.toArray(new byte[0][0]));return connection.bitCount(redisKey.getBytes());}});}
  1. 在prehandle中实现调用
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 统计UVString ip = request.getRemoteHost();dataService.recordUV(ip);// 统计DAUUser user = hostHolder.getUser();if(user != null){dataService.recordDAU(user.getId());}return true;}
  1. controller层

实现搜索功能

实现的功能

  • 搜索服务:将帖子保存到elasticsearch服务器;从es服务器搜索、删除帖子;
  • 发布服务:发布帖子时,将帖子异步提交到es服务器;增加评论时,将帖子异步提交到es服务器;·在消费组件中增加一个方法,消费帖子发布事件;
  • 显示结果:在控制器中处理搜索请求,在HTML上显示搜索结果。

1. elasticsearch基本设置

底层是基于netty的

// 管理bean的生命周期的,初始化的方法
// 被它修饰的方法在构造器调用完以后执行@PostConstructpublic void init(){//解决netty启动冲突问题System.setProperty("es.set.netty.runtime.available.processors","false");}

要考虑mysql中的表和es中的索引的对应关系.数据库中的字段和es的字段的对应关系

// 索引的名字,类型,分片,副本
@Document(indexName = "discusspost",type = "doc",shards=6,replicas=3)
public class DiscussPost {@Idprivate int id;// 主键@Field(type = FieldType.Integer)private int userId;// 存储的分词器和搜索的分词器@Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_smart")private String title;
}

设置Repository接口

// 定义处理的实体类是DiscussPost,实体的主键类型Integer
@Repository
public interface DiscussPostRepository extends ElasticsearchRepository<DiscussPost,Integer> {
}

2. 实现数据同步

通过生产者消费者的方式同步数据的变化,将数据保存在es服务器中
触发发帖事件。

//触发发帖事件Event event=new Event().setTopic(TOPIC_PUBLISH).setUserId(user.getId()).setEntityType(ENTITY_TYPE_POST).setEntityId(discussPost.getId());eventProducer.fireEvent(event);

消费发帖事件

Event event=JSONObject.parseObject(record.value().toString(),Event.class);
// 查找新增的帖子,并保存到es
DiscussPost post= discussPostService.findDiscussPostById(event.getEntityId());
elasticSearchService.saveDiscussPost(post);

3. es搜索并分页、高亮的功能

public Page<DiscussPost> searchDiscussPost(String keyword,int current,int limit){SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.multiMatchQuery(keyword, "title", "content")).withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC)).withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC)).withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC)).withPageable(PageRequest.of(current, limit)).withHighlightFields(new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")).build();return elasticsearchTemplate.queryForPage(searchQuery, DiscussPost.class, new SearchResultMapper() {@Overridepublic <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {SearchHits hits = response.getHits();if (hits.getTotalHits() <= 0) {return null;}List<DiscussPost> list = new ArrayList<>();for (SearchHit hit : hits) {DiscussPost post = new DiscussPost();String id = hit.getSourceAsMap().get("id").toString();post.setId(Integer.valueOf(id));String userId = hit.getSourceAsMap().get("userId").toString();post.setUserId(Integer.valueOf(userId));String title = hit.getSourceAsMap().get("title").toString();post.setTitle(title);String content = hit.getSourceAsMap().get("content").toString();post.setContent(content);String status = hit.getSourceAsMap().get("status").toString();post.setStatus(Integer.valueOf(status));String createTime = hit.getSourceAsMap().get("createTime").toString();post.setCreateTime(new Date(Long.valueOf(createTime)));String commentCount = hit.getSourceAsMap().get("commentCount").toString();post.setCommentCount(Integer.valueOf(commentCount));// 处理高亮显示的结果HighlightField titleField = hit.getHighlightFields().get("title");if (titleField != null) {post.setTitle(titleField.getFragments()[0].toString());}HighlightField contentField = hit.getHighlightFields().get("content");if (contentField != null) {post.setContent(contentField.getFragments()[0].toString());}list.add(post);}return new AggregatedPageImpl(list, pageable,hits.getTotalHits(), response.getAggregations(), response.getScrollId(), hits.getMaxScore());}});

4. 实现搜索功能

org.springframework.data.domain.Page<DiscussPost> searchResult= 
elasticSearchService.searchDiscussPost(keyword, page.getCurrent()-1, page.getLimit());
// 聚合数据发送到前端
List<Map<String,Object>> discussPosts=new ArrayList<>();
...

Quarzt

任务调度

在这里插入图片描述
存到数据库中
配置
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/731645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 ArcGIS Pro 制作三维地形图

伴随硬件性能的提高和软件算法的优化&#xff0c;三维地图的应用场景会越来越多&#xff0c;这里为大家介绍一下在ArcGIS Pro怎么制作三维地形图&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM和影像数据&#xff0c;除了DEM和影像数据…

java(框架) springboot-1 基础使用+mybaits使用

学习视频&#xff1a;b站黑马java教程 tomcat spring-boot工程内嵌了tomcat服务器 所有请求经过DispatcherServlet(实现servlet接口的类)(核心控制器/前端控制器)处理&#xff0c;再通过DispatcherServlet转发给各个controller。 最后通过DispatcherServlet给浏览器响应数据…

垃圾收集器底层算法

垃圾收集器底层算法 三色标记 在并发标记的过程中&#xff0c;因为标记期间应用线程还在继续跑&#xff0c;对象间的引用可能发生变化&#xff0c;多标和漏标的情况就有可能发生&#xff0c;这里我们引入“三色标记”来给大家解释下把Gcroots可达性分析遍历对象过程中遇到对象…

02、进程的基础

1.进程的概念 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c; 是系统进行资源分配的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b;在当代…

LeNet5实战——衣服分类

搭建模型训练代码&#xff08;数据处理、模型训练、性能指标&#xff09;——> 产生权重w ——>模型结构c、w测试 配置环境 Pycharm刚配置的环境找不到了-CSDN博客 model.py 导入库 import torch from torch import nn from torchsummary import summary 模型搭…

河北省光伏展

光伏展是指光伏行业的展览会&#xff0c;也被称为太阳能展。光伏展一般是由光伏企业、科研机构、行业协会和专业展览公司等共同举办的。展会内容包括光伏产品、技术、设备、材料、应用等方面的展示和交流。 光伏展通常是光伏行业的重要盛事&#xff0c;吸引了全球范围内的光伏企…

144.乐理基础-根三五音、大三和弦、小三和弦

内容参考于&#xff1a; 三分钟音乐社 上一个内容&#xff1a;143.乐理基础-和弦是什么&#xff1f;和声是什么&#xff1f;三和弦-CSDN博客 必须先看上一个内容&#xff0c;了解什么是和弦、什么是和声&#xff0c;以及三和弦的定义 上一个内容最后写了三和弦的定义&#x…

【C++ 学习】构造函数详解!!!

1. 类的6个默认成员函数的引入 ① 如果一个类中什么成员都没有&#xff0c;简称为空类。 ② 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 ③ 默认成员函数&#xff1a;用户没有显式实现&…

嵌入式学习第二十五天!(网络的概念、UDP编程)

网络&#xff1a; 可以用来&#xff1a;数据传输、数据共享 1. 网络协议模型&#xff1a; 1. OSI协议模型&#xff1a; 应用层实际收发的数据表示层发送的数据是否加密会话层是否建立会话连接传输层数据传输的方式&#xff08;数据包&#xff0c;流式&#xff09;网络层数据的…

基于YOLOv8深度学习的智能道路裂缝检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、目标分割

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

外包干了5天,技术退步明显。。。。。

在湖南的一个安静角落&#xff0c;我&#xff0c;一个普通的大专生&#xff0c;开始了我的软件测试之旅。四年的外包生涯&#xff0c;让我在舒适区里逐渐失去了锐气&#xff0c;技术停滞不前&#xff0c;仿佛被时间遗忘。然而&#xff0c;生活的转机总是在不经意间降临。 与女…

警用移动执法远程视频监控方案:安防视频监控系统EasyCVR+4G/5G移动执法仪

一、背景需求 在现代城市管理中&#xff0c;移动执法仪视频监控方案正逐渐成为一种高效、便捷的管理工具。该方案通过结合移动执法仪和视频监控技术&#xff0c;实现了对城市管理现场的实时监控和取证&#xff0c;有效提升了城市管理水平和效率。 移动执法仪作为现场执法的重…

TypeScript 哲学 - Object Types

readonly 修饰对象和数组的 双向可分配性是不同的 只有有一个可选属性不是意味着必须 不能传空对象&#xff0c;&#xff1a;这个例子&#xff08;两个属性可选&#xff09;而是如果对象有额外属性&#xff0c;那么必须至少加一个 可选属性。只要你在传递的值和目标类型有一个…

关于STM32G070RBTx单片机使用HAL库往flash写数据的过程中死机问题

1.单片机型号:STM32G070RBTx 2.出现的问题 根据库函数FLASH_If_Write()的使用&#xff0c;我们分析往flash写数据的过程是把uint8_t 类型的数据(p_data)以地址的形式强转成uint64类型的&#xff0c;在一包128字节的数据时一次存储8位&#xff0c;存16次(packet_size/8)&#x…

Java项目:基于SSM框架实现的二手车交易平台【源码+开题报告+任务书+毕业论文+答辩ppt】

一、项目简介 本项目是一套基于SSM框架实现的二手车交易平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐…

瑞芯微 | I2S-音频基础 -1

最近调试音频驱动&#xff0c;顺便整理学习了一下i2s、alsa相关知识&#xff0c;整理成了几篇文章&#xff0c;后续会陆续更新。 喜欢嵌入式、Li怒晓得老铁可以关注一口君账号。 1. 音频常用术语 名称含义ADC&#xff08;Analog to Digit Conversion&#xff09;模拟信号转换…

stm32普通定时器脉冲计数(发送固定脉冲个数),控制步进电机驱动器

拨码开关设置驱动器&#xff0c;细分 方法思路&#xff1a;用通用定时器TIM2&#xff0c;1ms产生一次中断&#xff1b;在中断里做IO反转&#xff1b; 发送10个脉冲信号

搬家微信小程序:便捷预约,轻松解决搬家难题

在快节奏的现代生活中&#xff0c;搬家成为许多人不得不面对的一项繁琐任务。从整理物品、联系搬家公司&#xff0c;到现场协调&#xff0c;每一个环节都让人倍感压力。然而&#xff0c;如今随着科技的不断发展&#xff0c;搬家微信小程序的出现&#xff0c;为这一难题带来了便…

示波器探头的使用

无源探头(Tektronix P2220) 阻抗&#xff1a;1Mhz 衰减&#xff1a;10:1/1:1(与探头上的档位X10/X1相关&#xff0c;如果探头没有档位默认为10:1) 探头型号&#xff1a;电压 高压差分探头&#xff08;Tektronix P5200A) 阻抗&#xff1a;1Mhz 衰减&#xff1a;50:1/500:1(…

微信小程序(五十四)腾讯位置服务示范(2024/3/8更新)

教程如下&#xff1a; 上一篇 1.先在官网注册一下账号&#xff08;该绑定的都绑定一下&#xff09; 腾讯位置服务官网 2.进入控制台 3.创建应用 3. 额度分配 4.下载微信小程序SDK 微信小程序SDK下载渠道 5.解压将俩js文件放在项目合适的地方 6.加入安全域名or设置不验证合…