package com.hmdp.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
@Component
public class RedisWorker {
public static final long BEGIN_TIMESTAMP=1704067200l;
public static final int COUNT_BITS=32;
@Autowired
public StringRedisTemplate stringRedisTemplate;
public long nextId(String keyPrefix){
LocalDateTime now=LocalDateTime.now();
long nowSecond=now.toEpochSecond(ZoneOffset.UTC);
long timeStamp=nowSecond-BEGIN_TIMESTAMP;
String date=now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
long count=stringRedisTemplate.opsForValue().increment("icr:"+keyPrefix+":"+date);
return timeStamp<<COUNT_BITS |count;
}
}
@Test
public void testIdCreated(){
RedisWorker redisWorker=new RedisWorker();
for (int i = 0; i < 10; i++) {
System.out.println(redisWorker.nextId("第"+i+"个 :"));
}
}
上面会注入stringRedisTemplate失败、自己new的component里面的autowired失效
要改成下面的
@Autowired
RedisWorker redisWorker;
@Test
public void testIdCreated(){
for (int i = 0; i < 10; i++) {
System.out.println(redisWorker.nextId("第"+i+"个 :"));
}
}