¸üÐÂʱ¼ä:2023Äê06ÔÂ21ÈÕ18ʱ41·Ö À´Ô´:ÀÖÓãµç¾º ä¯ÀÀ´ÎÊý:

ÑÓ³ÙÈÎÎñÓй̶¨ÖÜÆÚÓÐÃ÷È·³ö·¢Ê±¼ä£¬¶øÑÓ³Ù¶ÓÁÐûÓй̶¨µÄ¿ªÊ¼Ê±¼äËü³£³£ÊÇÓÉÒ»¸öʼþ´¥·¢µÄ£¬¶øÔÚÕâ¸öʼþ´¥·¢Ö®ºóµÄÒ»¶Îʱ¼äÄÚ´¥·¢ÁíÒ»¸öʼþ£¬ÈÎÎñ¿ÉÒÔÁ¢¼´Ö´ÐУ¬Ò²¿ÉÒÔÑÓ³Ù¡£

ÑÓ³ÙÈÎÎñµÄÓ¦Óó¡¾°£º
³¡¾°Ò»£º¶©µ¥Ïµ¥Ö®ºó30·ÖÖÓºó£¬Èç¹ûÓû§Ã»Óи¶Ç®£¬Ôòϵͳ×Ô¶¯È¡Ïû¶©µ¥;Èç¹ûÆÚ¼äϵ¥³É¹¦£¬ÈÎÎñÈ¡Ïû
³¡¾°¶þ£º½Ó¿Ú¶Ô½Ó³öÏÖÍøÂçÎÊÌ⣬1·ÖÖÓºóÖØÊÔ£¬Èç¹ûʧ°Ü£¬2·ÖÖÓÖØÊÔ£¬Ö±µ½³öÏÖãÐÖµÖÕÖ¹
ʵÏÖÑÓ³ÙÈÎÎñµÄÁ½ÖÖÈÎÎñ
1)DelayQueue
JDK×Ô´øDelayQueue ÊÇÒ»¸öÖ§³ÖÑÓʱ»ñÈ¡ÔªËØµÄ×èÈû¶ÓÁУ¬ ÄÚ²¿²ÉÓÃÓÅÏȶÓÁÐ PriorityQueue ´æ´¢ÔªËØ£¬Í¬Ê±ÔªËرØÐëʵÏÖ Delayed ½Ó¿Ú;ÔÚ´´½¨ÔªËØÊ±¿ÉÒÔÖ¸¶¨¶à¾Ã²Å¿ÉÒÔ´Ó¶ÓÁÐÖлñÈ¡µ±Ç°ÔªËØ£¬Ö»ÓÐÔÚÑÓ³ÙÆÚÂúʱ²ÅÄÜ´Ó¶ÓÁÐÖÐÌáÈ¡ÔªËØ

DelayQueueÊôÓÚÅÅÐò¶ÓÁУ¬ËüµÄÌØÊâÖ®´¦ÔÚÓÚ¶ÓÁеÄÔªËØ±ØÐëʵÏÖDelayed½Ó¿Ú£¬¸Ã½Ó¿ÚÐèҪʵÏÖcompareToºÍgetDelay·½·¨
getDelay·½·¨£º»ñÈ¡ÔªËØÔÚ¶ÓÁÐÖеÄÊ£Óàʱ¼ä£¬Ö»Óе±Ê£Óàʱ¼äΪ0Ê±ÔªËØ²Å¿ÉÒÔ³ö¶ÓÁС£
compareTo·½·¨£ºÓÃÓÚÅÅÐò£¬È·¶¨ÔªËسö¶ÓÁеÄ˳Ðò¡£
ʵÏÖ£º
1£ºÔÚ²âÊÔ°üjdkÏ´´½¨ÑÓ³ÙÈÎÎñÔªËØ¶ÔÏóDelayedTask£¬ÊµÏÖcompareToºÍgetDelay·½·¨£¬
2£ºÔÚmain·½·¨Öд´½¨DelayQueue²¢ÏòÑÓ³Ù¶ÓÁÐÖÐÌí¼ÓÈý¸öÑÓ³ÙÈÎÎñ£¬
3£ºÑ»·µÄ´ÓÑÓ³Ù¶ÓÁÐÖÐÀÈ¡ÈÎÎñ
public class DelayedTask implements Delayed{
// ÈÎÎñµÄÖ´ÐÐʱ¼ä
private int executeTime = 0;
public DelayedTask(int delay){
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND,delay);
this.executeTime = (int)(calendar.getTimeInMillis() /1000 );
}
/**
* ÔªËØÔÚ¶ÓÁÐÖеÄÊ£Óàʱ¼ä
* @param unit
* @return
*/
@Override
public long getDelay(TimeUnit unit) {
Calendar calendar = Calendar.getInstance();
return executeTime - (calendar.getTimeInMillis()/1000);
}
/**
* ÔªËØÅÅÐò
* @param o
* @return
*/
@Override
public int compareTo(Delayed o) {
long val = this.getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
return val == 0 ? 0 : ( val < 0 ? -1: 1 );
}
public static void main(String[] args) {
DelayQueue<DelayedTask> queue = new DelayQueue<DelayedTask>();
queue.add(new DelayedTask(5));
queue.add(new DelayedTask(10));
queue.add(new DelayedTask(15));
System.out.println(System.currentTimeMillis()/1000+" start consume ");
while(queue.size() != 0){
DelayedTask delayedTask = queue.poll();
if(delayedTask !=null ){
System.out.println(System.currentTimeMillis()/1000+" cosume task");
}
//ÿ¸ôÒ»ÃëÏû·ÑÒ»´Î
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
DelayQueueʵÏÖÍê³ÉÖ®ºó˼¿¼Ò»¸öÎÊÌ⣺
ʹÓÃÏ̳߳ػòÕßÔÉúDelayQueue³ÌÐò¹ÒµôÖ®ºó£¬ÈÎÎñ¶¼ÊÇ·ÅÔÚÄڴ棬ÐèÒª¿¼ÂÇδ´¦ÀíÏûÏ¢µÄ¶ªÊ§´øÀ´µÄÓ°Ï죬ÈçºÎ±£Ö¤Êý¾Ý²»¶ªÊ§£¬ÐèÒª³Ö¾Ã»¯(´ÅÅÌ)
2)RabbitMQʵÏÖÑÓ³ÙÈÎÎñ
TTL£ºTime To Live (ÏûÏ¢´æ»îʱ¼ä)
ËÀÐŶÓÁУºDead Letter Exchange(ËÀÐŽ»»»»ú)£¬µ±ÏûÏ¢³ÉΪDead messageºó£¬¿ÉÒÔÖØÐ·¢ËÍÁíÒ»¸ö½»»»»ú(ËÀÐŽ»»»»ú)¡£

3)redisʵÏÖ
zsetÊý¾ÝÀàÐ͵ÄÈ¥ÖØÓÐÐò(·ÖÊýÅÅÐò)ÌØµã½øÐÐÑÓ³Ù¡£ÀýÈ磺ʱ¼ä´Á×÷Ϊscore½øÐÐÅÅÐò¡£

redisʵÏÖÑÓ³ÙÈÎÎñµÄ˼·

1.ΪʲôÈÎÎñÐèÒª´æ´¢ÔÚÊý¾Ý¿âÖÐ?
ÑÓ³ÙÈÎÎñÊÇÒ»¸öͨÓõķþÎñ£¬ÈκÎÐèÒªÑÓ³ÙµÃÈÎÎñ¶¼¿ÉÒÔµ÷Óø÷þÎñ£¬ÐèÒª¿¼ÂÇÊý¾Ý³Ö¾Ã»¯µÄÎÊÌ⣬´æ´¢Êý¾Ý¿âÖÐÊÇÒ»ÖÖÊý¾Ý°²È«µÄ¿¼ÂÇ¡£
2.ΪʲôredisÖÐʹÓÃÁ½ÖÖÊý¾ÝÀàÐÍ£¬listºÍzset?
ЧÂÊÎÊÌ⣬Ëã·¨µÄʱ¼ä¸´ÔÓ¶È
3.ÔÚÌí¼ÓzsetÊý¾ÝµÄʱºò£¬ÎªÊ²Ã´²»ÐèÒªÔ¤¼ÓÔØ?
ÈÎÎñÄ£¿éÊÇÒ»¸öͨÓõÄÄ£¿é£¬ÏîÄ¿ÖÐÈκÎÐèÒªÑÓ³Ù¶ÓÁеĵط½£¬¶¼¿ÉÒÔµ÷ÓÃÕâ¸ö½Ó¿Ú£¬Òª¿¼Âǵ½Êý¾ÝÁ¿µÄÎÊÌ⣬Èç¹ûÊý¾ÝÁ¿Ìرð´ó£¬ÎªÁË·ÀÖ¹×èÈû£¬Ö»ÐèÒª°ÑδÀ´¼¸·ÖÖÓÒªÖ´ÐеÄÊý¾Ý´æÈ뻺´æ¼´¿É¡£
4)ÑÓ³ÙÈÎÎñ·þÎñʵÏÖ
´î½¨heima-leadnews-scheduleÄ£¿é
leadnews-scheduleÊÇÒ»¸öͨÓõķþÎñ£¬µ¥¶À´´½¨Ä£¿éÀ´¹ÜÀíÈκÎÀàÐ͵ÄÑÓ³ÙÈÎÎñ
¢Ù£ºµ¼Èë×ÊÁÏÎļþ¼ÐϵÄheima-leadnews-scheduleÄ£¿éµ½heima-leadnews-serviceÏ£¬ÈçÏÂͼËùʾ£º

¢Ú£ºÌí¼Óbootstrap.yml
server:
port: 51701
spring:
application:
name: leadnews-schedule
cloud:
nacos:
discovery:
server-addr: 192.168.200.130:8848
config:
server-addr: 192.168.200.130:8848
file-extension: yml
¢Û£ºÔÚnacosÖÐÌí¼Ó¶ÔÓ¦ÅäÖ㬲¢Ìí¼ÓÊý¾Ý¿â¼°mybatis-plusµÄÅäÖÃ
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/leadnews_schedule?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
# ÉèÖÃMapper½Ó¿ÚËù¶ÔÓ¦µÄXMLÎļþλÖã¬Èç¹ûÄãÔÚMapper½Ó¿ÚÖÐÓÐ×Ô¶¨Òå·½·¨£¬ÐèÒª½øÐиÃÅäÖÃ
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
# ÉèÖñðÃû°üɨÃè·¾¶£¬Í¨¹ý¸ÃÊôÐÔ¿ÉÒÔ¸ø°üÖеÄÀà×¢²á±ðÃû
type-aliases-package: com.heima.model.schedule.pojos
±±¾©Ð£Çø