最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis筆記點贊排行榜的實現(xiàn)示例

 更新時間:2023年01月29日 15:50:02   作者:卒獲有所聞  
探店筆記類似點評網(wǎng)站的評價,本文主要介紹了Redis筆記點贊排行榜的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、發(fā)布探店筆記

探店筆記類似點評網(wǎng)站的評價,往往是圖文結(jié)合。對應(yīng)的表有兩個

  • 探店筆記表(主鍵、商戶id、用戶id、標題、文字、圖片、探店文字描述、點贊數(shù)量、評論數(shù)量)
  • 評價表(筆記的評價)

 先上傳圖片請求一次保存圖片接口,再點發(fā)布請求發(fā)布接口。這兩個接口已經(jīng)寫好

二、實現(xiàn)查看筆記接口

BlogController

@RestController
@RequestMapping("/blog")
public class BlogController {
 
    @Resource
    private IBlogService blogService;
   
    @GetMapping("/hot")
    public Result queryHotBlog(@RequestParam(value = "current", defaultValue = "1") Integer current) {
 
        return blogService.queryHotBlog(current);
    }
 
    @GetMapping("/{id}")
    public Result queryBlogById(@PathVariable("id") String id){
        return blogService.queryBlogById(id);
    }
}

IBlogService

public interface IBlogService extends IService<Blog> {
 
    Result queryBlogById(String id);
 
    Result queryHotBlog(Integer current);
}

BlogServiceImpl

@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {
 
    @Autowired
    private IUserService userService;
 
    @Override
    public Result queryHotBlog(Integer current) {
        // 根據(jù)用戶查詢
        Page<Blog> page = query()
                .orderByDesc("liked")
                .page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));
        // 獲取當前頁數(shù)據(jù)
        List<Blog> records = page.getRecords();
        // 查詢用戶
        records.forEach(this::queryBlogUser);
        return Result.ok(records);
    }
 
    private void queryBlogUser(Blog blog) {
        Long userId = blog.getUserId();
        User user = userService.getById(userId);
        blog.setName(user.getNickName());
        blog.setIcon(user.getIcon());
    }
 
    @Override
    public Result queryBlogById(String id) {
        Blog blog = getById(id);
        
        if(blog == null){
            return Result.fail("筆記不存在!");
        }
 
        queryBlogUser(blog);
 
        return Result.ok(blog);
    }
}

三、點贊功能

現(xiàn)在已經(jīng)寫好的點贊接口

問題:這樣寫接口,可以一直按點贊重復(fù)點贊

需求

  • 同一個用戶只能點贊一次,再次點贊則取消點贊
  • 如果當前用戶已經(jīng)點贊,則點贊按鈕高亮顯(前端已經(jīng)實現(xiàn),判斷blog類的isLike屬性)

實現(xiàn)步驟

  • 給Blog類中添加一個isLike字段,表示是否被當前用戶點贊
  • 修改點贊功能,利用redis的set集合判斷用戶是否贊過,未贊則點贊數(shù)+1,贊過則-1
  • 修改根據(jù)id查詢blog的業(yè)務(wù),判斷當前用戶是否點贊過,賦值給isLike字段
  • 修改分頁查詢blog業(yè)務(wù),判斷當前用戶是否贊過,賦值isLike字段

業(yè)務(wù)實現(xiàn)

@RestController
@RequestMapping("/blog")
public class BlogController {
 
    @Resource
    private IBlogService blogService;
 
    @PutMapping("/like/{id}")
    public Result likeBlog(@PathVariable("id") Long id) {
        return blogService.likeBlog(id);
    }
 
    @GetMapping("/hot")
    public Result queryHotBlog(@RequestParam(value = "current", defaultValue = "1") Integer current) {
        return blogService.queryHotBlog(current);
    }
 
    @GetMapping("/{id}")
    public Result queryBlogById(@PathVariable("id") String id){
        return blogService.queryBlogById(id);
    }
}

編寫完點贊操作的接口后還要修改之前的查詢接口,增加查詢是否已經(jīng)點贊 

@Service
public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IBlogService {
 
    @Autowired
    private IUserService userService;
 
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
 
    @Override
    public Result queryHotBlog(Integer current) {
        // 根據(jù)用戶查詢
        Page<Blog> page = query()
                .orderByDesc("liked")
                .page(new Page<>(current, SystemConstants.MAX_PAGE_SIZE));
        // 獲取當前頁數(shù)據(jù)
        List<Blog> records = page.getRecords();
        // 查詢用戶
        records.forEach(blog -> {
            this.queryBlogUser(blog);
            this.isBlogLiked(blog);
        });
        return Result.ok(records);
    }
 
    @Override
    public Result likeBlog(Long id) {
        // 1、獲取登錄用戶
        UserDTO user = UserHolder.getUser();
        // 2、判斷當前登錄用戶是否已經(jīng)點贊
        Boolean isMember = stringRedisTemplate.opsForSet().isMember(RedisConstants.BLOG_LIKED_KEY + id, user.getId().toString());
        if(BooleanUtil.isFalse(isMember)) {
            // 3、如果未點贊,可以點贊
            // 3.1、數(shù)據(jù)庫點贊數(shù) +1
            boolean isSuccess = update().setSql("liked = liked+1").eq("id", id).update();
            // 3.2、保存用戶到 Redis 的 set 集合
            if(isSuccess){
                stringRedisTemplate.opsForSet().add(RedisConstants.BLOG_LIKED_KEY + id, user.getId().toString());
            }
        } else {
            // 4、如果已點贊,取消點贊
            // 4.1、數(shù)據(jù)庫點贊數(shù) -1
            boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();
            // 4.2、把用戶從 Redis 的 set 集合移除
            if(isSuccess){
                stringRedisTemplate.opsForSet().remove(RedisConstants.BLOG_LIKED_KEY + id, user.getId().toString());
            }
        }
        return Result.ok();
    }
 
 
    private void queryBlogUser(Blog blog) {
        Long userId = blog.getUserId();
        User user = userService.getById(userId);
        blog.setName(user.getNickName());
        blog.setIcon(user.getIcon());
    }
 
    @Override
    public Result queryBlogById(String id) {
        Blog blog = getById(id);
        
        if(blog == null){
            return Result.fail("筆記不存在!");
        }
 
        queryBlogUser(blog);
        // 查詢 Blog 是否被點贊
        isBlogLiked(blog);
 
        return Result.ok(blog);
    }
 
    private void isBlogLiked(Blog blog) {
        Long userId = blog.getUserId();
        String key = RedisConstants.BLOG_LIKED_KEY + blog.getId();
        Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId.toString());
        blog.setIsLike(BooleanUtil.isTrue(isMember));
    }
}

四、點贊排行榜 

查出給這個筆記點贊的人,類似微信朋友圈的點贊,可以展示誰點贊了,而且我們要進行排序

所以我們得用SortedSet這種數(shù)據(jù)類型

1、修改點贊邏輯

把原本存入set改為存入zset多加個分數(shù),分數(shù)就是時間戳

@Override
    public Result likeBlog(Long id) {
        // 1、獲取登錄用戶
        UserDTO user = UserHolder.getUser();
        // 2、判斷當前登錄用戶是否已經(jīng)點贊
        Double score = stringRedisTemplate.opsForZSet().score(RedisConstants.BLOG_LIKED_KEY + id, user.getId().toString());
        if(score == null) {
            // 3、如果未點贊,可以點贊
            // 3.1、數(shù)據(jù)庫點贊數(shù) +1
            boolean isSuccess = update().setSql("liked = liked+1").eq("id", id).update();
            // 3.2、保存用戶到 Redis 的 set 集合
            if(isSuccess){
                // 時間作為 key 的 score
                stringRedisTemplate.opsForZSet().add(RedisConstants.BLOG_LIKED_KEY + id, user.getId().toString(), System.currentTimeMillis());
            }
        } else {
            // 4、如果已點贊,取消點贊
            // 4.1、數(shù)據(jù)庫點贊數(shù) -1
            boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();
            // 4.2、把用戶從 Redis 的 set 集合移除
            if(isSuccess){
                stringRedisTemplate.opsForZSet().remove(RedisConstants.BLOG_LIKED_KEY + id, user.getId().toString());
            }
        }
        return Result.ok();
    }

然后是否被點贊的方法也要修改,根據(jù)key取出分數(shù),分數(shù)不為null就是點贊過了

 private void isBlogLiked(Blog blog) {
        UserDTO user = UserHolder.getUser();
        if(user == null){
            return;
        }
        Long userId = user.getId();
        String key = RedisConstants.BLOG_LIKED_KEY + blog.getId();
        Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString());
        blog.setIsLike(score != null);
    }

2、點贊排行榜功能

需求:實現(xiàn)前五個點贊的用戶返回

我們先用動態(tài)id去redis中查詢出前五個點贊用戶的id

然后根據(jù)id去數(shù)據(jù)庫中查詢信息封裝到dto再返回

    @GetMapping("/likes/{id}")
    public Result queryBlogLikes(@PathVariable("id") String id) {
        return blogService.queryBlogLikes(id);
    }
    @Override
    public Result queryBlogLikes(String id) {
        String key = RedisConstants.BLOG_LIKED_KEY + id;
        // 查詢 top5 的點贊用戶
        Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);
        if(top5 == null){
            return Result.ok(Collections.emptyList());
        }
        // 解析出其中的用戶id
        List<Long> ids = top5.stream().map(Long::valueOf).collect(Collectors.toList());
        String join = StrUtil.join(",", ids);
        // 根據(jù)用戶id查詢用戶
        List<UserDTO> userDTOS = userService.query().in("id", ids).last("order by filed(id, "+join+")").list()
                .stream()
                .map(user -> BeanUtil.copyProperties(user, UserDTO.class))
                .collect(Collectors.toList());
 
        return Result.ok(userDTOS);
    }

注意:如果我們mp直接用in來查詢根本不能保證點贊的順序,因為in查詢出來的是按照id順序返回的,沒有排序,我們要按照查詢id的順序來查,order by field(id,5,1)這樣

到此這篇關(guān)于Redis筆記點贊排行榜的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Redis筆記點贊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis實現(xiàn)會話管理和token認證的示例代碼

    Redis實現(xiàn)會話管理和token認證的示例代碼

    會話管理和身份認證是實現(xiàn)用戶登錄、權(quán)限管理等功能的基礎(chǔ),本文主就來介紹一下Redis實現(xiàn)會話管理和token認證的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • redis實現(xiàn)分布式session的解決方案

    redis實現(xiàn)分布式session的解決方案

    session存放在服務(wù)器,關(guān)閉瀏覽器不會失效,本文主要介紹了redis實現(xiàn)分布式session的解決方案,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis教程(十三):管線詳解

    Redis教程(十三):管線詳解

    這篇文章主要介紹了Redis教程(十三):管線詳解,本文講解了請求應(yīng)答協(xié)議和RTT、管線(pipelining)、Benchmark等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • redis+mysql+quartz 一種紅包發(fā)送功能的實現(xiàn)

    redis+mysql+quartz 一種紅包發(fā)送功能的實現(xiàn)

    這篇文章主要介紹了redis+mysql+quartz 一種紅包發(fā)送功能的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • redis和rabbitmq實現(xiàn)延時隊列的示例代碼

    redis和rabbitmq實現(xiàn)延時隊列的示例代碼

    在高并發(fā)場景下,延遲隊列顯得尤為重要,本文主要介紹了兩種方式,redis和rabbitmq實現(xiàn)延時隊列,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Redis 5.05 單獨模式安裝及配置方法

    Redis 5.05 單獨模式安裝及配置方法

    這篇文章主要介紹了Redis 5.05 單獨模式安裝,文中通過代碼給大家介紹了Redis 5.0.5 單節(jié)點 安裝配置方法,需要的朋友可以參考下
    2019-10-10
  • 詳解如何利用Redis實現(xiàn)生成唯一ID

    詳解如何利用Redis實現(xiàn)生成唯一ID

    隨著下單流量逐漸上升,為了降低數(shù)據(jù)庫的訪問壓力,需要通過請求唯一ID+redis分布式鎖來防止接口重復(fù)提交。今天我們就一起來看探討一下,如何通過服務(wù)端來完成請求唯一?ID?的生成
    2022-11-11
  • Redis主從復(fù)制問題和擴容問題的解決思路

    Redis主從復(fù)制問題和擴容問題的解決思路

    這篇文章主要介紹了Redis主從復(fù)制問題和擴容問題的解決思路,其中擴容問題的解決思路來自Redis作者,需要的朋友可以參考下
    2014-06-06
  • Redis與MySQL數(shù)據(jù)一致性問題的策略模式及解決方案

    Redis與MySQL數(shù)據(jù)一致性問題的策略模式及解決方案

    開發(fā)中,一般會使用Redis緩存一些常用的熱點數(shù)據(jù)用來減少數(shù)據(jù)庫IO,提高系統(tǒng)的吞吐量,本文將給大家介紹了Redis與MySQL數(shù)據(jù)一致性問題的策略模式及解決方案,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • 淺析redis cluster介紹與gossip協(xié)議

    淺析redis cluster介紹與gossip協(xié)議

    這篇文章主要介紹了redis cluster介紹與gossip協(xié)議,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論

赤水市| 安阳县| 永安市| 山东| 依兰县| 襄垣县| 苗栗市| 阜新市| 禄劝| 昭苏县| 贺兰县| 康马县| 鄢陵县| 囊谦县| 北川| 洪湖市| 新津县| 漳平市| 萨嘎县| 滨海县| 怀仁县| 平遥县| 嘉荫县| 龙南县| 商丘市| 连州市| 永仁县| 南木林县| 沂南县| 合肥市| 垫江县| 长岛县| 浦东新区| 和政县| 博爱县| 宣化县| 永登县| 大荔县| 民县| 泰来县| 东安县|