主頁 > 資料庫 > day09-達人探店

day09-達人探店

2023-05-03 07:53:05 資料庫

功能04-達人探店

5.功能04-達人探店

5.1發布&查看探店筆記

5.1.1發布探店筆記

探店筆記類似點評網站的評價,往往是圖文結合,對應的表有兩個:

  1. tb_blog:探店筆記表,包含筆記中的標題、文字、圖片等
  2. tb_blog_comments:其他用戶對探店筆記的評價
/*表: tb_blog*/
CREATE TABLE `tb_blog` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `shop_id` bigint(20) NOT NULL COMMENT '商戶id',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用戶id',
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '標題',
  `images` varchar(2048) NOT NULL COMMENT '探店的照片,最多9張,多張以","隔開',
  `content` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '探店的文字描述',
  `liked` int(8) unsigned DEFAULT '0' COMMENT '點贊數量',
  `comments` int(8) unsigned DEFAULT NULL COMMENT '評論數量',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT

/*表: tb_blog_comments*/
CREATE TABLE `tb_blog_comments` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用戶id',
  `blog_id` bigint(20) unsigned NOT NULL COMMENT '探店id',
  `parent_id` bigint(20) unsigned NOT NULL COMMENT '關聯的1級評論id,如果是一級評論,則值為0',
  `answer_id` bigint(20) unsigned NOT NULL COMMENT '回復的評論id',
  `content` varchar(255) NOT NULL COMMENT '回復的內容',
  `liked` int(8) unsigned DEFAULT NULL COMMENT '點贊數',
  `status` tinyint(1) unsigned DEFAULT NULL COMMENT '狀態,0:正常,1:被舉報,2:禁止查看',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT

點擊首頁最下方選單欄中的“+”按鈕,即可發布探店圖文:

image-20230501192613515

需要注意的是:

發布照片和發布筆記這兩個功能是分離的,因為上傳照片的功能不僅僅是發布筆記時需要用到,其他業務也有需求,因此上傳照片是一個獨立功能,

我們在發布筆記時,點擊上傳照片,會先向服務端發出一個請求,實作圖片上傳,上傳成功以后,服務端會回傳圖片的地址(即上傳之后可訪問的該圖片地址),這個地址將來會作為表單的引數,在發布筆記的時候一起提交到后臺(也就是說,在提交筆記的時候,我們提交的就不是照片本身了,而是上傳成功后的圖片地址),

(1)上傳圖片功能

上傳圖片的功能已經提前實作了,詳見UploadController.java及其介面

上傳的圖片其實是放在放在前端服務器中的,這里為了模擬,放在了D盤的前端專案(nginx-1.18.0)的目錄下:

image-20230501193134000

同時,需要將代碼中保存的目錄修改為對應的目錄:

image-20230501193549922

(2)發布筆記功能

發布筆記的功能也提前實作了,詳見BlogController.java及其介面

(3)測驗

點擊+號進入如下頁面,點擊上傳照片,一次可以上傳多張圖片:

image-20230501211055947

每次上傳圖片成功,后端都會回傳該圖片可訪問的圖片地址:

image-20230501195450721

點擊發布后,可以在個人主頁中看到發布的文章:

image-20230501211214098

5.1.2查看探店筆記

實作查看筆記的介面,需求:點擊首頁的筆記,可以進入詳情頁面,實作該頁面的查詢介面,

image-20230501212739176 image-20230501213008056

筆記的詳情頁面需要顯示:

  1. 筆記資訊
  2. 發布的用戶資訊(用戶id、用戶昵稱、用戶頭像)

代碼實作

(1)Blog.java,筆記物體類

package com.hmdp.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 筆記物體
 *
 * @author 李
 * @version 1.0
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("tb_blog")
public class Blog implements Serializable {

    private static final long serialVersionUID = 1L;
    
    //主鍵
    @TableId(value = "https://www.cnblogs.com/liyuelian/p/id", type = IdType.AUTO)
    private Long id;
    
    //商戶id
    private Long shopId;
    
    //用戶id
    private Long userId;
    
    //用戶頭像
    @TableField(exist = false)
    private String icon;
    
    //用戶昵稱
    @TableField(exist = false)
    private String name;
    
    //是否點贊過
    @TableField(exist = false)
    private Boolean isLike;
    
    //標題
    private String title;
    
    //探店的照片,最多9張,使用","隔開
    private String images;
    
    //探店的文字描述
    private String content;
    
    //點贊數量
    private Integer liked;
    
    //評論數量
    private Integer comments;
    
    //創建時間
    private LocalDateTime createTime;
    
    //更新時間
    private LocalDateTime updateTime;
}

(2)BlogMapper.java

package com.hmdp.mapper;

import com.hmdp.entity.Blog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 *  Mapper 介面
 *
 * @author 李
 * @version 1.0
 */
public interface BlogMapper extends BaseMapper<Blog> {

}

(3)IBlogService.java

package com.hmdp.service;

import com.hmdp.dto.Result;
import com.hmdp.entity.Blog;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 服務類
 *
 * @author 李
 * @version 1.0
 */
public interface IBlogService extends IService<Blog> {
    
    Result queryHotBlog(Integer current);//分頁查詢blog
    
    Result queryBlogById(Long id);//根據id查詢blog
}

(4)BlogServiceImpl.java

package com.hmdp.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmdp.dto.Result;
import com.hmdp.entity.Blog;
import com.hmdp.entity.User;
import com.hmdp.mapper.BlogMapper;
import com.hmdp.service.IBlogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.service.IUserService;
import com.hmdp.utils.SystemConstants;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 服務實作類
 *
 * @author 李
 * @version 1.0
 */
@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();
        // 查詢用戶
        records.forEach(this::queryBlogUser);
        return Result.ok(records);
    }

    @Override
    public Result queryBlogById(Long id) {
        //1.查詢blog
        Blog blog = getById(id);
        //2.查詢blog有關的用戶
        if (blog == null) {
            return Result.fail("筆記不存在!");
        }
        queryBlogUser(blog);

        return Result.ok(blog);
    }

    public void queryBlogUser(Blog blog) {
        Long userId = blog.getUserId();
        User user = userService.getById(userId);
        blog.setName(user.getNickName());
        blog.setIcon(user.getIcon());
    }
}

(5)BlogController.java

package com.hmdp.controller;

import com.hmdp.dto.Result;
import com.hmdp.service.IBlogService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * 前端控制器
 *
 * @author 李
 * @version 1.0
 */
@RestController
@RequestMapping("/blog")
public class BlogController {

    @Resource
    private IBlogService blogService;
    
    @GetMapping("/hot")
    public Result queryHotBlog(
        @RequestParam(value = "https://www.cnblogs.com/liyuelian/p/current", defaultValue = "https://www.cnblogs.com/liyuelian/p/1") Integer current) {
        return blogService.queryHotBlog(current);
    }

    @GetMapping("/{id}")
    public Result queryBlogById(@PathVariable("id") Long id){
        return blogService.queryBlogById(id);
    }
}

(6)測驗:重啟專案,點擊筆記,可以查看筆記詳情

image-20230501220346024

5.2點贊

5.2.1需求分析

在首頁的探店筆記排行榜和探店圖文詳情頁面都有點贊的功能:

image-20230501220801630

需求:

  • 同一個用戶只能點贊一次,再次點擊則取消點贊

  • 如果當前用戶已經點贊,則點贊按鈕高亮顯示(前端已實作,判斷欄位Blog類的isLike屬性)

實作步驟:

  1. 給Blog類中添加一個isLike欄位,標識是否被當前用戶點贊

  2. 修改點贊功能,利用Redis的set集合判斷是否點贊過,未點贊過則點贊數+1,已點贊過則再次點贊時點贊數-1

    blog的id作為key,點贊的用戶id作為value

  3. 修改根據id查詢Blog的業務,判斷當前用戶是否點贊過,賦值給isLike欄位

    用于blog詳情的點贊顯示

  4. 修改分頁查詢Blog業務,判斷當前登錄用戶是否點贊過,賦值給isLike欄位

    用于一頁blog時的所有點贊顯示

5.2.2代碼實作

(1)給Blog類中添加一個isLike欄位,標識是否被當前用戶點贊

image-20230502143817387

(2)修改IBlogService,添加方法宣告

Result likeBlog(Long id);

(3)修改BlogServiceImpl

  1. 實作方法likeBlog():修改點贊功能,利用Redis的set集合判斷是否點贊過,未點贊過則點贊數+1,已點贊過則再次點贊時點贊數-1
  2. 修改BlogServiceImpl的queryBlogById()方法和queryHotBlog(),在查詢blog資訊的同時,查詢當前用戶有沒有點贊過該blog

注意判斷當前用戶有沒有登錄

package com.hmdp.service.impl;

import ...

/**
 * 服務實作類
 *
 * @author 李
 * @version 1.0
 */
@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {

    @Resource
    private IUserService userService;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @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();
        // 查詢用戶
        records.forEach(blog -> {
            //查詢發布blog的user
            this.queryBlogUser(blog);
            //查詢當前用戶有沒有點贊過該blog
            this.isBlogLiked(blog);
        });
        return Result.ok(records);
    }

    @Override
    public Result queryBlogById(Long id) {
        //1.查詢blog
        Blog blog = getById(id);
        //2.查詢blog有關的用戶
        if (blog == null) {
            return Result.fail("筆記不存在!");
        }
        queryBlogUser(blog);
        //3.查詢blog是否被點贊了
        isBlogLiked(blog);
        return Result.ok(blog);
    }

    private void isBlogLiked(Blog blog) {
        //1.獲取當前登錄用戶 
        if (UserHolder.getUser() == null) {
        return;//如果當前用戶未登錄
        }
        Long userId = UserHolder.getUser().getId();
        //2.判斷當前登錄用戶是否已經點贊了
        // (去redis的set集合中判斷 SISMEMBER key member)
        String key = "blog:liked:" + blog.getId();
        Boolean isMember = 
            stringRedisTemplate.opsForSet().isMember(key, userId.toString());
        blog.setIsLike(BooleanUtil.isTrue(isMember));
    }

    @Override
    public Result likeBlog(Long id) {
        //1.獲取當前登錄用戶
        Long userId = UserHolder.getUser().getId();
        if (userId == null) {
            return Result.fail("用戶未登錄");
        }
        //2.判斷當前登錄用戶是否已經點贊了
        // (去redis的set集合中判斷 SISMEMBER key member)
        String key = "blog:liked:" + id;
        Boolean isMember = 
            stringRedisTemplate.opsForSet().isMember(key, userId.toString());
        //3.如果未點贊
        if (BooleanUtil.isFalse(isMember)) {
            //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的set集合中移除
            if (isSuccess) {
                stringRedisTemplate.opsForSet().remove(key, userId.toString());
            }
        }
        return Result.ok();
    }

    public void queryBlogUser(Blog blog) {
        Long userId = blog.getUserId();
        User user = userService.getById(userId);
        blog.setName(user.getNickName());
        blog.setIcon(user.getIcon());
    }
}

(4)修改BlogController,添加方法likeBlog()

@PutMapping("/like/{id}")
public Result likeBlog(@PathVariable("id") Long id) {
    return blogService.likeBlog(id);
}

(5)測驗:啟動專案,已登錄用戶第一次點贊時,點贊數+1,圖示高亮;第二次點贊時,點贊數-1,圖示變回灰色,

image-20230502161010511 image-20230502161313888

redis中的資料:set結構,key為blogId,value為userId

image-20230502161912191

如果用戶未登錄,點贊時則會自動跳轉到登錄頁面:

5.3點贊排行榜

5.3.1需求分析

在探店筆記的詳情頁面,應該把筆記點贊的用戶資訊顯示出來,比如最早點贊的TOP5,形成點贊排行榜:

image-20230502170901458

實作查詢點贊排行榜的介面:

需求:按照點贊時間先后排序,回傳Top5的用戶,

之前我們使用的是redis中的Set結構,對于點贊功能來說,要求資料唯一且可方便查找,在此基礎上,點贊排行榜功能還要求對資料進行排序,因此我們選用SortedSet結構實作,并對之前的點贊功能進行改造,

zset的整體結構:key value score(key存盤blogId,value存盤點贊的userId,score可以存盤當前點贊的時間戳)

image-20230502171806598

zset結構沒有判斷元素是否存在的命令,但可以查找指定元素的score,根據這個命令,判斷指定的元素的score,如果score不存在,則該元素不存在,

  ZSCORE key member
  summary: Get the score associated with the given member in a sorted set  
  since: 1.2.0

例如:

127.0.0.1:6379> ZADD z1 1 m1 2 m2 3 m3
(integer) 3
127.0.0.1:6379> ZSCORE z1 m4 #側面判斷m4不存在
(nil)
127.0.0.1:6379> ZSCORE z1 m1
"1"

查詢排行(比較score)則使用 zrange 命令:

127.0.0.1:6379> ZRANGE z1 0 4 #查詢排行前5名
1) "m1"
2) "m2"
3) "m3"

5.3.2代碼實作

(1)IBlogService增加方法宣告queryBlogLikes

public interface IBlogService extends IService<Blog> {
    ...
        
    Result queryBlogLikes(Long id);
}

(2)修改BlogServiceImpl:

  1. 修改之前的點贊功能,將其用到的set結構改為zset結構(修改isBlogLiked和likeBlog方法)
  2. 實作點贊排行功能--queryBlogLikes()
//判斷當前用戶是否點贊過該blog
private void isBlogLiked(Blog blog) {
    //1.獲取當前登錄用戶
    if (UserHolder.getUser() == null) {
        return;//如果當前用戶未登錄
    }
    Long userId = UserHolder.getUser().getId();
    //2.判斷當前登錄用戶是否已經點贊了
    String key = BLOG_LIKED_KEY + blog.getId();
    Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());
    blog.setIsLike(score != null);
}

//進行點贊操作
@Override
public Result likeBlog(Long id) {
    //1.獲取當前登錄用戶
    Long userId = UserHolder.getUser().getId();
    if (userId == null) {
        return Result.fail("用戶未登錄");
    }
    //2.判斷當前登錄用戶是否已經點贊了
    String key = BLOG_LIKED_KEY + id;
    Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());
    //3.如果未點贊(score為null,證明該用戶不存在zset中,即未點贊)
    if (score == null) {
        //3.1資料庫點贊數+1
        boolean isSuccess = update().setSql("liked=liked+1").eq("id", id).update();
        //3.2保存用戶到redis的zset集合 zadd key value score
        if (isSuccess) {
            stringRedisTemplate.opsForZSet().add(key, userId.toString(), System.currentTimeMillis());
        }
    } else {//4.如果已經點贊,則取消點贊
        //4.1資料庫點贊數-1
        boolean isSuccess = update().setSql("liked=liked-1").eq("id", id).update();
        //4.2將用戶從redis的zset集合中移除
        if (isSuccess) {
            stringRedisTemplate.opsForZSet().remove(key, userId.toString());
        }
    }
    return Result.ok();
}

//根據blogId回傳點贊該blog的top5的用戶資訊
@Override
public Result queryBlogLikes(Long id) {
    String key = BLOG_LIKED_KEY + id;
    //1.查詢top5的點贊用戶 zrange key 0 4
    Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
    if (top5 == null || top5.isEmpty()) {
        return Result.ok(Collections.emptyList());
    }
    //2.決議出其中的用戶id
    List<Long> ids = top5.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)修改 BlogController,增加方法

@GetMapping("/likes/{id}")
 public Result queryBlogLikes(@PathVariable("id") Long id) {
     return blogService.queryBlogLikes(id);
 }

(4)測驗:使用不同的用戶賬號給同一篇探店blog點贊,成功顯示點贊的用戶資訊:

image-20230502191330066

但是顯示的順序出現了問題:如下所示,分別有三個用戶,正確的點贊順序如redis快取所示:1033,1,2

image-20230502192238829

但是從資料庫中查找回傳的用戶順序卻是:1,2 ,1033,前端顯示的用戶頭像id也是按照1,2,1033的順序,這顯然不符合我們要的順序,

image-20230502192727678

我們回傳看之前的代碼:

image-20230502193036853

代碼底層發出的sql陳述句如下:可以發現傳入的引數順序是正確的(1033,1,2),但是回傳的資料順序并不和我們的入參一致:

image-20230502193106886 image-20230502194246868

怎么保證使用IN子句的時候,回傳的資料結果和引數的順序一致呢?

解決方法:使用 order by 指定排序

image-20230502194359482

(5)修改queryBlogLikes()方法,自定義查詢陳述句:

image-20230502195130014

(6)重新啟動專案:可以看到之前的順序已經變為真正的順序了

image-20230502195506328 image-20230502195416833

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/551550.html

標籤:NoSQL

上一篇:【必知必會的MySQL知識】③DML語言

下一篇:返回列表

標籤雲
其他(158361) Python(38110) JavaScript(25398) Java(18011) C(15221) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7156) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5870) 数组(5741) R(5409) Linux(5334) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1964) Web開發(1951) HtmlCss(1930) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day09-達人探店

    功能04-達人探店 5.功能04-達人探店 5.1發布&查看探店筆記 5.1.1發布探店筆記 探店筆記類似點評網站的評價,往往是圖文結合。對應的表有兩個: tb_blog:探店筆記表,包含筆記中的標題、文字、圖片等 tb_blog_comments:其他用戶對探店筆記的評價 /*表: tb_blog ......

    uj5u.com 2023-05-03 07:53:05 more
  • 【必知必會的MySQL知識】③DML語言

    (DML語言) 前言 前面的兩篇文章中,我們已經對MySQL有了基本了解。 并且知道了怎么用工具連接資料庫?怎么創建資料庫?怎么創建表? 這一篇呢我們就來看看怎么在我們創建的表中插入資料、洗掉資料和修改資料。也就是上一篇文章中提到的DML 資料操作語言 準備 根據上一章所說的,我們創建一個db_xi ......

    uj5u.com 2023-05-03 07:52:14 more
  • 【必知必會的MySQL知識】②使用MySQL

    (使用MySQL) 前言 根據上一篇文章【必知必會的MySQL知識】①初探MySQL的內容,想必您對MySQL資料庫有了一個整體的了解了,并且應該在自己電腦上已經安裝上了MySQL。 這一篇呢我們來說一說這么連接上資料庫并且使用它。 啟動MySQL服務 前面MySQL安裝的文章手把手教你安裝MySQ ......

    uj5u.com 2023-05-03 07:46:13 more
  • 讀SQL進階教程筆記14_SQL編程要點

    1. 消滅NULL 1.1. NULL惹人討厭的原因 1.1.1. 進行SQL編碼時,必須考慮違反人類直覺的三值邏輯 1.1.2. 指定IS NULL、IS NOT NULL的時候,不會用到索引,SQL陳述句執行起來性能低下 1.1.2.1. 1 + NULL = NULL 2- NULL = NUL ......

    uj5u.com 2023-05-01 08:25:44 more
  • 手記系列之四 ----- 關于使用MySql的經驗

    前言 本篇文章主要介紹的關于本人在使用MySql記錄筆記的一些使用方法和經驗,溫馨提示,本文有點長,約1.5w字,幾十張圖片,建議收藏查看。 一、MySql安裝 下載地址:https://dev.mysql.com/downloads/ 在安裝MySql之前,查看是否以及安裝過MySql,如果已經安 ......

    uj5u.com 2023-05-01 08:05:48 more
  • 讀SQL進階教程筆記14_SQL編程要點

    1. 消滅NULL 1.1. NULL惹人討厭的原因 1.1.1. 進行SQL編碼時,必須考慮違反人類直覺的三值邏輯 1.1.2. 指定IS NULL、IS NOT NULL的時候,不會用到索引,SQL陳述句執行起來性能低下 1.1.2.1. 1 + NULL = NULL 2- NULL = NUL ......

    uj5u.com 2023-05-01 08:00:09 more
  • 手記系列之四 ----- 關于使用MySql的經驗

    前言 本篇文章主要介紹的關于本人在使用MySql記錄筆記的一些使用方法和經驗,溫馨提示,本文有點長,約1.5w字,幾十張圖片,建議收藏查看。 一、MySql安裝 下載地址:https://dev.mysql.com/downloads/ 在安裝MySql之前,查看是否以及安裝過MySql,如果已經安 ......

    uj5u.com 2023-05-01 07:59:11 more
  • MySQL常用資料庫陳述句

    ==資料庫==1、創建資料庫create database [IF NOT EXISTS] 資料庫名; 2、洗掉資料庫drop database [IF EXISTS] 資料庫名; 3、切換資料庫select database(); 4、查詢資料庫show databases; —————————— ......

    uj5u.com 2023-04-30 07:59:05 more
  • MySQL常用資料庫陳述句

    ==資料庫==1、創建資料庫create database [IF NOT EXISTS] 資料庫名; 2、洗掉資料庫drop database [IF EXISTS] 資料庫名; 3、切換資料庫select database(); 4、查詢資料庫show databases; —————————— ......

    uj5u.com 2023-04-30 07:58:10 more
  • day08-優惠券秒殺04

    功能03-優惠券秒殺04 4.功能03-優惠券秒殺 4.7Redis優化秒殺 4.7.1優化分析 現在來回顧一下優惠券秒殺業務的兩個主要問題: (1)首先是對優惠券的扣減,需要防止庫存超賣現象; (2)其次,需要對每個用戶下單數量進行限制,實作一人一單的功能。 處理秒殺優惠券的業務: 先根據獲取到的 ......

    uj5u.com 2023-04-29 07:31:59 more