【黑马点评】达人探店

2023-10-31

【黑马点评】达人探店

1、发布探店笔记

探店笔记类似点评网站的评价,往往是图文结合。对应的表有两个:
tb_blog:探店笔记表,包含笔记中的标题、文字、图片等
tb_blog_comments:其他用户对探店笔记的评价

具体发布流程

在这里插入图片描述

根据找到对应的上传接口

http://localhost:8080/api/blog

对应数据库表:tb_blog

1)写笔记上传图片

对应的类是UploadController

@PostMapping("blog")
    public Result uploadImage(@RequestParam("file") MultipartFile image) {
        try {
            // 获取原始文件名称
            String originalFilename = image.getOriginalFilename();
            // 生成新文件名
            String fileName = createNewFileName(originalFilename);
            // 保存文件
            image.transferTo(new File(SystemConstants.IMAGE_UPLOAD_DIR, fileName));
            // 返回结果
            log.debug("文件上传成功,{}", fileName);
            return Result.ok(fileName);
        } catch (IOException e) {
            throw new RuntimeException("文件上传失败", e);
        }
    }

这里需要修改文件上传的地址,这里是要上传到前端服务器nginx上

new File(SystemConstants.IMAGE_UPLOAD_DIR, fileName)

找到imgs所在的路径

D:\baidu\Down\nginx-1.18.0\html\hmdp\imgs
IMAGE_UPLOAD_DIR = "D:\\baidu\\Down\\nginx-1.18.0\\html\\hmdp\\imgs\\";

在实际开发中图片一般会放在nginx上或者是云存储上。

图片上传的路径和流程,文件保存路径

在这里插入图片描述

2)发布笔记

BlogController

@Resource
    private IBlogService blogService;

    @PostMapping
    public Result saveBlog(@RequestBody Blog blog) {
        // 获取登录用户
        UserDTO user = UserHolder.getUser();
        blog.setUserId(user.getId());
        // 保存探店博文
        blogService.save(blog);
        // 返回id
        return Result.ok(blog.getId());
    }

这里注意需要修改shop_id默认值为10,在数据库中修改,不然会报错

发布成功后页面会自动跳转到你的个人页面,笔记会出现在你的个人页面中

在这里插入图片描述
在这里插入图片描述

还可以在首页中看到自己发布的笔记

数据库中插入成功

在这里插入图片描述

2、实现查看发布的笔记

在这里插入图片描述

1)Controller层业务转移

BlogController

将controller中的业务转移到service中

@GetMapping("/hot")
    public Result queryHotBlog(@RequestParam(value = "current", defaultValue = "1") Integer current) {
        return blogService.queryHotBlog(current);
    }
@GetMapping("/{id}")
    public Result queryBlog(@PathVariable("id") long id){
        return blogService.queryBlogById(id);
    }

修改处

在这里插入图片描述

2)service层实现方法

serviceimpl实现类

实现两个方法

@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {
	@Resource
    private IUserService userService;
    
    @Override
    public Result queryHotBlog(Integer current) {
        // 根据用户查询
        Page<Blog> page = query()
                .orderByDesc("liked")
                .page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));
        // 获取当前页数据
        List<Blog> records = page.getRecords();
        // 查询blog有关用户
        records.forEach(this::queryBlogUser);
        return Result.ok(records);
    }

    @Override
    public Result queryBlogById(long id) {
        //1、查询blog
        Blog blog = getById(id);
        if (blog==null) {
            return Result.fail("笔记不存在!");
        }
        //2、查询blog有关用户
        queryBlogUser(blog);
        return Result.ok(blog);
    }
}

可以看到这里查询blog有关的用户这段代码逻辑在两个方法中都存在,可以将这段代码逻辑进行封装

3)封装查询blog

快捷键==Ctrl+Alt+M

查询blog相关用户统一由一个功能来实现

// 查询blog有关用户逻辑封装
    private void queryBlogUser(Blog blog) {
        Long userId = blog.getUserId();
        User user = userService.getById(userId);
        blog.setName(user.getNickName());
        blog.setIcon(user.getIcon());
    }

查看笔记内容成功

在这里插入图片描述

3、点赞功能

实际业务中,对哪个笔记点赞,笔记点赞量最多的,就会将这个笔记推在首页的前面

找到点赞对应的接口

http://localhost:8080/api/blog/like/?

在这里插入图片描述

对应的Controller类是BlogController

@PutMapping("/like/{id}")
    public Result likeBlog(@PathVariable("id") Long id) {
        // 修改点赞数量
        blogService.update()
                .setSql("liked = liked + 1").eq("id", id).update();
        return Result.ok();
    }

这里的like就是点赞数量

这里可以看到我对这个订单进行了点赞,但是如果同一个人对一个笔记进行重复的点赞,那么服务器承担的压力非常大,所以我们应该限制一人一赞

完善点赞功能

需求:

  • 同一个用户只能点赞一次,再次点击则取消点赞
  • 如果当前用户已经点赞,则点赞按钮高亮显示(前端已实现,判断字段Blog类的isLike属性)

实现步骤:

  • 给Blog类中添加一个isLike字段,标示是否被当前用户点赞
  • 修改点赞功能,利用Redis的set集合判断是否点赞过,未点赞过则点赞数+1,已点赞过则点赞数-1
  • 修改根据id查询Blog的业务,判断当前登录用户是否点赞过,赋值给isLike字段
  • 修改分页查询Blog业务,判断当前登录用户是否点赞过,赋值给isLike字段

实现步骤

1)实体类Blog加字段
    /**
     * 是否点赞过了
     */
    @TableField(exist = false)
    private Boolean isLike;
2)修改Controller层点赞功能
@PutMapping("/like/{id}")
    public Result likeBlog(@PathVariable("id") Long id) {
        // 修改点赞数量
        return blogService.likeBlog(id);
    }
3)service中创建实现likeBlog方法

把笔记的id作为redis中的KEY,点赞的用户的ID作为Value存在set集合中

//service接口
Result likeBlog(Long id);
//service实现类
@Override
    public Result likeBlog(Long id) {
        //1、获取用户
        Long userId = UserHolder.getUser().getId();
        //2、判断当前用户是否点赞
        String key="blog:liked:"+id;
        Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId.toString());
        if (BooleanUtil.isFalse(isMember)) {
            //3、如未点赞,可以点赞
            //3.1、数据库点赞数+1
            boolean isSuccess = update().setSql("liked=liked+1").eq("id", id).update();
            //3.2、保存用户到Redis的set集合中
            if (isSuccess) {
                stringRedisTemplate.opsForSet().add(key,userId.toString());
            }
        }else {
            //4、如果已经点赞。则取消点赞
            //4.1、数据库点赞数-1
            boolean isSuccess = update().setSql("liked=liked-1").eq("id", id).update();
            //4.2、把用户从Redis集合中移除
            if (isSuccess) {
                stringRedisTemplate.opsForSet().remove(key,userId.toString());
            }
        }
        return Result.ok();
    }
4)修改前两个方法

在前面两个方法中都需要查询blog是否被点赞

所以我们修改方法

定义这段相同的逻辑

private void isBlogLiked(Blog blog) {
        //1、获取用户
        Long userId = UserHolder.getUser().getId();
        //2、判断当前用户是否点赞
        String key="blog:liked:"+blog.getId();
        Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId.toString());
        blog.setIsLike(BooleanUtil.isTrue(isMember));
    }

修改方法——加上这段逻辑

queryBlogById方法

在这里插入图片描述

queryHotBlog方法

在这里插入图片描述

5)测试

这里要注意,要先登录,不然直接报空指针异常

在这里插入图片描述

点赞后,图标显示高亮,再次点击数字减一,高亮消失,并且缓存中点赞用户id消失

在这里插入图片描述

数据库中数据正常

4、点赞排行榜

一、分析

在探店笔记的详情页面,应该把给该笔记点赞的人显示出来,比如最早点赞的TOP5,形成点赞排行榜:

在这里插入图片描述

对应实现接口为

http://localhost:8080/api/blog/like/?

我们选定的集合要满足要存多个元素、唯一、排序

之前的点赞是放到set集合,但是set集合是不能排序的,所以这个时候,咱们可以采用一个可以排序的set集合,就是咱们的sortedSet

在这里插入图片描述

我们接下来来对比一下这些集合的区别是什么

所有点赞的人,需要是唯一的,所以我们应当使用set或者是sortedSet

其次我们需要排序,就可以直接锁定使用sortedSet啦

二、选用集合

语法:

ZSOCORE key member

实现:

--创建集合z1,并添加集合元素3个
> ZADD z1 1 m1 2 m2 3 m3
3
--查询集合元素
> ZSCORE z1 m1
1
> ZSCORE z1 m2
2
> ZSCORE z1 m3
3

排行榜范围查询

ZRANGE key min max

实现

--查集合z1前5名
> ZRANGE z1 0 4
m1
m2
m3

三、代码实现

修改点赞功能——likeBlog方法

BlogServiceimpl实现类

1)修改集合类型

将set集合改为Zset集合

likeBlog方法

代码逻辑

  1. 通过UserHolder.getUser().getId()获取当前用户的id。
  2. 判断当前用户是否已经点赞该博客,通过Redis中ZSet的score方法判断该用户id是否存在。
  3. 如果该用户未点赞,需要执行以下步骤:
    • 数据库点赞数+1,使用EasyMybatis中的update对象进行操作。
    • 将当前用户的id和当前时间戳加入到Redis的ZSet集合中,使得可以记录该用户的点赞时间和支持排序。
  4. 如果该用户已经点赞,需要执行以下步骤:
    • 数据库点赞数-1,使用EasyMybatis中的update对象进行操作。
    • 从Redis的ZSet集合中将当前用户id移除。

而返回值是一个Result对象,并且返回码为200,即请求成功。

在这里插入图片描述

isBlogLiked方法

在这里插入图片描述

2)实现点赞排行榜
@Override
    public Result queryBlogLikes(long id) {
        String key=BLOG_LIKED_KEY+id;
        //1、查询top5(前5名)的点赞用户  zrange key 0 4
        Set<String> tops5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
        if (tops5==null||tops5.isEmpty()) {
            return Result.ok(Collections.emptyList());
        }
        //2、解析出其中的用户id
        List<Long> ids = tops5.stream().map(Long::valueOf).collect(Collectors.toList());
        //3、根据用户id查询用户
        List<UserDTO> userDTOS = userService.listByIds(ids)
                .stream()
                .map(user -> BeanUtil.copyProperties(user, UserDTO.class))
                .collect(Collectors.toList());
        //4、返回
        return Result.ok(userDTOS);
    }
3)Controller层实现接口

BlogController类

@GetMapping("likes/{id}")
    public Result queryBlogLikes(@PathVariable("id") long id){
        return blogService.queryBlogLikes(id);
    }
4)登录问题

首页没登录的时候看不到页面内容,原因是我们这里设置了用户点赞,当前用户没登录就无法查看订单的点赞

我们需要用户不用登录也能查看到内容

BlogServiceImpl类

private void isBlogLiked(Blog blog) {
        //1、获取用户
        UserDTO user=UserHolder.getUser();
        if (user==null) {
            //用户未登录,无需查询是否点赞
            return;
        }
        Long userId = UserHolder.getUser().getId();
        //2、判断当前用户是否点赞
        String key="blog:liked:"+blog.getId();
        Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());
        blog.setIsLike(score!=null);
    }
5)效果

可以看到点赞图标出现了点赞用户的头像

在这里插入图片描述

查看缓存

在这里插入图片描述

我使用另一个账号登陆后点赞后

在这里插入图片描述

这里可以发现一个问题:

点赞第一用户的位置被排在了后面

四、问题解决

1)原因

这是数据库的sql语句原因

select ... from user where id in(10,7);

这里用IN的时候查询的结果不会按照你提供的id顺序

这里我先使用的是id=10的用户点赞,而这个用户却出现在后面

2)问题解决

手动指定id的顺序

select ... from user where id in(10,7) order by(id,10,7);

修改queryBlogLikes方法

@Override
    public Result queryBlogLikes(long id) {
        String key=BLOG_LIKED_KEY+id;
        //1、查询top5(前5名)的点赞用户  zrange key 0 4
        Set<String> tops5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
        if (tops5==null||tops5.isEmpty()) {
            return Result.ok(Collections.emptyList());
        }
        //2、解析出其中的用户id
        List<Long> ids = tops5.stream().map(Long::valueOf).collect(Collectors.toList());
        String idStr = StrUtil.join(",", ids);
        //3、根据用户id查询用户  select ... from user where id in(10,7) order by(id,10,7);
        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());
        //4、返回
        return Result.ok(userDTOS);
    }

修改部分

在这里插入图片描述

结果看出排行榜功能实现

在这里插入图片描述

达人探店功能完结!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【黑马点评】达人探店 的相关文章

  • Disruptor(一)Disruptor概念和RingBuffer数据结构

    Disruptor是LMAX公司开源的一个高效的内存无锁队列 谈到并发程序设计 有几个概念是避免不了的 1 锁 锁是用来做并发最简单的方式 当然其代价也是最高的 内核态的锁的时候需要操作系统进行一次上下文切换 等待锁的线程会被挂起直至锁释放
  • actuator--基础--04--Springboot集成

    actuator 基础 04 Springboot集成 代码位置 https gitee com DanShenGuiZu learnDemo tree master actuator learn actuator01 1 代码 1 1 依
  • Go redis操作

    Go redis的操作 五种数据结构的基本操作汇总 一 String 操作 命令 说明 Set key value 给数据库中名称为 key 的 string 赋予值 valueget key 返回数据库中名称为 key 的 string
  • Redis主从集群

    Redis主从集群 1 集群结构 我们搭建的主从集群结构如图 共包含三个节点 一个主节点 两个从节点 这里我们会在同一台虚拟机中开启3个redis实例 模拟主从集群 信息如下 IP PORT 角色 192 168 150 101 7001
  • Redis实战篇一 (短信登录)

    Redis企业实战 黑马点评 项目整体架构 项目部署 后端部署 前端部署 短信登陆 基于Session实现登录 集群的Session共享问题 基于Redis实现共享session登录 解决状态登录刷新的问题 登录拦截器的优化 本期学习路线
  • Java全栈面试题(三)--Redis

    对Redis的理解 Redis是一款开源的高性能键值对存储系统 支持多种数据类型 如字符串 哈希 列表 集合 有序集合等 主要用于缓存 消息队列 排行榜 计数器等场景 能够提供快速读写 高并发 持久化等功能 Redis是单线程的 通过采用多
  • 老话新谈之缓存一致性

    前言 缓存一致性常见的更新策略也比较多 如先更新数据库再更新缓存 先删缓存再更新数据库等等 我在理解的时候有些混乱 所以这个文章提供了一些理解上的技巧去理解缓存一致性 为什么会有缓存一致性的问题 缓存与数据库是两套中间件 存在网络抖动之类的
  • Memcach基础使用

    memcache 基础课程 使用场景 memcache 服务器端的安装 推荐使用memcached memcached是memchache的升级版本 sudo su apt get install memcached usr bin mem
  • Redis cluster集群搭建

    通过三台虚拟机搭建一个3主3从的cluster集群 1 安装 gcc c 依赖包 yum install gcc c 2 下载安装包并解压 wget https download redis io releases redis 6 0 9
  • redis篇

    一 数据库分类 1 关系型数据库SQL Oracle 不开源收费 高帅富 SQL Server 不开源收费 微软自家的产品 DB2 不开源收费 IBM 的产品 Sybase 不开源收费 微软的小基友 关系破裂后家境惨淡 MySQL 大家都在
  • Redis-Sentinel(哨兵模式),看这篇就够了哦

    文章目录 简介 启动并初始化Sentinel 初始化Sentinel服务器 替换普通Redis代码为Sentinel的专用代码 初始化 Sentinel 状态 初始化Sentinel监视的主服务器列表 创建连向主服务器的网络连接 获取主服务
  • 从一道题目学习Nunjucks模板

    Nunjucks简介 Nunjucks 是一个功能丰富 强大的 JavaScript 专用模板引擎 Nunjucks 提供丰富的语言特性和块继承 自动转移 宏和异步控制等等 重点要关注的是 Nunjucks 模板引擎的代码在沙箱环境中运行
  • 应用级缓存

    缓存介绍 缓存 让数据更接近使用者 目的是让访问速度更快 工作机制是先从缓存中读取数据 如果没有 再从慢速设备上读取实际数据并同步到时缓存 缓存命中率 缓存回收策略 JAVA缓存类型 堆缓存 堆外缓存 磁盘缓存 分布式缓存 多级缓存
  • Ceph bluestore中的缓存管理

    从15年3月接触Ceph分布式存储系统 至今已经5年了 因为工作的需要 对Ceph的主要模块进行了较深入的学习 也在Ceph代码层面做了些许改进 以满足业务需要 我们主要使用M版本 最近得闲 将过往的一些学习心得 改进以及优化思路记录下了
  • redis缓存雪崩、穿透、击穿

    这篇文章我们来了解一下一些redis的高并发问题以及他的解决方法 上图是一个简单的数据查询流程 前台请求 后台先从缓存中取数据 取到直接返回结果 取不到时从数据库中取 数据库取到更新缓存 并返回结果 数据库也没取到 那直接返回空结果 一 r
  • windows下使用django实现定时任务

    简介 在做 弹幕弹幕 小程序后端时 需要定时清除数据库中无用的弹幕 在网上查得可以使用Django中的django apscheduler实现这一功能 我在这里记录一下使用这一Application的过程 django apschedule
  • Redis介绍、安装、基础命令

    目录 引言 一 关系数据库和非关系数据库 1 1 关系型数据库 1 2 非关系型数据库 1 3 关系型数据库与非关系型数据库区别 数据存储方式不同 扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 二 Redis简介 2 1 Red
  • 4、动态代理的缓存机制

    1 背景 上一节大致介绍了Proxy动态代理的原理 从几个疑问上面分析 这一节介绍一下动态代理的缓存机制 网上的资源比较少 可以怀着下面几个问题阅读源码 为什么要缓存 缓存的内容是什么 哪里调用的缓存 缓存的实现机制 缓存的过期机制 2 属
  • 工作几年了,你真的懂 Redis 嘛?

    大家好 我是伍六七 一个专注于输出 AI 编程内容的在职大厂资深程序员 全国最大 AI 付费社群破局初创合伙人 关注我一起破除 35 诅咒 Redis 基本上是大部分技术公司都会使用的缓存框架 但是我发现很多程序员其实并不懂 Redis 今
  • Ehcache轻量级缓存框架

    Ehcache 是一个用于Java应用程序的开源的轻量级缓存框架 它专注于提供简单且高效的缓存解决方案 通过将数据存储在内存中 以提高对这些数据的访问速度 1 为什么选择Ehcache 1 1 Ehcache 内存中缓存 的优缺点 优势 性

随机推荐

  • 《数据库系统内 幕》分布式系统

    分布式部分 章8 分布式系统抽象 章9 故障 无超时的故障检测器 phi增量故障检测器 章10 领导者选举 选举过程 选举规则 章11 以数据为中心的一致性模型 单操作一致性模型 客户为中心的一致性 会话模型 复制协议 基于主备份协议的复制
  • Linux国内环境下安装kubeadm、kubelet、kubectl

    因为项目需要用Kubernetes来改版底层的Docker 所以一边写完成现在的任务一边继续学习Kubernetes 现有的一些文档和Kubernetes中文社区的中文文档都没有很详细的初期安装部署环境的教程 所以建议直接去官网看文档 当然
  • 优秀网站源码、编程源码下载网站大集中

    1 51源码 http www 51aspx com 2 源码之家 http www codejia com 3 源码网 http www codepub com 4 虾客源码 http www xkxz com 5 多多源码 http w
  • 牛客SQL练习三

    21查找所有员工自入职以来的薪水涨幅情况 题目描述 查找所有员工自入职以来的薪水涨幅情况 给出员工编号emp no以及其对应的薪水涨幅growth 并按照growth进行升序 CREATE TABLE employees emp no in
  • Unity Vuforia(高通)AR全流程

    Unity Vuforia播放视频全过程 从Unity的安装到打包 一 安装Unity 1 点击安装地址下载Unity Hub 下载好之后点击安装 2 从Unity Hub进去安装Unity 要先注册登陆账号 安装完后是这样的 二 新建项目
  • Vue+Element-UI Table表头排序

    Vue Element UI Table表头排序 Vue代码 定义后台需要接受的排序属性 排序sortChange Vue代码
  • js控制输入框

    转自 http www pinlue com article 2019 11 2221 409812495947 html
  • 【C++11】——右值引用、移动语义

    目录 1 基本概念 1 1 左值与左值引用 1 2 右值和右值引用 1 3 左值引用与右值引用 2 右值引用实用场景和意义 2 1 左值引用的使用场景 2 2 左值引用的短板 2 3 右值引用和移动语义 2 3 1 移动构造 2 3 2 移
  • 推荐算法(一):协同过滤系列

    一 协同过滤 collaborative filtering 一种ItemCF推荐baseline 1 输入 user item相关矩阵 2 中间结果 item间相似度计算 item i与item j间相似度 分子 与二者均有关联的user
  • 【Hadoop生态圈】3.Zookeeper入门教程及集群环境搭建

    文章目录 1 简介 2 环境准备 3 修改Zookeeper配置文件 4 复制安装包到从节点并设置myid 5 启动集群 6 zkCli常用命令 1 简介 ZooKeeper是一个分布式的 开放源码的分布式应用程序协调服务 是Google的
  • ChatGPT是否会终结申请海外留学的文书时代?

    ChatGPT的爆火 也让不少准留学生们不禁会问 这一技术的产生是否会影响申请文书的写作 美国Insidehighered的专栏作家Jim Jump给出了自己的观点 ChatGPT对热爱文字和从事教育工作的人提出了特别的挑战 如果老师不能确
  • Unity中UGUI中各类UI元素跟随画面适应问题

    案例背景 这是一个即将发布陈web 版并且在手机上观看的 小交互 我要保证左上角按钮 保持相对位置不变 最终设置如下 简单版教程 很简单 Unity为每个UI元素提供了一个Rect Transform 里面有个Anchors 锚点 Unit
  • 如何搭建虚拟专有网络访问公司内网

    前言 因为公司开发都是内网环境 以往居家办公或非公司环境 都需要进行远程到公司电脑进行办公 为了方便部门同事出差驻场开发 搭建了虚拟专有网络 在实际搭建过程中使用了OpenVPN和SoftEtherVPN两种方式 做个总结记录 个人还是更推
  • python 解析大疆禅思L1 激光数据LDR格式

    个人微信 394467238 最近想把大疆禅思L1 录制的激光 LDR 数据 也就是把里面的数据一帧一帧的抽取出来 然后和图像数据做一个匹配 奈何问了一圈大疆的技术支持 就是不对外开放这个数据保存的协议 木有办法 只好自己动手尝试硬破解了
  • beanUtils封装表单数据到javaBean

    当表单数据多的时候避免太多的request getParament 方式获取数据 关键方法 BeanUtils populate p req getParameterMap 本例 获取前端表单数据 封装到javabean 练习中写了一些反射
  • OpenWRT安装docker内核kernel版本不够

    记录下 在openwrt中安装docker docker compose dockerd遇到如下错误 Collected errors pkg hash check unresolved cannot find dependency ker
  • 编程新手表示很想知道JAVA中Bean是什么?

    原文 编程新手表示很想知道JAVA中Bean是什么 NanSan 小编发现很多人都在问JAVA中Bean是什么 简单笼统的说就是一个类 一个可复用的类 这样的解释可能看着都还是云里雾里 跟没说一样 下面详细介绍吧 javaBean在MVC设
  • 拷贝构造函数的一个对象访问私有成员的问题

    最近遇到这样一个面试题 面试题 CString函数拷贝控制成员的编写 过程中遇到一个问题 真是当时让我疑惑不解 查查资料 原来是一时糊涂 看看人家的解答 不错 遂转一下 很简单 就是当时没转过弯来 原文如下 http blog csdn n
  • MapReduce运行流程

    MapRecude运行流程 1 客户端提交代码 job watiforcompletion 开始运行 2 请求到ResourceManager 经理 请求运行 ResourceManager返回jobId 和让客户端提交资源的路径 3 客户
  • 【黑马点评】达人探店

    黑马点评 达人探店 1 发布探店笔记 探店笔记类似点评网站的评价 往往是图文结合 对应的表有两个 tb blog 探店笔记表 包含笔记中的标题 文字 图片等 tb blog comments 其他用户对探店笔记的评价 具体发布流程 根据找到