Redis是如何实现点赞、取消点赞的?,Java常见编程笔试题

该博客介绍了如何使用Redis和Java实现点赞、取消点赞功能。通过`RedisKeyUtils`生成的键来存储用户点赞数据,利用`opsForHash().scan`遍历Redis中的数据,转化为`UserLike`对象并存入数据库。同时提供了数据库设计,包括用户点赞表结构和`UserLike`实体类。此外,还讨论了定时任务使用Quartz进行数据持久化。
摘要由CSDN通过智能技术生成

}

@Override

public List getLikedDataFromRedis() {

Cursor<Map.Entry<Object, Object>> cursor = redisTemplate.opsForHash().scan(RedisKeyUtils.MAP_KEY_USER_LIKED, ScanOptions.NONE);

List list = new ArrayList<>();

while (cursor.hasNext()){

Map.Entry<Object, Object> entry = cursor.next();

String key = (String) entry.getKey();

//分离出 likedUserId,likedPostId

String[] split = key.split(“::”);

String likedUserId = split[0];

String likedPostId = split[1];

Integer value = (Integer) entry.getValue();

//组装成 UserLike 对象

UserLike userLike = new UserLike(likedUserId, likedPostId, value);

list.add(userLike);

//存到 list 后从 Redis 中删除

redisTemplate.opsForHash().delete(RedisKeyUtils.MAP_KEY_USER_LIKED, key);

}

return list;

}

@Override

public List getLikedCountFromRedis() {

Cursor<Map.Entry<Object, Object>> cursor = redisTemplate.opsForHash().scan(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT, ScanOptions.NONE);

List list = new ArrayList<>();

while (cursor.hasNext()){

Map.Entry<Object, Object> map = cursor.next();

//将点赞数量存储在 LikedCountDT

String key = (String)map.getKey();

LikedCountDTO dto = new LikedCountDTO(key, (Integer) map.getValue());

list.add(dto);

//从Redis中删除这条记录

redisTemplate.opsForHash().delete(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT, key);

}

return list;

}

}

用到的工具类和枚举类

==============

RedisKeyUtils, 用于根据一定规则生成 key

public class RedisKeyUtils {

//保存用户点赞数据的key

public static final String MAP_KEY_USER_LIKED = “MAP_USER_LIKED”;

//保存用户被点赞数量的key

public static final String MAP_KEY_USER_LIKED_COUNT = “MAP_USER_LIKED_COUNT”;

/**

  • 拼接被点赞的用户id和点赞的人的id作为key。格式 222222::333333

  • @param likedUserId 被点赞的人id

  • @param likedPostId 点赞的人的id

  • @return

*/

public static String getLikedKey(String likedUserId, String likedPostId){

StringBuilder builder = new StringBuilder();

builder.append(likedUserId);

builder.append(“::”);

builder.append(likedPostId);

return builder.toString();

}

}

LikedStatusEnum 用户点赞状态的枚举类

package com.solo.coderiver.user.enums;

import lombok.Getter;

/**

  • 用户点赞的状态

*/

@Getter

public enum LikedStatusEnum {

LIKE(1, “点赞”),

UNLIKE(0, “取消点赞/未点赞”),

;

private Integer code;

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值