我的群众号:MarkerHub,网站:markerhub.com

小Hub领读:

点赞是个频率比较高的作业,也不是特别重要的记载,运用缓存来存储仍是比较springboot守时使命合理的,其他像排行榜HTTP、热议等都能够运用缓存,先来看看点赞是怎样完毕的吧,具体代码能够clone看下哈,跟紧脚步,学技术~​


  • 作者:solocoder
  • juejinspringboot菜鸟教程.im/post/5bdc257e6fb9a049ba410098

代码出自开源项目 Cospringboot守时使命deRiver,欢迎围观:
github.com/cachecats/c…

本文依据 SpringCloud, 用户发起点赞、撤消点赞后先存入 Redis 中approach,再每隔两小时从 Redis 读取点赞数据写入数据库中做耐久化存储。

点赞功用在许多体系中都有,但别看功用小,想要做好需求考虑的东西还挺多的。

点赞、撤消点赞是高频次的操作,若每次都读写数据库,springboot面试题大量的操作会影响数据库功用,所以需求做缓存。

数据库是什么于多久从 Redis 取一次数据存到数据库中,依据项目的实际状况定吧,我是暂时设了两个小时。

项目需求需求查看都谁点赞了,所以要存储每个点赞的点赞人、被点赞人,不能简略application的做计数。

文章分四部分介绍:

  • Redis 缓存规划及完毕

  • 数据库规划

  • 数据库操作

  • 翻开守时使命耐久化存储到数据库

一、Redis 缓存规划及完毕

1.1 Redis 设备及作业

Redappleis 设备请自行查阅相关教程。

说下 Docker 设备作业 Redis

dockerrun-d-p6379:6379redis:4.0.8

假设现已设备了 Redis,翻开指令行,输入发起 Redis 的指令

redis-server

1.2 Redis 与 SpringBoot 项目的整合

  1. 在 pom.xml 中数据库原理及使用引进依托
<dependencyspringboot面试题&g开源节流t;
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis开源是什么意思</artifacappearancetId>
</dependency>
  1. 在发起类上增加注释 @EnableCahttp 500ch数据库体系的特色ing
@SpringBootApplication
@EnableDiscover数据库办理体系yClient
@开源阅览EnableSwagger2
@EnableFeignClients(basePackages="com.solo.coderiver.proj数据库办理体系ect.cl开源是什么意思ient")
@EnableCaching
publicclassUserApplication{
publicstaticvoidmain(String[]args){
SpringApplicatioapproachn.run(Userspringboot项目建立Applicati开源on.class,args);
}
}
  1. 编写 Redis 配备类 RedisConfig
importcom.fasterxml.jackson.annotation.JsonAutoDetect;
importcom.fasterxml.jackson.annotation.PropertyAccessor;
importcom.fasterxml.jackson.databind.ObjappreciateectMapper;
importorg.springframeworkspringboot守时使命.boot.autoconfighttps和http的差异ure.condition.ConditionalOnMissingBeanhttpwatch;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.ann开源代码网站githubotation.Configuration;
impo开源是什么意思rtorg.springframework.data.redis.connection.Redis数据库体系工程师ConnectionFactory;
importorg.springframework.data.redis.core.Rhttp://192.168.1.1登录edisTemplate;
importorg.springframework.data.redis.core.StringRediappleidsTemplate;
importorg.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
importjava.net.UnknownHostException;
@Configuration
publicclassRedisConfig{
@Bean
@ConditionalOnMissingBspringboot发动进程ean(name="redisTemplate")
publ数据库体系的中心是icRedisTemplate<String,Object>redisTappreciateemplate(
RedisConnectionFactoryredisConnectionFactory)
throwsUnknownHostException{
Jackson2JsonRedisSerializer<Object>jackson2JsonRedisSerializer=newJackson2JsonRedisSerializer<Object&gt数据库原理及使用;(Object.class);
Objechttp署理tMapperom=newObjectMapper();
om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Vappleidisibility.ANY);
om.enableDefspringboot守时使命aultTypispringboot发动进程ng(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSeriaHTTPlizer.setObjectMapper(om);
RedisTemplate<Strispringboot项目建立ng,Object>templatspringboot和springcloud差异e=newRedihttp 404sTemplate<Stappearring,Object>();
template.setConnectionFactoryspringboot是什么结构(redisConnectionFactory);
template.setKeySerialihttp署理zer(jackson2JsonRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHapproveashKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
returntemplate;
}
@Bea数据库体系的中心是n
@ConditionaapproachlOnMissingBean(StringRedisTemplate.class)
publicStringRedisTemplatestringRedisTemplate(
RedisConnect数据库原理ionFactoryredisConne数据库体系概论第五版课后答案ctionFactohttp://www.baidu.comry)
throwsspringboot项目建立UnknownHostException数据库原理及使用{
StringRedisTemplatetemplate=newStringRedisTemplate();
templateapplication.setConnectionFactory(redisConnectionFactory);
returntemplate;
}
}

至此 Redi数据库原理s 在 SpringBoot 项目中的配备现已完毕,能够愉快的运用了。

1.3 Redis 的数据结构类型

Respringboot发动进程dis 能够存储键与 5 种不同数据结构类型之间的映射,这 5 种数据结构类app装置下载型分别为 String(字符串)、List(列springboot主动装置表)、Set(集结)、Hash(散列)和 Zset(有序集结)。开源

下面来对这 5 种数据结构类型作简略的介绍:

Redis 是怎么完成点赞、撤销点赞的?

1.4开源软件 点赞数据在 Redis 中的存储格局

用 Redis 存储两种数据,一种是记载点赞人、被点赞人、点赞状况的数approach据,另一种是每个用户被点APP赞了多少次,做个简略的计数。

由于需求记载点赞人和被点赞人,还有点赞状况(点赞、撤消点赞),还要固守时刻间隔取出 Redis 中一切数据库体系工程师点赞数据,分析了下 Redis 数据springboot菜鸟教程格局中 Hash 最合适。

由于 Hash 里的数据都是存在一个键里,能够通过这个键很便当的把一切的点赞数据都取出。这个键里边的数据还能够存成键值对springboot主动装置的办法,便当存入点赞人、被点赞人和点赞状况。

设点赞人的 id 为 likedPostId,被点赞人的 id 为 likedUserId ,点赞时状况为 1,撤消点赞状况为 0。将点赞人 id 和被点赞数据库体系概论人 id 作为键,两个 id 中心用 :: 隔开,点赞状况作为值springboot常用注解

所以假设用户点赞,存储的键为:likedUserId::likedPostId,对应的值为 1 。撤消点赞,存储的键为:likedUserId::likedPostId,对应的值为 0 。取数据时把键用 :数据库办理体系: 切开源软件开就得到了两个 id,也很便当。

在可视化东西 RDM 中看到的是这http://192.168.1.1登录姿势

Redis 是怎么完成点赞、撤销点赞的?

Redis 是怎么完成点赞、撤销点赞的?

1.5 操作 Redis

将具体操作办法封装到了 RedisService 接口里

RedisService.java

importappearancecom.solo.coderiver.user.dataobject.UserLike;
importcom数据库.solo.开源矿工coderihttp 500ver.user.dto.LikedCountD数据库体系的特色TO;
import数据库java.util.List;
publicinterfaceRedisService{
/**
*点赞。状况为1
*@paramlikedUserId
*@paramli开源kedPostI开源阅览d
*/
voidsaveLiked2Redis(Stringlhttp://192.168.1.1登录ikedUserId,StringlikedPoshttps和http的差异tId);
/**
*撤消点赞。将状况改变为0
*@paramlikedUserId
*@paramlikedPostId
*approve/
voiduspringboot面试题nlikeFromRedis(StringlikedUserId,StringlikedPostId);
/**
*从Redis中删去一条点赞数据
*springboot和springcloud差异@paramlikedUserId
*@paramlikAPPedPost开源阅览Id
*/
voiddeleteLikedFromRedis(SappreciatetringlikedUserId,StringlikedPostId);
/**
*该用户的点赞数加1
*@para数据库体系的中心是mlikedUserId
*/
voidincrementLikedCount(String数据库体系的特色likedUsehttp署理rId);
/**
*该用户的点赞数减1
*@paramlikedUserIhttp协议d
*/
voiddecrementLikedCount(StringlikedUserId数据库体系的特色);
/**
*获取Redis中存储的一切点赞数据
*@return
*/
List<UserLike数据库是什么>ge数据库体系tLikedDaHTTPtaFromRedis();
/**
*获取Redis中存储的一切点赞数量
*@return
*/
List<Lispringboot菜鸟教程kedCountDTO>getLikedCountFromRedis()http 302;
}

完毕类 RedisSer开源是什么意思viceImpl.java

impor开源tcom.solo.coderivSpring+Booter.user.approachdataobject.UserLike;
importcom.solo.coderiver.user.dto.LikedCountDTO;
importcom.solo.coderiver.user.enum开源矿工s.LikedStatusEnum;
importcom.solo.coderiver.user.service.LikedService;
importcom.solo.co开源矿工deriver.数据库体系概论user.service.RedisService;
importcom.solo.coderiver.user.utils.RedisKeyUtils;
importlombok.extern.slf4j.Slf4j;
importorg.sprin开源代码网站githubgframework.beans.factory.annotation.Autowired;
iapplemportorg.springfrahttp协议mework.data.redis.core.Chttps和http的差异urso数据库体系的中心是r;
importorg.springframework.data.redis.core.RedisTemplate;
importorg.springframework.dspringboot常用注解ata.redis.core.ScanOptions;
ispringboot面试题mportorg.springframework.stereotype.Service;
imp开源我国ortjava.util.ArrayList;
imporspringboot常用注解tjavappstorea.util.List;
importjava.util.Map;
@Service
@Slf4j
publicclassRehttp协议disServiceImplimplementappleidsRedisS数据库体系ervice{
@Autowired
RedisTemplateredisTemplate;
@Autowired
LikedServicelikedServi开源节流打一字ce;
@Override
publicvoidsaveLikespringboot面试题d2Redis(StringlikedUserId,StringlikedPostId){
Stringkey=RedisKeyUtils.getLikedKey(likedUserId,likedPostId);
redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKEDapple,key,LikedStatusEnum.LIKE.getCode());
}
@Override
publicvoispringboot发动进程dunlikeFromRedis(StringlikedUserId,Shttp署理tringlikedPosthttp署理Id){
Strin开源节流是什么意思是什么gkey=RedisKeyUtils.getLikedKey(likedUserId,likedPostId);
redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKEDspringboot主动装置,key,LikedStatusEnum.Uspringboot常用注解NLIKE.getCode());
}
@Override
publicvoiddeleteLikedFromRedapp装置下载is(StringlikedUserId,StringlikedPostId){
Stri开源节流打一字ngkey=RedisKeyUtils.getLihttp协议kedKey(likedUs开源众包erId,li数据库kedPostId);
redisTemplate.opsForHash().delete(Redisspringboot发动进程KeyUtils.MAP_KEY_USER_LIKED,key);数据库体系
}
@Override
publicvoidincrementLikedCount(Shttp://www.baidu.comtringliapplekedUserId){
redisTemplate.opsForHash().increment(Redishttp 500KeyUtils.MAP_KEY_USER_LIspringboot发动进程KED_COUNT,likedUserId,1);
}
@Overridspringboot和springcloud差异e
publicvoiddecrementLikedCount(StringlikedUserId){
redisTemplate.opsForHash().increment(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT,likedUserId,-1);
}
@Override
publicList<UserLike&springboot面试题gt;getLikedDataFromRedis(){
Cursor<Map.Entry<Obj开源节流打一字ect,Object>>springboot主动装置cursor=redisTemplate.opsForHashttp署理h().scan(RedisKeyUtils.MAP_KEY_USER_LIKED,ScanOptions.NONE);
List<UserLike>list=newArrayList<>();
while(cursor.hasNext()){
Map.Entry<Obspringboot发动进程ject,Object&gt开源节流;entry=cursor.next();
Stringkey=(String)entry.getappstoreKey();
//别离出likedUserId,likedPostId
String[]split=key.split("::");
StringlikedUserId=split[0];
StringlikedPostId=splispringboot守时使命t[1application];
Integervalue=(Integer)springboot菜鸟教程entry.getValspringboot和springcloud差异ue();
//组装成UserLike方针
UserLikeuserLike=newUserLike(likedUserId,likedPostId,value);
list.add(userLike);
/appear/存到list后从Redis中删去
redisTemplate.opsForHash().数据库体系的特色delete(RedisKeyUtilspringboot是什么结构s.MAP_KEY_USER_LIKED,key);
}
returnlist;
}
@Override
publicList<LikedCountDTO&gspringboot守时使命t;getLikedCountFromRedis(){
Cursor<Map.Entry<Object,Object>>cursor=redisTemplate.opsForHash().scan(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT,ScanOptions.NONE);
List<LikedCountDTO>list=newArrayList&lt开源节流;>();
while(c数据库体系ursor.hasNext()){
Map.Entry<Object,Objectspringboot面试题>map=cursor.next();
//将点赞数量存储在LikedCountDT
Stringkey=(String)开源节流map.getKey();
LikedCountDTOdto=newLikedCountspringboot主动装备的原理DTO(key,(Integer)map.getValue());
list.add(dto);
//从Redis中删去这条记载
redisTemplate.opsForHash().delete(RedisKeyUtils.MAP_KEY_USER_LIKED_COUNT,key);
}
returnlist;
}
}

用到的东西类和枚举类

RedisKeyUtilshttp 404, 用于依据必定规则生成 key

publicclassRedisKeyUtils{
//保存用户点赞数据的key
publicstaticfinalStringMAP_KEY_USER_LIKED="MAP_USER_LIKED";
/app装置下载/保存用户被点赞数量的key
publicstaticfinalStringMAP_app装置下载KEY_数据库体系的中心是UShttp 500ER_LIKED_COUNT="MAP_USER_LIKED_COUNT";
/**开源矿工
*拼接被点赞的用户id和点赞的人的id作为key。格局 222222::333333
*@paramlikedUserId被点赞的人id
*@paramlikedPostId点赞的人的id
*@return
*/
publicstaticStringgetLikedKey(StringlikedUserI开源d,Strinhttp 500glikedPostId){
StringBappstoreuilderbuilder=newStringBuilder();
buildspringboot常用注解er.app开源我国end(likedUserId);
builder.appendspringboot常用注解("::approve");
builder.append(likhttpclientedPostId);
returnbuilder.toString();
}
}

LikedStatusEnum 用户点数据库体系概论赞状况的枚举类

packagecom.solo.coderiver.user.enums;
importlombok.Getter;
/**
*用户点赞的状况springboot是什么结构
*/
@G数据库体系的中心是etter
publicenumLikedStatusEnum{
LIKE(1,"点赞"),
UNLIKE(0,"撤消点赞/未点赞"),
;
privateIntegercode;
privateStringmsg;
LikedStatusEnum(Integercode,Stringmsg){
this.code=code;
this.msg=msg;
}
}

二、数据库规划

数据库表中至少要包含三个字段:被点赞用户 id,点赞springboot是什么结构用户 idhttp://www.baidu.com,点赞状况。再加上主键 id,创数据库办理体系建时刻,批改时刻就行了。

建表语句

createtable`user_l数据库体系ike`(
`id`intnotnullauto_appearincrement,
`liked_usapplicationer_id`varchar(32)notnullcomment'被点http署理赞的用户id',
`liked_post_id`varchaappleidr(32)notnullcomment'点赞的用户id',
`sta数据库体系tus`tiSpring+Bootnyint(1)default'1'comment'点赞状况,0撤消,1点赞',
`create_time`timestampnotnulldefaultcurrent_springboot和springcloud差异timestampcomment'创立时刻',
`update_time`timestampnotnulldefaultcurrent_timesta开源节流是什么意思是什么mponupdatecurrent_timestampcomment'批改时刻',
primaspringboot是什么结构r数据库体系的中心是ykey(`id`),
INDEX`HTTPliked_user_id`(`liked_user_i开源软件d`),
INDEX`liked_post_id`(`liked_post_id`)
)comment'用户点赞表';

对应的方针 UserLike

importcom.solo.coderiver.appleuser.enhttp协议ums.LiappearancekedStatusEnum;
importlombok.http 404Data;
importjavax.persistence.Entity;
importjavax.persistencspringboot和springcloud差异e.GeneratedValue;
importjavax.persiSpring+Bootste开源软件nce.GenerationType;
importjavax.persistence.Id;
/**
*用户点赞表
*/
@Entity
@Data
publicclassUserLispringboot主动装置ke{
//主键id
@Id
@GeneratedValue(strategy=GenerationType.IDENT开源节流ITY)
privateIntegeridspringboot守时使命;
//被点赞的用户的id
privateappearanceStringlikedUserId;
//点赞的用户的id
privaAPPteStringlikedPostId;
//点赞的状况.默许未点赞
privateIntegerstatus=LikedStatusEnum.UNLIKE.getCode();
publicUserLike(){
}
publicUserLike(StringlikedUserId,Stringlspringboot主动装备的原理ikedPostId,Integerstatus){
this.likedUserId=likedUserId;
t开源软件his.likedPostId=likedPoshttpclienttId;
this.status=status;
}
}

三、数据库操作

操作数据库相同封装在接口中

LikedServicespringboot常用注解

impor开源我国tcom.solo.coderiver.user.d数据库体系概论ataobject.UseappreciaterLike;
importorg.springframework.data.domain.Paapp装置下载ge;
importorg.spri开源节流打一字ngframework.开源矿工data.domain.Pa开源节流打一字geable;
importjava.util.List;
publicinterfaceLikedService{
/**
*保存点赞记载
*@paramuserLike
*@return
*/
UserLikesave(UserLikeuserLike);
/**
*批量保springboot菜鸟教程存或批改
*@paramlist
*/
List<UserLike>saveAll(List<UserLike>list);
/**springboot是什么结构
*依据被点赞人的id查询点赞列表(即查询都谁给这开源我国个人点赞过)
*@paramlikedUserId被点赞人的id
*@parampageable
*@return
*/
Page<UserLike>getLikedListByLikedUserId(StringlikedUserHTTPId,Pageablepageablehttp协议);
/**
*依据点springboot发动进程赞人的id查询点赞列表(即查appearance询这个人都给谁application点赞过)
*@paramlikedPostId
*开源我国@parampa开源是什么意思geable
*@return
*/
Page<Uspringboot主动装置serLike>getLikedListByLappstoreikedPostId(StringlikedPostId,Pappearageablepageable);
/**
*通过被点赞人和点赞人id查询是否存在点赞记载
*@paramlikedUserId
*@paramlikedPostId
*@return
*/
UserLikegetByLikedUserId数据库体系AndLikedPostId(StringlikedUserId,Stringlikedhttp://www.baidu.comPostId);
/**
*将Redis里的点赞数据存入数据库中
*/
voidtransLikedFromRedis2Spring+BootDB();
/**
*将Redis中的点赞数量数据存入数据库
*/
voidtransLik数据库办理体系edCountFromRedis2DB();
}

LikedServiceImpl 完毕类

importcom.solo.coderiver.user.dataobject.Usspringboot常用注解erInfo;
importcom.solo.coderiver.user.dataobject.UserLike;
im开源节流是什么意思是什么portcom.solo.coderiver.user.dto.LikedCountDTO;
importcom.solo.cod开源软件eriver.user.enums.LikedStatusEnum;
importcom.solo.coderiver.user.repository.UserLikeRepository;
importcom.solospringboot和springcloud差异.coderiver.user.service.LikedService;
importcom.solo.coderiver.user.service.RedisService;
importcom.solo.coderiver.user.service.Use数据库体系概论rService;开源矿工
importlombok.extern.slf4j.Slf4j;
importohttps和http的差异rg.springframework.beans.factory.annotation.Autowi开源众包red;
importor开源节流打一字g.springframework.data.domain.Page;
importorg.springframework.data.domain.Pa数据库办理体系geable;
importorg.springframework.stereotype.Service;
importorg.springframewhttp 302ork.transactiospringboot面试题n.annotation.Transactional;
importjavaspringboot是什么结构.util.List;
@Service
@Slf4j
publicclassL数据库体系概论ikedServiceImplimplementsLikedService{appleid
@Autowired
UserLikeRepositorylikeRepository;
@Autowired
RedisServiceredisService;
@Autowired
UserServiceuserService;
@Override
@Trahttp协议nsactional
publicUserLikesave(UserLikeuserLike){
returnlikeRepository.saveappreciate(userLike);
}
@Override
@Transactional
publicList<UserLike>saveAll(List<UserLike>list){
returnliappstorekeRepository.savspringboot主动装置eAll(list);
}
@http://192.168.1.1登录Override
publicPage<httpwatchUs数据库原理erLike>getLikedListByLikedUsehttpclientrId(Stringlikedhttp 302UserId,Pahttp协议geablepagSpring+Booteable){
returnlikeRepository.findByLikedUserIdAndStatus(likedUserId,LikedStatusEnum.LIKE.getCode(),pageable);
}
@Over开源节流是什么意思是什么ride
publicPage&ltspringboot守时使命;UserLike>getLikedLisspringboot面试题tByLikedPostId(StringlikedPostId,Pageablepageable){
returnlikeRepository.findByLikedPostIdAndStatus(likedPostId,LikedStatusEnum.LIKE.getCode(),pageable);
}
@Override
publicUserLikegetByLikedUserIdAndLikedPostId(StringlikedUserId,StAPPringlikedPostId){
returnlhttp://192.168.1.1登录ikeRepositapplicationory.findByLikedUserIdAndLikedP开源节流ostId(likedUserId,likedPostId);
}
@Override
@Transactional
publicvoidtransLikedSpring+BootFromRedis2DB(){
List<UserLike>list=redisService.getLikedDataFromRedis();
for(UserLikelike:list){
UseHTTPrLikehttp://www.baidu.comul=getByLikAPPedUserIdAndLikedPosspringboot发动进程tId(like.getLikedUserId(),lspringboot和springcloud差异ike.getLihttpclientkedPostId());
if(ul==null){
//没有记载,直接存入
save(like);
}ehttp://www.baidu.comlse{
//有记载,需求更新
ul.setStatus(like.getStappearatus()springboot主动装备的原理);
save(ul);
}
}
}
@Override
@Transactional
publicvoidtransLikedCountFromRedis2DB(){
List<LikedCountDTO>list=rehttp署理disService.getLikespringboot常用注解dCountFromRedis();
for(LikedCountDTOdto:list){
UserInfhttp署理ouser=userService.findById(dto.getId());
//点赞数量归于无关紧要的操作,出错无需抛异常
ihttp://www.baidu.comf(userspringboot菜鸟教程!=null){
IntegerlikeNum=user.getLikehttp://www.baidu.comNum()+dto.getCountspringboot面试题();
user.setLikeNum(likeNu数据库体系概论m);
//更新点赞数量
userService.updateInfo(user);
}
}
}
}

数据库的操作就这些,首要仍是增修正查。

四、翻开守时使命springboot面试题耐久化存储到数据库

守时使命springboot和springcloud差异 Quartz 很健壮,就用它了。

Quartz 运用进程:

1、 增加依托

<de开源节流是什么意思是什么pendencHTTPy>
&app装置下载lt;groupId>org.springframew数据库是什么ork.boot</groupId>
<aHTTPrtifactId>spring-boot-startespringboot发动进程r-quartz</artifactId>
<APP/dependenspringboot常用注解cy>

2、 编写配备文件

packagecom.solo.coderiver.u数据库体系工程师ser.conSpring+Bootfig;
importcom.solo.coderiver.user.task.LikeTask;
importorg.quartz.*;
importorg.springframework.context.annotation.Bean;
impSpring+Bootortorg.springframework.context.annotation.C数据库原理onfiguration;
@Configappearuration
publicclas数据库体系的中心是sQuartzConfig{
privatest开源节流是什么意思是什么aticfihttp://www.baidu.comnalStringLIKE_TASK_IDENTITY="LikeTaskQuartz";
@Bappleean
publicJobDetailquartzDetail(){
returnJobBuilder.newJob(LikeTask.class).withIdentity(LIKE_TASK_IDENTITY).storeDurably().build();
}
@Bean
phttps和http的差异ublicTriggerquartzTriggapplicationer(){
SiapplicationmpleSchedule开源是什么意思Builspringboot和springcloud差异derscheduleBuilder=SimpleScheduleBuilder.simpleSchedule()
//.withIntervaappleidlInSeconds开源软件(10)/springboot主动装置/设置时刻周期单位秒
.wit开源节流打一字hIntervalInHours(2)//两个小时实行一次
.repeatForever();
returnTriggerBuilder.newTrigger().forJob(quartzDetail())
.withIdentity(LIKE_TASK_IDENTITY)
.withScheduhttpwatchle(scheduleBuilder)
.build();
}
}

3springboot和springcloud差异、 编写实行使命的类承继自 QuartzJobBean

packagecom.solo.coderiver.user.task;
importcom.solo.coderiver.user.service.LikedService;
importlombok.externspringboot项目建立.slf4approvej.Slf4j;
importorg.apache.commons.lang.time.DateUtils;
importorgappearance.http协议quartz.JobExecutionContextapprove;
importorg.app装置下载quartz.JobExecutionException;
importorg.springframework.beans.factory.annotat开源ion.Autowired;
importo开源矿工rg.springframework.scheduling.quartz.QuartzJobBean;
importjava.tex数据库体系工程师t.SimpleDateFormat;开源矿工
importjava.util.Dat数据库体系的中心是e;
/**
*点赞springboot主动装备的原理的守时使命
*/
@Slf4j
publicclassLikeTaskextendsQuartzJobBean{
@Autowired
LikedServicelikedService;
priv数据库ateSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
@Override
protectedvoidexecuteInternal(JobExecutionConhttpclienttextjobExecutionContext)throwsJobExecutionException{
log.info("LikeTask--------{}",sdf.format(newDate开源节流()))approve;
//将Redis里的点赞信息同步到数据库里
likedService.transLikedFromRedispringboot常用注解s2DB();
likedService.transLikedCountFromRedis2DB();
}
}

在守时使命中springboot发动进程直接调用 LikedService 封装的springboot守时使命办法完毕数据同步。

以上就是点赞功用的规划与完毕,不足之处还请各位大佬多多指教。

其他,点赞 / 撤消点赞 跟 点赞数 +1/ -1 应该确保是原子操作 , 否则呈现并发问题就会有两条重复的点springboot主动装备的原理赞记载 , 所以要给整个原子操作加锁 . 一同需求在 Spring Boot 的体系关闭钩子函数中弥补同步 redis 中点赞数据到 mysql 中的进程 . 否则有或许呈现间隔上一次同步 1 小时 59 分的时分服务器更新 , 把整整两小时的点赞数据都给清空http 404了 . 假设点赞规划到比较重要活动业数据库务的话这就很为难了 .

推荐阅览数据库体系的中心是

太赞了,这个Java网站,什springboot和springcloud差异么项目都有!https://markerhub.com

这个B站的UP主,讲的开源节流是什么意思是什么java真不错!

太赞了!最新版Java编程思维能够在线看了!