- java配合redis完成延时任务
- 采用的是redis的
锁空间机制(Keysquare Notifications)
- Key过期事件的Redis配置
redis.conf
:notify-keyspace-events Ex
,然后重启redis服务即可。
public class RedisTest {
private static final String REDIS_ADDRESS="127.0.0.1"; //host
private static final int REDIS_PORT=6379; //端口号
private static final String REDIS_AUTH="iostream"; //auth password
private static JedisPool jedisPool;
private static RedisSub sub;
static{
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(10); //设置redis连接实例的数量 默认是8
jedisPool=new JedisPool(config,REDIS_ADDRESS,REDIS_PORT,Protocol.DEFAULT_TIMEOUT,REDIS_AUTH);
sub=new RedisSub();
}
//添加过期事件订阅
public static void init(){
new Thread(()-> jedisPool.getResource().subscribe(sub,"__keyevent@0__:expired")
).start();
}
public static void main(String[] args) {
init();
for (int i=0;i<10;i++) {
String orderId="OID00000"+(i+1);
jedisPool.getResource().setex(orderId,3,orderId);//设置三秒过期
System.out.println(System.currentTimeMillis()+" ms: "+orderId+"订单生成");
}
}
private static class RedisSub extends JedisPubSub{
@Override
public void onMessage(String channel, String message) {
System.out.println(System.currentTimeMillis()+" ms: "+message+"订单取消");
}
}
}
分布式之延时任务方案解析:个人感觉挺不错的一篇文章,对初学者来说