springboot整合redis

本文介绍了如何在SpringBoot应用中使用Redis生成全局唯一ID,同时讨论了@Autowired注解在组件中的失效问题以及解决方法,即直接实例化RedisWorker对象而非通过@Autowired注入。
摘要由CSDN通过智能技术生成
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;

/**
 * 用于生成全局唯一ID
 */
@Component
public class RedisWorker {
    /**
     * 开始时间戳 2024-01-01 00:00
     */
    public static final long BEGIN_TIMESTAMP=1704067200l;
    /**
     * 序列号位数
     */
    public static final int COUNT_BITS=32;
    @Autowired
    public StringRedisTemplate stringRedisTemplate;



    /**
     * 生成ID
     * @param keyPrefix
     * @return
     */
    public long nextId(String keyPrefix){
        // 1、生成时间戳
        LocalDateTime now=LocalDateTime.now();
        long nowSecond=now.toEpochSecond(ZoneOffset.UTC);
        long timeStamp=nowSecond-BEGIN_TIMESTAMP;

        //2、生成序列号
        String date=now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        long count=stringRedisTemplate.opsForValue().increment("icr:"+keyPrefix+":"+date);

        //3、拼接返回
        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+"个 :"));
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值