广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Redis生成分布式系统全局唯一ID的实现
  • 656
分享到

Redis生成分布式系统全局唯一ID的实现

2024-04-02 19:04:59 656人浏览 安东尼
摘要

目录分布式系统全局唯一ID基于Redis INCR 命令生成分布式全局唯一ID采用Redis生成商品全局唯一ID分布式系统全局唯一ID 在互联网系统中,并发越大的系统,数据就越大,数

分布式系统全局唯一ID

互联网系统中,并发越大的系统,数据就越大,数据越大就越需要分布式,而大量的分布式数据就越需要唯一标识来识别它们。

例如淘宝的商品系统有千亿级别商品,订单系统有万亿级别的订单数据,这些数据都是日渐增长,传统的单库单表是无法支撑这种级别的数据,必须对其进行分库分表;一旦分库分表,表的自增ID就失去了意义;故需要一个全局唯一的ID来标识每一条数据(商品、订单)。

e.g: 一张表1亿条数据,被分库分表10张表,原先的ID就失去意义,所以需要全局唯一ID来标识10张表的数据。

全局唯一的ID生成的技术方案有很多,业界比较有名的有 UUID、Redis、Twitter的snowflake算法、美团Leaf算法。

基于Redis INCR 命令生成分布式全局唯一ID

INCR 命令主要有以下2个特征:

  • Redis的INCR命令具备了“INCR AND GET”的原子操作
  • Redis是单进程单线程架构,INCR命令不会出现ID重复

基于以上2个特性,可以采用INCR命令来实现分布式全局ID生成。

采用Redis生成商品全局唯一ID

Project Directory

Maven Dependency


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="Http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.8.RELEASE</version>
        <relativePath/>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.fool.redis</groupId>
    <artifactId>redis-string-id</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-WEB</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.properties


spring.application.name=redis-spring-id
server.port=8888

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.database=0
spring.redis.passWord=
spring.redis.timeout=2000
spring.redis.pool.max-active=10
spring.redis.pool.max-wait=1000
spring.redis.pool.max-idle=10
spring.redis.pool.min-idle=5
spring.redis.pool.num-tests-per-eviction-run=1024
spring.redis.pool.time-between-eviction-runs-millis=30000
spring.redis.pool.min-evictable-idle-time-millis=60000
spring.redis.pool.soft-min-evictable-idle-time-millis=10000
spring.redis.pool.test-on-borrow=true
spring.redis.pool.test-while-idle=true
spring.redis.pool.block-when-exhausted=false

SRC

Application.java


package org.fool.redis;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Product.java


package org.fool.redis.model;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class Product {
    private Long id;
    private String name;
    private BigDecimal price;
    private String detail;
}

IdGeneratorService.java


package org.fool.redis.service;

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

@Service
public class IdGeneratorService {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static final String ID_KEY = "id:generator:product";

    public Long incrementId() {
        return stringRedisTemplate.opsForValue().increment(ID_KEY);
    }
}

ProductController.java


package org.fool.redis.controller;

import lombok.extern.slf4j.Slf4j;
import org.fool.redis.model.Product;
import org.fool.redis.service.IdGeneratorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RequestMapping(value = "/product")
public class ProductController {
    @Autowired
    private IdGeneratorService idGeneratorService;

    @PostMapping(value = "/create")
    public String create(@RequestBody Product obj) {
        //生成分布式id
        long id = idGeneratorService.incrementId();

        //使用全局id 代替数据库的自增id
        obj.setId(id);

        //取模(e.g: 这里分为8张表,海量数据可以分为1024张表),计算表名
        int table = (int) id % 8;
        String tableName = "product_" + table;

        log.info("insert to table: {}, with content: {}", tableName, obj);

        return "insert to table: " + tableName + " with content: " + obj;
    }
}

Test


curl --location --request POST 'http://localhost:8888/product/create' \
--header 'Content-Type: application/JSON' \
--data-raw '{
    "name": "Car",
    "price": "300000.00",
    "detail": "Lexus Style"
}'

Console Output

到此这篇关于Redis生成分布式系统全局唯一ID的实现的文章就介绍到这了,更多相关Redis生成分布式系统全局唯一ID内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Redis生成分布式系统全局唯一ID的实现

本文链接: https://www.lsjlt.com/news/155334.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis生成分布式系统全局唯一ID的实现
    目录分布式系统全局唯一ID基于Redis INCR 命令生成分布式全局唯一ID采用Redis生成商品全局唯一ID分布式系统全局唯一ID 在互联网系统中,并发越大的系统,数据就越大,数...
    99+
    2022-11-12
  • Redis生成全局唯一ID的实现方法
    目录简介:特性:生成规则: ID生成类:测试类:简介: 全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具 特性: 唯一性高性能安全性高可用递增性 生成规则:...
    99+
    2022-11-13
  • Java几种分布式全局唯一ID生成方案
    目录缘起常见方案UUID数据库自增键TDDL SequenceLeaf-segment类雪花算法时间回拨问题Leaf-snowflakeSeata UUID总结缘起 在分布式微服务系...
    99+
    2023-01-30
    Java分布式全局唯一ID生成 Java分布式全局唯一ID
  • 利用Redis实现分布式全局ID生成
    利用Redis实现分布式全局ID生成随着互联网的发展,分布式系统的应用场景越来越多,如何生成全局唯一的ID成为了一个非常重要的问题。传统的自增ID,由于单点数据源的限制,无法满足分布式系统的需要。利用Redis作为分布式系统的全局ID生成器...
    99+
    2023-11-08
    分布式 redis ID生成
  • Go开源项目分布式唯一ID生成系统
    目录前言项目背景项目使用HTTP 方式gRPC 方式本地开发项目架构前言 今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID。上周停更了一周,也...
    99+
    2022-11-13
  • Redis唯一ID生成器的实现
    ID的组成部分: 符号位:1bit,永远为0时间戳:31bit,以秒为单位,可以使用69年序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID 生成代码: public class RedisIdWorker...
    99+
    2022-07-05
    Redis唯一ID生成器 Redis生成唯一ID
  • springboot集成redis并生成全局唯一索引ID的方法
    本篇内容主要讲解“springboot集成redis并生成全局唯一索引ID的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot集成redis并生成全局唯一索引ID的方法”吧!...
    99+
    2023-06-29
  • Go实现分布式唯一ID的生成之雪花算法
    目录背景:特性:雪花算法:分布式唯一ID的生成 背景: 在分布式架构下,唯一序列号生成是我们在设计一个尤其是数据库使用分库分表的时候会常见的一个问题 特性: 全局唯一,这是基本要求,...
    99+
    2022-11-13
  • Redis全局ID生成器的实现
    全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般满足下列特性: 唯一性:确保ID是唯一的,不可重复递增性:确保是整体逐渐增大的,这样有利于数据库创建索引安全性:I...
    99+
    2022-11-13
  • 分布式业务系统中全局ID生成策略的示例分析
    这篇文章主要为大家展示了“分布式业务系统中全局ID生成策略的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“分布式业务系统中全局ID生成策略的示例分析”这篇文章吧。一、全局ID简介在实际的...
    99+
    2023-06-05
  • 交互分布式系统下如何生成唯一序列
    目录1 介绍2 数据库自增3 系统时间毫秒数4 UUID(GUID)5 批量预生成ID6 Redis生成唯一序列7 snowflake算法8 UidGenerator9 Leaf10...
    99+
    2022-11-13
  • leaf方案实现美团点评分布式ID生成系统
    目录背景常见方法介绍UUID类snowflake方案应用举例Mongdb objectID数据库生成Leaf方案实现Leaf-segment数据库方案双buffer优化Leaf高可用...
    99+
    2022-11-13
  • 基于Redis实现分布式单号及分布式ID(自定义规则生成)
    目录背景Redis实现方式代码实例单号生成枚举单号生成工具类单号生成接口单号生成接口实现使用测试总结背景 一些业务背景下,业务要求单号需要有区分不同的前缀,那么在分布式的架构下如何自...
    99+
    2022-11-12
  • java web在高并发和分布式下实现订单号生成唯一的解决方案
    方案一:如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间戳正常不同,因此用时间戳+随机数(或自增数)就可以区分各个订单。如果存在并发,且订单号是由一个进程中的多个线程产生的,那么只要把线程ID添加到序列号...
    99+
    2023-05-30
    java web 高并发
  • 如何使用Redis实现一个安全可靠的分布式锁
    这篇文章给大家分享的是有关如何使用Redis实现一个安全可靠的分布式锁的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。并发场景下多个进程或线程共享资源的读写,需要保证对资源的访问互...
    99+
    2022-10-18
  • 分布式系统中如何利用Python实现高效的二维码生成和扫描?
    随着移动互联网的快速发展,二维码已经成为了一种非常重要的信息传递方式。在很多场景中,我们需要使用二维码来实现不同设备之间的信息交换,比如支付、扫码登录等。在分布式系统中,如何实现高效的二维码生成和扫描是一个非常有意义的问题。 Python...
    99+
    2023-10-02
    关键字 二维码 分布式
  • 二维码在分布式系统中的应用,Python如何实现快速生成和解码?
    随着现代科技的不断发展,分布式系统越来越受到人们的关注,而二维码作为一种快速便捷的信息传递方式,在分布式系统中也扮演着越来越重要的角色。本文将介绍二维码在分布式系统中的应用,并且详细介绍Python如何实现快速生成和解码二维码。 一、二维...
    99+
    2023-10-02
    关键字 二维码 分布式
  • 分布式系统中的 Python 与 Windows:如何实现安全性与可靠性?
    随着分布式系统的不断普及,Python和Windows在这个领域中扮演着重要的角色。然而,如何在分布式系统中实现安全性与可靠性,是一个需要解决的重要问题。本文将介绍如何使用Python和Windows来实现分布式系统的安全性和可靠性。 一、...
    99+
    2023-08-21
    分布式 javascript windows
  • Python使用multiprocessing实现一个最简单的分布式作业调度系统
    mutilprocess像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多。 介绍 Python的multiproc...
    99+
    2022-06-04
    作业 分布式 最简单
  • 如何使用Python中的异步IO和协程实现一个高并发的分布式任务调度系统
    如何使用Python中的异步IO和协程实现一个高并发的分布式任务调度系统在当今高速发展的信息时代,分布式系统变得越来越普遍。而高并发的任务调度系统也成为许多企业和组织中不可或缺的一部分。本文以Python为例,介绍了如何使用异步IO和协程来...
    99+
    2023-10-27
    Python 协程 异步IO
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作