Redis应用(1)——生成全局唯一标识ID

2023-11-01

1 概述

在实际项目中,根据不同的业务逻辑需要生成唯一的标识id ,如购买商品生成的订单号。尽管这个标识id功能非常的简单,但是如果不能成功的生成唯一标识id,那将会影响后续的业务逻辑 。我们可以使用数据库去生成唯一标识id,但是其性能受到数据库性能的硬性,且随机标识id过于简单会暴露业务信息。

所以意味着,生成唯一标识的逻辑方法需要高性能且高可用。并且需要高安全性,不能暴露出业务信息。在这篇文章中,将使用redis数据库区生成唯一的标识id

生成的逻辑是时间戳 + r e d i s 自增序列号 \textcolor{red}{生成的逻辑是 时间戳+redis 自增序列号} 生成的逻辑是时间戳+redis自增序列号

在这里插入图片描述
序列号的类型可以为Long 类型,数据值足够大,可以确保ID唯一不重复

逻辑: 通过时间戳左移31位,并与低32位的序列号值或

2 方法实现

K e y 分析 \textcolor{blue}{Key 分析} Key分析
(1)Key 前缀为 lock:
(2)该唯一标识id 的生成器 应该与不同的业务逻辑区分。 所以应该拼接服务的名称信息。如订单的唯一标识id key的结构可以为lock:order:

V a l u e 分析 \textcolor{blue}{Value 分析} Value分析
String 结构去存储自增值,每次自增一即可。

/**
 * @Description redis 唯一id生成器
 **/
@Component
public class RedisIdWorker {

    private  final static  long BEGIN_TIMESTAMP=1672531200L;

    private final static int BITS_COUNT=32;

   private final static String LOCK_PREFIX="lock:";

    private StringRedisTemplate redisTemplate;

    public RedisIdWorker(StringRedisTemplate redisTemplate){
        this.redisTemplate=redisTemplate;
    }


    /**
     * 根据业务场景生成唯一标识id
     * 生成逻辑是32位时间戳+自增值构成的64位数
     * @param prefix
     * @return
     */
    public long uniqId(String serviceName){
        //生成时间戳
        Long now = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
        Long l1 = now - BEGIN_TIMESTAMP;
        //从Redis中获得自增序列号
        String key=prefix+serviceName;
        Long increment = redisTemplate.opsForValue().increment(key);
        //拼接返回数据 高位向左移32位 与 32位低位与
        //序列号为64位的long值
        return l1<<BITS_COUNT|increment;

    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis应用(1)——生成全局唯一标识ID 的相关文章

  • 如何在实时添加对象时从 Redis 中弹出对象?

    我想让 Node js 进程运行 因为它正在检查 Redis 服务器是否有任何新的弹出内容 另一个进程将偶尔进行推送 而 Node 进程将尝试弹出任何进来的内容 Node 进程将保持运行 有人能给我指出一个好的方向吗 我正在尝试找出如何监听
  • 连接到 localhost:6379 时出现错误 99。无法分配请求的地址

    设置 我有一个虚拟机 并在虚拟机中运行三个容器 一个 nginx 代理 一个非常简约的 Flask 应用程序和 redis Flask 应在端口 5000 上提供服务 而 redis 应在 6379 上提供服务 这些容器中的每一个都可以作为
  • AWS Redis 从外部连接

    有没有办法从外部 AWS 网络连接 AWS 上托管的 Redis 实例 我有一个基于 Windows 的 EC2 实例在 AWS 上运行 另一个是 Redis 缓存节点 我知道有人问过这个问题 但答案是在基于 Linux 的系统中 但我的是
  • Spring RedisTemplate:8次调用后方法键挂起

    我使用 Spring RedisTemplate spring data redis 1 7 1 与 Redis 进行通信 我需要通过正则表达式获取然后删除键 例如 context user1 我用的方法 RedisTemplate key
  • Node.js 上通过套接字连接 Redis

    由于共享托管 目标主机上的我的 redis 服务器不在端口上运行 而是在非常特定的套接字上运行 可以通过套接字文件连接到该套接字 只有我的用户可以访问 但是 我还没有找到如何通过套接字指定连接node redis and connect r
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • 如何在节点redis客户端上设置读取超时?

    在 github 上我没有看到读取超时的选项 https github com NodeRedis node redis https github com NodeRedis node redis There s connect timeo
  • 如何统计 Redis 流中未读或已确认的消息?

    使用 Redis 5 0 3 假设我们创建一个名为streamy和一个消费群体consumers XGROUP CREATE streamy consumers MKSTREAM 然后向其中添加一些消息 XADD streamy messa
  • 如何设置 Celery 以通过 ssl 与 Azure Redis 实例对话

    使用 的伟大答案 如何在microsoft azure上的django项目中配置celery redis https stackoverflow com questions 39616701 how to configure celery
  • 如果另一个键中的计数器低于零,则从集合中原子删除一个项目?

    雷迪斯2 0 3 在我的 Redis DB 中 我有一组项目 每个项目都有一个与其关联的计数器 MULTI SADD items set foo INCRBY items foo 10000 EXEC 新项目会以随机间隔添加到集合中 当用户
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • 为什么Redis中没有有序的hashmap?

    Redis 数据类型 http redis io topics data types包括排序集 http redis io topics data types intro sorted sets以及其他用于键值存储的必要数据结构 但我想知道
  • 在 Redis 上为 Django 和 Express.js 应用程序共享会话存储

    我想创建一个包含一些登录用户的 Django 应用程序 另一方面 由于我想要一些实时功能 所以我想使用 Express js 应用程序 现在的问题是 我不希望身份不明的用户访问 Express js 应用程序的日期 因此 我必须在 Expr

随机推荐

  • CMake中aux_source_directory的使用

    CMake中的aux source directory命令用于查找目录中的所有源文件 其格式如下 aux source directory
  • 新手如何有效的刷算法题(LeetCode)

    点击关注上方 五分钟学算法 设为 置顶或星标 第一时间送达干货 来源 五分钟学算法 前言 作为一名非科班出身的程序员 我是参加工作之后才开始接触算法 学算法至今有将近五年的时间 期间输出文字约 100 多万 从算法小白到写出百万阅读的算法文
  • python3 mmh3安装及使用

    mmh3安装方法 哈希方法主要有MD SHA Murmur CityHash MAC等几种方法 mmh3全程murmurhash3 是一种非加密的哈希算法 常用于hadoop等分布式存储情境中 在anaconda中安装使用命令 pip in
  • 【项目实战】AOSP源码阅读与目录结构

    一 背景 随着Android系统的不断发展 了解其内部实现和架构变得越来越重要 AOSP Android Open Source Project 是Android的开放源代码项目 为开发者提供了详细的源代码和工具 使得我们能够深入了解And
  • 【2023年电赛】运动目标控制与自动追踪系统(E 题)最简单实现

    本方案的思路是最简单的不涉及复杂算法 识别矩形框 标记矩形框 输出坐标和中心点 计算长度 控制舵机移动固定长度 仅供完成基础功能参考 不喜勿喷 实现运动目标控制与自动追踪系统 任务概述 本文将介绍如何使用OpenMV开发板和舵机构建一个运动
  • I/O,文件操作,File类

    前言 小亭子正在努力的学习编程 接下来将开启javaEE的学习 分享的文章都是学习的笔记和感悟 如有不妥之处希望大佬们批评指正 同时如果本文对你有帮助的话 烦请点赞关注支持一波 感激不尽 目录 前言 前驱知识 文件 目录 文件路径 Path
  • 阿里短信服务集成

    技术分享交流群 1125844267 大家可以进来唠嗑闲聊 前言 目前阿里短信不支持个人申请签名和模板 所以只能使用测试版固定的签名和模板 提示 以下是本篇文章正文内容 下面案例可供参考 一 控制台配置 1 进入阿里云官网 搜索 短信服务
  • Hyperledger Fabric全面理解

    Fabric结构 Fabric结构 Fabric 0 6的特点 结构简单 应用 成员管理 Peer的三角形关系 主要业务功能全部集中于Peer节点 架构问题 由于peer节点承担了太多的功能 所以带来扩展性 可维护性 安全性 业务隔离等方面
  • scanf和printf介绍

    1 scanf scanf函数是C语言中标准库中的输入函数 其主要作用是从标准输入设备 如键盘 获取输入数据 并将读取的数据存储到指定的变量中 其基本用法如下 读取整型数据 int num scanf d num 从标准输入读取一个整数 并
  • 使用Windows PowerShell 连接远程服务器

    1 使用管理员权限启动Windows PowerShell 2 在控制台中使用SSH指令 ssh usrname ip 更多ssh用法参照如下 PS C WINDOWS system32 gt ssh help unknown option
  • protocol buffers(protobuf)安装教程

    本文按照mac讲解protobuf的安装 windows上比较好安装按照mac的基本流程就可以安装成功 mac上的安装有的时候比较容易出现问题 一 通过brew的方式安装 仅Mac 需要mac中存在brew 输入命令 brew versio
  • HBuilder配置SVN

    注意 大家都配置前最好先备份好之前的文件资料 很早之前就想在编辑器上配置SVN 但找了很多资料都没有合适的 于是就自己摸索了一下 最后终于配置成功了 对于项目较大的公司来说一般都用SVN或新起的Git来协作团队开发 后台开发用的VS基本都集
  • AIX升级openssh步骤

    提前在IBM官方下载适用版本的openssl及openssh 安装步骤 1 首先启动待升级服务器telnet服务 并通过telnet登陆 startsrc t telnet 启动telnet 2 查看并记录已安装ssl ssh版本 方便升级
  • 单片机c语言延时1ms函数,单片机c语言延时函数用int与char有延时差吗?

    单片2113机的C语言关于延时函数主要有两种一种是用5261for循环 通过单片机执4102行空指令达到延时的1653目的如 for i 0 i lt 100 i 这个简单的语句会执行100次空指令每一次指令的时间可以大概确定因此这个是最简
  • CreateThread函数,无法将参数 3 从“DWORD (__cdecl *)(LPVOID)”转换为“LPTHREAD_START_ROUTINE” PVZCheater

    问题 HANDLE CreateThread LPSECURITY ATTRIBUTES SIZE T LPTHREAD START ROUTINE LPVOID DWORD LPDWORD 无法将参数 3 从 DWORD cdecl LP
  • 操作系统精髓与设计原理(原书第6版) 第二章操作系统概述 学习笔记(2)

    第二章 操作系统概述 2 4 现代操作系统的特征 1 微内核体系结构 微内核体系结构只给内核分配一些最基本的功能 包括地址空间 进程间通信 InterProcess Communication 简称IPC 和基本的调度 其他的操作系统服务都
  • 齿轮泵、叶片泵、柱塞泵及螺杆泵的工作原理及特点

    齿轮泵 叶片泵 柱塞泵及螺杆泵的工作原理 常见问题及特点 一 齿轮泵 工作原理 外啮合 相互啮合的轮齿当脱开啮合时 轮齿啮合线间的密闭容积增大形成压差 液压油从吸油腔途径吸油管路吸入齿谷 随着齿轮的旋转 齿谷的油液被带入压油腔 随着轮齿进入
  • 混淆矩阵 Confusion Matrix

    混淆矩阵定义 机器学习中总结分类模型预测结果的分析表 以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准并进行汇总 矩阵的行表示真实值 矩阵的列表示预测值 分类评估指标中定义的一些符号含义 如下 1 TP True P
  • Java从json串中获取某个值

    Java从json串中获取某个值 java对象是不能直接传输 只有json对象 转成字符串 可以进行传输 故 传输中都是json进行的 接收到json数据之后 java在进行解析转换成为字符串 且json适用于很多语言之间的传输 json本
  • Redis应用(1)——生成全局唯一标识ID

    1 概述 在实际项目中 根据不同的业务逻辑需要生成唯一的标识id 如购买商品生成的订单号 尽管这个标识id功能非常的简单 但是如果不能成功的生成唯一标识id 那将会影响后续的业务逻辑 我们可以使用数据库去生成唯一标识id 但是其性能受到数据