redis实现全局唯一id

这篇具有很好参考价值的文章主要介绍了redis实现全局唯一id。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

redis实现全局唯一id,redis,数据库,缓存

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

@Component
public class RedisIdWorker {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private static final long BEGIN_TIMESTAMP = 1672531200L;
    private static final int COUNT_BITS = 32;

    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;
    }
}

测试文章来源地址https://www.toymoban.com/news/detail-607498.html

package com.hmdp;

import com.hmdp.service.impl.ShopServiceImpl;
import com.hmdp.utils.RedisIdWorker;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Primary;

import javax.annotation.Resource;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@SpringBootTest
class ApplicationTests {
    @Autowired
    private RedisIdWorker redisIdWorker;
    //线程池500个
    private ExecutorService es = Executors.newFixedThreadPool(500);

    @Test
    void testIdWorker() throws InterruptedException {
        //开启一个倒计时的插销
        CountDownLatch countDownLatch = new CountDownLatch(300);
        //开启线程
        Runnable task = () -> {
            for (int i = 0; i < 100; i++) {
                long order = redisIdWorker.nextId("order");
                System.out.println(order);
            }
            //倒计时-
            countDownLatch.countDown();
        };
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 300; i++) {
            es.submit(task);
        }
        //当倒计时为0立马停止等待
        countDownLatch.await();
        long end = System.currentTimeMillis();
        System.out.println(end - begin);
    }


}

到了这里,关于redis实现全局唯一id的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vitess全局唯一ID生成的实现方案

    为了标识一段数据,通常我们会为其指定一个唯一id,比如利用MySQL数据库中的自增主键。 但是当数据量非常大时,仅靠数据库的自增主键是远远不够的,并且对于分布式数据库只依赖MySQL的自增id无法满足全局唯一的需求。因此,产生了多种解决方案,如UUID,SnowFlake等。下文

    2024年02月08日
    浏览(37)
  • 安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性

    DW + PHPStorm + PhpStudy + Navicat Premium DW : HTMLJSCSS开发 PHPStorm : 专业PHP开发IDE PhpStudy :Apache MYSQL环境 Navicat Premium: 全能数据库管理工具 1、数据库名,数据库表名,数据库列名 2、数据库数据,格式类型,长度,键等 PHP函数:连接,选择,执行,结果,关闭等 参考:https://www.runoo

    2024年02月17日
    浏览(61)
  • 集群高并发环境下如何保证分布式唯一全局ID生成?

    在集群高并发环境下保证分布式唯一全局ID生成是一个具有挑战性的问题。下面笔者将为大家提供几种常见的解决方案: UUID是一个128位的全局唯一标识符,它可以在不同的计算机和时间上生成。UUID的生成是基于MAC地址、时间戳等信息,因此可以保证在分布式环境下的唯一性

    2024年02月13日
    浏览(47)
  • MySQL数据库唯一索引

    创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式,分别是1.创建表的时候创建索引、2.在已经存在的表上创建索引和使用3.ALTER TABLE语句来创建索引。 本文福利, 莬 费领取Qt开发学习资料包、技术视频,内容包括(C++语言基

    2024年02月08日
    浏览(67)
  • hutool工具包 中的雪花算法Snowflake 获取Long类型id 或者String 类型id(全局唯一id解决方案)

    1.引入pom依赖 2.源码 3. 注入 使用 4优缺点:

    2024年02月14日
    浏览(44)
  • Redis多机数据库实现

    为《Redis设计与实现》笔记 客户端可以使用 SLAVEOF 命令将指定服务器设置为该服务器的主服务器 127.0.0.1:6379 将被设置为 127.0.0.1:123456 的主服务器 旧版复制功能的实现 Redis的复制功能分为同步(sync)和命令传播(command propagate)两个阶段 同步:将从服务器的数据库状态更新至

    2024年02月09日
    浏览(47)
  • Linux安装Redis数据库,实现远程连接

    转发自cpolar内网穿透的文章:公网远程连接Redis数据库【内网穿透】 Redis作为一款高速缓存的key value键值对的数据库,在许许多多的场景中广泛使用,由于是把数据存储在内存中,所以读写效率极高。 下面介绍如何在内网虚拟机的linux中搭建redis并通过cpolar内网穿透实现公网访问

    2024年02月08日
    浏览(51)
  • 使用序列(Sequence)在 Oracle 数据库中管理唯一标识符

    目录 1. 创建序列 2. 使用序列生成唯一值 3. 序列的常见应用场景 结论 简介: 在 Oracle 数据库中,序列(Sequence)是一种强大的工具,用于生成唯一的数值标识符。序列提供了一种简单而高效的方式来管理表的主键或其他需要唯一值的列。本文将介绍 Oracle 中序列的用法,包括

    2024年02月05日
    浏览(50)
  • Springboot+Redis:实现缓存 减少对数据库的压力

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 Redis实战与进阶 本专栏讲解Redis从原理到实践 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn.net/   目录 缓存如何实现?

    2024年03月24日
    浏览(59)
  • 【Spring Boot 3】【Redis】分布式唯一ID生成器

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包