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

java實現(xiàn)點贊功能

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

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

實現(xiàn)思路:

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

第一步:

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

第二步:

創(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;
? ? }
}

第三步:

將實現(xiàn)類寫好

@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中刪除一條點贊數(shù)
? ? ?*
? ? ?* @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 中的數(shù)據(jù)同步到數(shù)據(jù)庫

?/**每 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())){
? ? ? ? ? ? ? ? // 根據(jù)記錄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())) {
? ? ? ? ? ? ? ? // 有記錄 并取消點贊
? ? ? ? ? ? ? ? // 根據(jù)記錄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í)行一次
? ? ?* 將點贊數(shù)同步到庫中
? ? ?* */
? ? @Transactional(rollbackFor =Exception.class)
? ? @Scheduled(cron = "0 */5 * * * ?")
? ? public void transLikedCountFromRedis() throws IOException{
? ? ? ? // 獲取所有的點贊數(shù)
? ? ? ? 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);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? ? ? });
? ? ? ? ? ? }
? ? ? ? }
? ? }
/** 取出所有的點贊數(shù)
? ? ?* */
? ? 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();
? ? ? ? ? ? // 獲取 點贊數(shù)
? ? ? ? ? ? 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;
? ? }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解關(guān)于mybatis-plus中Service和Mapper的分析

    詳解關(guān)于mybatis-plus中Service和Mapper的分析

    這篇文章主要介紹了詳解關(guān)于mybatis-plus中Service和Mapper的分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Mybatis條件if test如何使用枚舉值

    Mybatis條件if test如何使用枚舉值

    這篇文章主要介紹了Mybatis條件if test如何使用枚舉值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java創(chuàng)建多線程局域網(wǎng)聊天室實例

    Java創(chuàng)建多線程局域網(wǎng)聊天室實例

    這篇文章主要介紹了Java創(chuàng)建多線程局域網(wǎng)聊天室實例,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談Java中的n種隨機數(shù)產(chǎn)生辦法

    淺談Java中的n種隨機數(shù)產(chǎn)生辦法

    眾所周知,隨機數(shù)是任何一種編程語言最基本的特征之一。而生成隨機數(shù)的基本方式也是相同的:產(chǎn)生一個0到1之間的隨機數(shù)??此坪唵危袝r我們也會忽略了一些有趣的功能。
    2015-09-09
  • Java?超詳細講解對象的構(gòu)造及初始化

    Java?超詳細講解對象的構(gòu)造及初始化

    面向?qū)ο竽耸荍ava語言的核心,是程序設(shè)計的思想。Java語言的面向?qū)ο蠹夹g(shù)包括了面向?qū)ο蠛兔嫦蜻^程的基本概念,面向?qū)ο蟮奶卣鳎琂ava語言的類,對象,修飾符,抽象類等一系列的知識點
    2022-03-03
  • java控制臺實現(xiàn)學(xué)生信息管理系統(tǒng)

    java控制臺實現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java控制臺實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解SpringBoot集成Redis來實現(xiàn)緩存技術(shù)方案

    詳解SpringBoot集成Redis來實現(xiàn)緩存技術(shù)方案

    本篇文章主要介紹了詳解SpringBoot集成Redis來實現(xiàn)緩存技術(shù)方案,具有一定的參考價值,有興趣的可以了解一下
    2017-06-06
  • Spring AOP方法內(nèi)部調(diào)用不生效的解決方案

    Spring AOP方法內(nèi)部調(diào)用不生效的解決方案

    最近有個需求,統(tǒng)計某個方法的調(diào)用次數(shù),開始使用 Spring AOP 實現(xiàn),后來發(fā)現(xiàn)當方法被內(nèi)部調(diào)用時,切面邏輯將不會生效,所以本文就給大家介紹了Spring AOP方法內(nèi)部調(diào)用不生效的解決方案,需要的朋友可以參考下
    2025-01-01
  • Java簡單從文件讀取和輸出的實例

    Java簡單從文件讀取和輸出的實例

    下面小編就為大家?guī)硪黄狫ava簡單從文件讀取和輸出的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 基于Java實現(xiàn)中文分詞系統(tǒng)的示例代碼

    基于Java實現(xiàn)中文分詞系統(tǒng)的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)一個簡易的中文分詞系統(tǒng),文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下
    2022-07-07

最新評論

松潘县| 安阳县| 恩施市| 巩留县| 大名县| 时尚| 湟中县| 麦盖提县| 来安县| 湖南省| 嘉祥县| 长宁区| 尉犁县| 大宁县| 泗阳县| 泾川县| 长丰县| 黄骅市| 远安县| 和顺县| 晋宁县| 康乐县| 蚌埠市| 吉水县| 裕民县| 娱乐| 新巴尔虎左旗| 五家渠市| 漳浦县| 鹿邑县| 谷城县| 无棣县| 泰安市| 锡林浩特市| 丰顺县| 桂林市| 罗江县| 纳雍县| 乐业县| 津市市| 石嘴山市|