亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java實現點贊功能

 更新時間:2022年08月31日 11:44:28   作者:在電腦上  
這篇文章主要為大家詳細介紹了java實現點贊功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java實現點贊功能的具體代碼,供大家參考,具體內容如下

實現思路:

將點贊的數據先保存到redis中,然后定時同步到數據庫

第一步:

在redis中創(chuàng)建二個hash 用于存儲 用戶點贊記錄及記錄點贊數
MAP_USER_LIKED :用戶點贊的記錄 key:記錄id::用戶id value:1
MAP_USER_LIKED_COUNT:記錄點贊數 key: 記錄id value:數量

第二步:

創(chuàng)建枚舉類

@Getter
public enum LikeStatusEnum {
? ? LIKE(1,"點贊"),
? ? UNLIKE(0,"取消點贊/未點贊");

? ? private Integer code;
? ? private String msg;

? ? LikeStatusEnum(Integer code,String msg){
? ? ? ? this.code = code;
? ? ? ? this.msg = msg;
? ? }
}
@Getter
public enum RedisHashEnum {
? ? MAP_USER_LIKED("MAP_USER_LIKED"),
? ? MAP_USER_LIKED_COUNT("MAP_USER_LIKED_COUNT");
? ? private String value;

? ? RedisHashEnum(String value){
? ? ? ? this.value =value;
? ? }
}

第三步:

將實現類寫好

@Service
public class PostRedisServiceImpl implements PostRedisService {

? ? @Resource
? ? private RedisTemplate redisTemplate;

? ? @Autowired(required = false)
? ? public void ?setRedisTemplate(RedisTemplate redisTemplate){
? ? ? ? RedisSerializer serializer = new StringRedisSerializer();
? ? ? ? redisTemplate.setKeySerializer(serializer);
? ? ? ? redisTemplate.setValueSerializer(serializer);
? ? ? ? redisTemplate.setHashKeySerializer(serializer);
? ? ? ? redisTemplate.setHashValueSerializer(serializer);
? ? ? ? this.redisTemplate = redisTemplate;
? ? }
? ? /**
? ? ?* 點贊、取消點贊
? ? ?*
? ? ?* @param recordId
? ? ?* @param userId
? ? ?*/
? ? @Override
? ? public void saveLikeRedis(String recordId, String userId,Integer status) {
? ? ? ? String key =recordId+"::"+userId;
? ? ? ? redisTemplate.opsForHash().put(RedisHashEnum.MAP_USER_LIKED,key, status);
? ? }

? ? /**
? ? ?* 從Redis中刪除一條點贊數
? ? ?*
? ? ?* @param recordId
? ? ?* @param userId
? ? ?*/
? ? @Override
? ? public void deleteLikeFromRedis(String recordId, String userId) {
? ? ? ? String key =recordId+"::"+userId;
? ? ? ? redisTemplate.opsForHash().delete(RedisHashEnum.MAP_USER_LIKED,key);
? ? }

? ? /**
? ? ?* 該記錄 點贊加1
? ? ?*
? ? ?* @param recordId
? ? ?*/
? ? @Override
? ? public void incrementLikedCount(String recordId) {
? ? ? ? redisTemplate.opsForHash().increment(RedisHashEnum.MAP_USER_LIKED_COUNT,recordId,1);
? ? }

? ? /**
? ? ?* 譔記錄 點贊減1
? ? ?*
? ? ?* @param recordId
? ? ?*/
? ? @Override
? ? public void decrementLikeCount(String recordId) {
? ? ? ? redisTemplate.opsForHash().increment(RedisHashEnum.MAP_USER_LIKED_COUNT,recordId,-1);
? ? }
}

第四步提供接口:

?/**
? ? ?* 進行點贊、取消點贊
? ? ?*
? ? ?* @param vo
? ? ?*/
? ? @Override
? ? public Result addKudos(KudosVo vo) {
? ? ? ? if(vo == null){
? ? ? ? ? ? return Result.error(ResponseMessage.PARAMERROR);
? ? ? ? }
? ? ? ? if("1".equals(vo.getStatus())){
? ? ? ? ? ? // 點贊
? ? ? ? ? ? postRedisService.saveLikeRedis(vo.getRecordId(),vo.getUserId(), LikeStatusEnum.LIKE.getCode());
? ? ? ? ? ? // 記錄+1
? ? ? ? ? ? postRedisService.incrementLikedCount(vo.getRecordId());
? ? ? ? }else if("0".equals(vo.getStatus())){
? ? ? ? ? ? // 取消點贊 更新狀態(tài)
? ? ? ? ? ? postRedisService.saveLikeRedis(vo.getRecordId(),vo.getUserId(), LikeStatusEnum.UNLIKE.getCode());

// ? ? ? ? ? ?postRedisService.deleteLikeFromRedis(vo.getRecordId(),vo.getUserId());
? ? ? ? ? ? // 記錄 -1
? ? ? ? ? ? postRedisService.decrementLikeCount(vo.getRecordId());
? ? ? ? }
? ? ? ? return Result.success(ResponseMessage.SUCCESS);
? ? }

最后定時將redis 中的數據同步到數據庫

?/**每 5 分鐘執(zhí)行一次
? ? ?* 將點贊人員同步到庫中
? ? ?* */
// ? ?@Transactional(rollbackFor =Exception.class)
? ? @Scheduled(cron = "0 */5 * * * ?")
? ? public void transLikdedFromRedis()throws IOException{
? ? ? ? List<RedisLikedUserDTO> dtoList = getLikedUserFromRedis();
? ? ? ? dtoList.stream().forEach(x->{
? ? ? ? ? ? // 通過記錄及人員id 查詢 該 人員是否點贊
? ? ? ? ? ? LambdaQueryWrapper<WorkCircleRecord> queryWrapper = new LambdaQueryWrapper<>();
? ? ? ? ? ? queryWrapper.eq(WorkCircleRecord::getDeleteIf,true);
? ? ? ? ? ? queryWrapper.eq(WorkCircleRecord::getId,x.getRecordId());
? ? ? ? ? ? queryWrapper.like(WorkCircleRecord::getWorkKudosUserIds,x.getUserId());
? ? ? ? ? ? WorkCircleRecord record = workCircleRecordMapper.selectOne(queryWrapper);
? ? ? ? ? ? // 點贊
? ? ? ? ? ? if(record == null&&"1".equals(x.getStatus())){
? ? ? ? ? ? ? ? // 根據記錄id ?查詢
? ? ? ? ? ? ? ? LambdaQueryWrapper<WorkCircleRecord> wrapper = new LambdaQueryWrapper<>();
? ? ? ? ? ? ? ? wrapper.eq(WorkCircleRecord::getDeleteIf,true);
? ? ? ? ? ? ? ? wrapper.eq(WorkCircleRecord::getId,x.getRecordId());
? ? ? ? ? ? ? ? WorkCircleRecord workCircleRecord = workCircleRecordMapper.selectOne(wrapper);
? ? ? ? ? ? ? ? if(workCircleRecord != null){
? ? ? ? ? ? ? ? ? ? // 沒有此人員 添加
? ? ? ? ? ? ? ? ? ? if(StringUtils.isBlank(workCircleRecord.getWorkKudosUserIds())){
? ? ? ? ? ? ? ? ? ? ? ? // 沒有點贊人員
? ? ? ? ? ? ? ? ? ? ? ? workCircleRecord.setWorkKudosUserIds(x.getUserId());
? ? ? ? ? ? ? ? ? ? ? ? SysUser user = sysUserMapper.selectById(x.getUserId());
? ? ? ? ? ? ? ? ? ? ? ? if(user !=null){
? ? ? ? ? ? ? ? ? ? ? ? ? ? workCircleRecord.setWorkKudosUser(user.getRealname());
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? ? ? ? ? // 有點贊人員
? ? ? ? ? ? ? ? ? ? ? ? String userIds = x.getUserId()+","+workCircleRecord.getWorkKudosUserIds();
? ? ? ? ? ? ? ? ? ? ? ? workCircleRecord.setWorkKudosUserIds(userIds);
? ? ? ? ? ? ? ? ? ? ? ? SysUser user = sysUserMapper.selectById(x.getUserId());
? ? ? ? ? ? ? ? ? ? ? ? String userNames = user.getRealname()+workCircleRecord.getWorkKudosUser();
? ? ? ? ? ? ? ? ? ? ? ? workCircleRecord.setWorkKudosUser(userNames);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? workCircleRecordMapper.updateById(workCircleRecord);
? ? ? ? ? ? ? ? }

? ? ? ? ? ? }else if("0".equals(x.getStatus())) {
? ? ? ? ? ? ? ? // 有記錄 并取消點贊
? ? ? ? ? ? ? ? // 根據記錄id ?查詢
? ? ? ? ? ? ? ? LambdaQueryWrapper<WorkCircleRecord> wrapper = new LambdaQueryWrapper<>();
? ? ? ? ? ? ? ? wrapper.eq(WorkCircleRecord::getDeleteIf,true);
? ? ? ? ? ? ? ? wrapper.eq(WorkCircleRecord::getId,x.getRecordId());
? ? ? ? ? ? ? ? WorkCircleRecord workCircleRecord = workCircleRecordMapper.selectOne(wrapper);
? ? ? ? ? ? ? ? // 將此點贊人員去除
? ? ? ? ? ? ? ? if(workCircleRecord !=null){
? ? ? ? ? ? ? ? ? ? SysUser user = sysUserMapper.selectById(x.getUserId());
? ? ? ? ? ? ? ? ? ? List<String> userIds = Arrays.asList(workCircleRecord.getWorkKudosUserIds().split(","));
? ? ? ? ? ? ? ? ? ? List<String> userNames =Arrays.asList(workCircleRecord.getWorkKudosUser().split(","));
? ? ? ? ? ? ? ? ? ? userIds.remove(x.getUserId());
? ? ? ? ? ? ? ? ? ? userNames.remove(user.getRealname());
? ? ? ? ? ? ? ? ? ? workCircleRecord.setWorkKudosUserIds(String.join(",",userIds));
? ? ? ? ? ? ? ? ? ? workCircleRecord.setWorkKudosUser(String.join(",",userNames));
? ? ? ? ? ? ? ? ? ? workCircleRecordMapper.updateById(workCircleRecord);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }
/**獲取 所有點贊的人員
? ? ?* */
? ? public List<RedisLikedUserDTO> getLikedUserFromRedis() throws IOException{
? ? ? ? List<RedisLikedUserDTO> dtoList = new ArrayList<>();
? ? ? ? // 通過游標獲取所有鍵值對
? ? ? ? Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan(RedisHashEnum.MAP_USER_LIKED.getValue(),ScanOptions.NONE);
? ? ? ? while (cursor.hasNext()){
? ? ? ? ? ? Map.Entry<Object,Object> map = cursor.next();
? ? ? ? ? ? String key = map.getKey().toString();
? ? ? ? ? ? String[] split = key.split("::");
? ? ? ? ? ? RedisLikedUserDTO dto = new RedisLikedUserDTO();
? ? ? ? ? ? dto.setRecordId(split[0]);
? ? ? ? ? ? dto.setUserId(split[1]);
? ? ? ? ? ? dto.setStatus(Integer.parseInt(map.getValue().toString()));
? ? ? ? ? ? dtoList.add(dto);

? ? ? ? ? ? // 將redis 中的記錄刪除
? ? ? ? ? ? redisTemplate.opsForHash().delete(RedisHashEnum.MAP_USER_LIKED.getValue(),key);
? ? ? ? }
? ? ? ? cursor.close();
? ? ? ? return dtoList;
? ? }
/**每 5 分鐘執(zhí)行一次
? ? ?* 將點贊數同步到庫中
? ? ?* */
? ? @Transactional(rollbackFor =Exception.class)
? ? @Scheduled(cron = "0 */5 * * * ?")
? ? public void transLikedCountFromRedis() throws IOException{
? ? ? ? // 獲取所有的點贊數
? ? ? ? List<RedisLikeCountDTO> dtoList = getLikedCountFromRedis();
? ? ? ? // 獲取所有的記錄id
? ? ? ? List<String> recordIdList = dtoList.stream().map(x->x.getRecordId()).collect(Collectors.toList());
? ? ? ? if(CollectionUtils.isNotEmpty(recordIdList)){
? ? ? ? ? ? List<WorkCircleRecord> recordList = workCircleRecordMapper.selectBatchIds(recordIdList);
? ? ? ? ? ? if(CollectionUtils.isNotEmpty(recordList)){
? ? ? ? ? ? ? ? // 通過id 匹配
? ? ? ? ? ? ? ? dtoList.stream().forEach(x->{
? ? ? ? ? ? ? ? ? ? recordList.stream().forEach(k->{
? ? ? ? ? ? ? ? ? ? ? ? if(x.getRecordId().equals(k.getId())){
? ? ? ? ? ? ? ? ? ? ? ? ? ? Integer num = x.getCount()+k.getWorkKudos();
? ? ? ? ? ? ? ? ? ? ? ? ? ? if(num<0){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? k.setWorkKudos(0);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? k.setWorkKudos(num);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? workCircleRecordMapper.updateById(k);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? ? ? });
? ? ? ? ? ? }
? ? ? ? }
? ? }
/** 取出所有的點贊數
? ? ?* */
? ? public List<RedisLikeCountDTO> getLikedCountFromRedis() throws IOException {
? ? ? ? List<RedisLikeCountDTO> dtoList = new ArrayList<>();
? ? ? ? Cursor<Map.Entry<Object,Object>> cursor= ?redisTemplate.opsForHash().scan(RedisHashEnum.MAP_USER_LIKED_COUNT, ScanOptions.NONE);
? ? ? ? while (cursor.hasNext()){
? ? ? ? ? ? Map.Entry<Object,Object> map = cursor.next();
? ? ? ? ? ? // 獲取 點贊數
? ? ? ? ? ? String key = map.getKey().toString();
? ? ? ? ? ? RedisLikeCountDTO dto = new RedisLikeCountDTO();
? ? ? ? ? ? dto.setRecordId(key);
? ? ? ? ? ? dto.setCount(Integer.parseInt(map.getValue().toString()));
? ? ? ? ? ? dtoList.add(dto);
? ? ? ? ? ? redisTemplate.opsForHash().delete(RedisHashEnum.MAP_USER_LIKED_COUNT,key);
? ? ? ? }
? ? ? ? cursor.close();
? ? ? ? return dtoList;
? ? }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java中數組復制的三種方式小結

    Java中數組復制的三種方式小結

    在Java中,數組復制是一種常見的操作,它允許開發(fā)人員在不修改原始數組的情況下創(chuàng)建一個新的數組,本文就來介紹三種方法,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • spring boot+vue 的前后端分離與合并方案實例詳解

    spring boot+vue 的前后端分離與合并方案實例詳解

    這篇文章主要介紹了spring boot+vue 的前后端分離與合并方案實例詳解,需要的朋友可以參考下
    2017-11-11
  • Java網絡編程教程之設置請求超時的方法

    Java網絡編程教程之設置請求超時的方法

    這篇文章主要給大家介紹了關于Java網絡編程教程之設置請求超時的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-12-12
  • Springboot實現異步任務線程池代碼實例

    Springboot實現異步任務線程池代碼實例

    這篇文章主要介紹了Springboot實現異步任務線程池代碼實例,異步任務線程池是一種用于處理異步任務的機制,它可以提高程序的并發(fā)性能和響應速度,通過將任務提交給線程池,線程池會自動管理線程的創(chuàng)建和銷毀,從而避免了頻繁創(chuàng)建和銷毀線程的開銷,需要的朋友可以參考下
    2023-10-10
  • 通過實例學習JAVA對象轉成XML輸出

    通過實例學習JAVA對象轉成XML輸出

    這篇文章主要介紹了通過實例學習JAVA對象轉成XML輸出,做流程圖的項目時,新的流程定義為xml的,需要對xml與java對象進行互轉,下面我們來深入學習,需要的朋友可以參考下
    2019-06-06
  • Springboot集成Elasticsearch的步驟與相關功能

    Springboot集成Elasticsearch的步驟與相關功能

    ElasticSearch是開源搜索平臺領域的一個新成員,?ElasticSearch是一個基于Lucene構建的開源,分布式,RESTful搜索引擎,這篇文章主要給大家介紹了關于Springboot集成Elasticsearch的相關資料,需要的朋友可以參考下
    2021-12-12
  • Mybatis實體類對象入參查詢的筆記

    Mybatis實體類對象入參查詢的筆記

    這篇文章主要介紹了Mybatis實體類對象入參查詢的筆記,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SSM框架整合之Spring+SpringMVC+MyBatis實踐步驟

    SSM框架整合之Spring+SpringMVC+MyBatis實踐步驟

    大家都知道Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架,本文主要介紹三大框架的整合包含spring和mybatis的配置文件,還有spring-mvc的配置文件的詳細介紹,通過項目實踐步驟給大家詳細介紹,感興趣的朋友一起看看吧
    2021-06-06
  • 最新jsonwebtoken-jwt 0.12.3 基本使用小結

    最新jsonwebtoken-jwt 0.12.3 基本使用小結

    這篇文章主要介紹了最新jsonwebtoken-jwt 0.12.3 基本使用小結,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-12-12
  • Java中Spring的Security使用詳解

    Java中Spring的Security使用詳解

    這篇文章主要介紹了Java中Spring的Security使用詳解,在web應用開發(fā)中,安全無疑是十分重要的,選擇Spring Security來保護web應用是一個非常好的選擇,需要的朋友可以參考下
    2023-07-07

最新評論