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

java實(shí)現(xiàn)點(diǎn)贊功能

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

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

實(shí)現(xiàn)思路:

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

第一步:

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

第二步:

創(chuàng)建枚舉類(lèi)

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

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

第三步:

將實(shí)現(xiàn)類(lèi)寫(xiě)好

@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;
? ? }
? ? /**
? ? ?* 點(diǎn)贊、取消點(diǎn)贊
? ? ?*
? ? ?* @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中刪除一條點(diǎn)贊數(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);
? ? }

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

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

第四步提供接口:

?/**
? ? ?* 進(jìn)行點(diǎn)贊、取消點(diǎn)贊
? ? ?*
? ? ?* @param vo
? ? ?*/
? ? @Override
? ? public Result addKudos(KudosVo vo) {
? ? ? ? if(vo == null){
? ? ? ? ? ? return Result.error(ResponseMessage.PARAMERROR);
? ? ? ? }
? ? ? ? if("1".equals(vo.getStatus())){
? ? ? ? ? ? // 點(diǎn)贊
? ? ? ? ? ? postRedisService.saveLikeRedis(vo.getRecordId(),vo.getUserId(), LikeStatusEnum.LIKE.getCode());
? ? ? ? ? ? // 記錄+1
? ? ? ? ? ? postRedisService.incrementLikedCount(vo.getRecordId());
? ? ? ? }else if("0".equals(vo.getStatus())){
? ? ? ? ? ? // 取消點(diǎn)贊 更新?tīng)顟B(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);
? ? }

最后定時(shí)將redis 中的數(shù)據(jù)同步到數(shù)據(jù)庫(kù)

?/**每 5 分鐘執(zhí)行一次
? ? ?* 將點(diǎn)贊人員同步到庫(kù)中
? ? ?* */
// ? ?@Transactional(rollbackFor =Exception.class)
? ? @Scheduled(cron = "0 */5 * * * ?")
? ? public void transLikdedFromRedis()throws IOException{
? ? ? ? List<RedisLikedUserDTO> dtoList = getLikedUserFromRedis();
? ? ? ? dtoList.stream().forEach(x->{
? ? ? ? ? ? // 通過(guò)記錄及人員id 查詢(xún) 該 人員是否點(diǎn)贊
? ? ? ? ? ? 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);
? ? ? ? ? ? // 點(diǎn)贊
? ? ? ? ? ? if(record == null&&"1".equals(x.getStatus())){
? ? ? ? ? ? ? ? // 根據(jù)記錄id ?查詢(xún)
? ? ? ? ? ? ? ? LambdaQueryWrapper<WorkCircleRecord> wrapper = new LambdaQueryWrapper<>();
? ? ? ? ? ? ? ? wrapper.eq(WorkCircleRecord::getDeleteIf,true);
? ? ? ? ? ? ? ? wrapper.eq(WorkCircleRecord::getId,x.getRecordId());
? ? ? ? ? ? ? ? WorkCircleRecord workCircleRecord = workCircleRecordMapper.selectOne(wrapper);
? ? ? ? ? ? ? ? if(workCircleRecord != null){
? ? ? ? ? ? ? ? ? ? // 沒(méi)有此人員 添加
? ? ? ? ? ? ? ? ? ? if(StringUtils.isBlank(workCircleRecord.getWorkKudosUserIds())){
? ? ? ? ? ? ? ? ? ? ? ? // 沒(méi)有點(diǎn)贊人員
? ? ? ? ? ? ? ? ? ? ? ? workCircleRecord.setWorkKudosUserIds(x.getUserId());
? ? ? ? ? ? ? ? ? ? ? ? SysUser user = sysUserMapper.selectById(x.getUserId());
? ? ? ? ? ? ? ? ? ? ? ? if(user !=null){
? ? ? ? ? ? ? ? ? ? ? ? ? ? workCircleRecord.setWorkKudosUser(user.getRealname());
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? ? ? ? ? // 有點(diǎn)贊人員
? ? ? ? ? ? ? ? ? ? ? ? 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())) {
? ? ? ? ? ? ? ? // 有記錄 并取消點(diǎn)贊
? ? ? ? ? ? ? ? // 根據(jù)記錄id ?查詢(xún)
? ? ? ? ? ? ? ? LambdaQueryWrapper<WorkCircleRecord> wrapper = new LambdaQueryWrapper<>();
? ? ? ? ? ? ? ? wrapper.eq(WorkCircleRecord::getDeleteIf,true);
? ? ? ? ? ? ? ? wrapper.eq(WorkCircleRecord::getId,x.getRecordId());
? ? ? ? ? ? ? ? WorkCircleRecord workCircleRecord = workCircleRecordMapper.selectOne(wrapper);
? ? ? ? ? ? ? ? // 將此點(diǎn)贊人員去除
? ? ? ? ? ? ? ? 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);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }
/**獲取 所有點(diǎn)贊的人員
? ? ?* */
? ? public List<RedisLikedUserDTO> getLikedUserFromRedis() throws IOException{
? ? ? ? List<RedisLikedUserDTO> dtoList = new ArrayList<>();
? ? ? ? // 通過(guò)游標(biāo)獲取所有鍵值對(duì)
? ? ? ? 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í)行一次
? ? ?* 將點(diǎn)贊數(shù)同步到庫(kù)中
? ? ?* */
? ? @Transactional(rollbackFor =Exception.class)
? ? @Scheduled(cron = "0 */5 * * * ?")
? ? public void transLikedCountFromRedis() throws IOException{
? ? ? ? // 獲取所有的點(diǎn)贊數(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)){
? ? ? ? ? ? ? ? // 通過(guò)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);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? ? ? });
? ? ? ? ? ? }
? ? ? ? }
? ? }
/** 取出所有的點(diǎn)贊數(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();
? ? ? ? ? ? // 獲取 點(diǎn)贊數(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;
? ? }

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

相關(guān)文章

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

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

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

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

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

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

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

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

    眾所周知,隨機(jī)數(shù)是任何一種編程語(yǔ)言最基本的特征之一。而生成隨機(jī)數(shù)的基本方式也是相同的:產(chǎn)生一個(gè)0到1之間的隨機(jī)數(shù)。看似簡(jiǎn)單,但有時(shí)我們也會(huì)忽略了一些有趣的功能。
    2015-09-09
  • Java?超詳細(xì)講解對(duì)象的構(gòu)造及初始化

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

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

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

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

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

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

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

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

    Java簡(jiǎn)單從文件讀取和輸出的實(shí)例

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

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

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

最新評(píng)論

改则县| 科技| 宝山区| 三台县| 马边| 巫山县| 辉南县| 金山区| 北海市| 鹤山市| 蕉岭县| 探索| 张北县| 湘阴县| 武清区| 伊金霍洛旗| 城口县| 益阳市| 镇坪县| 湛江市| 合水县| 礼泉县| 砀山县| 威宁| 从化市| 常德市| 芜湖县| 海丰县| 玉田县| 海南省| 德昌县| 若羌县| 衡南县| 兴城市| 噶尔县| 德阳市| 资阳市| 中西区| 扎赉特旗| 南雄市| 仲巴县|