当前位置: 首页 > news >正文

重庆微网站开发公司网页版微信登录入口官网

重庆微网站开发公司,网页版微信登录入口官网,免费软件恢复微信聊天记录,怎样进入网站管理系统本博客为个人学习笔记#xff0c;学习网站与详细见#xff1a;黑马程序员Redis入门到实战 P48 - P49 目录 全局ID生成器介绍 基于Redis自增实现全局ID 实现代码 全局ID生成器介绍 背景介绍 当用户在抢购商品时#xff0c;就会生成订单并保存到数据库的某一张表中#…  本博客为个人学习笔记学习网站与详细见黑马程序员Redis入门到实战 P48 - P49  目录 全局ID生成器介绍 基于Redis自增实现全局ID 实现代码 全局ID生成器介绍 背景介绍 当用户在抢购商品时就会生成订单并保存到数据库的某一张表中而订单表如果使用数据库自增ID就会存在一些问题 1. id的规律性太明显 2. 受单表数据量的限制 基于使用数据库自增ID带来的两个问题我们来做场景分析 1. 场景分析一如果我们的id具有太明显的规则用户或者说商业对手很容易猜测出来我们的一些敏感信息比如商城在一天时间内卖出了多少单这明显不合适。 2. 场景分析二MySQL的单表容量不宜超过500万条记录。随着我们商城规模的扩大数据量增长到一定程度后我们需要进行数据库拆分和表拆分。拆分后这些表在逻辑上仍然属于同一张表因此它们之间的数据ID不能相同。因此我们必须确保全局ID的唯一性。 全局ID生成器 全局ID生成器是一种在分布式系统下用来生成全局唯一ID的工具一般要满足下列特性 1. 唯一性 2. 高性能 3. 高可用 4. 递增性 5. 安全性 基于Redis自增实现全局ID 全局ID组成结构图序列号由于Redis的自增操作是原子性的保证了在并发情况下生成ID的唯一性避免了传统数据库中的锁竞争和性能瓶颈。因此我们可以利用Redis的自增原子性让序列号由Redis自增的数值组成因此我们确保了全局ID序列号的唯一性从而确保了整个全局ID的唯一性。 同时我们还需要考虑一个问题我们利用Redis自增实现全局ID但如果我们只设置一个Key值随着业务的日积月累自增值将会达到上限。为避免这种情况发生我们需要设置不同的Key值于是我们决定用年月日的格式 yyyy:MM:dd 来添加到Key值的前缀当中因此一个Key值的自增量不再是用来表示所有时间的业务量而只是用来表示某年某月某天的业务量而一天的业务量是不可能超过 2^32 (几十亿) 这么大的数值的我们从而确保了Key值不会达到上限。 而这种做法也方便了我们对业务数据的统计当我们想查询一年中的业务量时我们只需要查询前缀为 yyyy 的Key值自增量即可如果我们想查询某年某月的业务量时我们只需要查询前缀为 yyyy:MM 的Key值自增量即可。 时间戳为了增加全局ID的安全性我们并能不直接把Redis的自增值(序列号)当作全局ID而是应该在此基础上拼接一些其它信息我们可以先设置某一个时间的时间戳作为参照时间戳如2000年1月1日0时0分0秒之后每当用户下单我们可以获取下单时间的时间戳再与参照时间戳做差得到的差值用来组成全局ID的时间戳这一部分。显然我们全局ID设置的时间戳只有32位因此我们需要确保差值是在2^32大小内而2^32秒相当于136年的时间因此是妥妥够用的或者我们也可以选择对参照时间差进行调整来确保差值不会超过2^32 实现代码 全局ID生成器代码如下 Component public class RedisIdWorker {private static final long BEGIN_TIMESTAMP 1640995200L;private static final long COUNT_BITS 32;Resourceprivate StringRedisTemplate stringRedisTemplate;public long nextId(String KeyPrefix) {// 1.生成全局ID时间戳部分LocalDateTime now LocalDateTime.now();long nowSecond now.toEpochSecond(ZoneOffset.UTC);long timestamp nowSecond - BEGIN_TIMESTAMP;// 2.生成全局ID序列号部分// 2.1获取当前日期精确到天String date now.format(DateTimeFormatter.ofPattern(yyyy:MM:dd));// 2.2获取自增长值Long count stringRedisTemplate.opsForValue().increment(icr: KeyPrefix : date);// 3.拼接时间戳和序列号并返回return timestamp COUNT_BITS | count;}// 用于计算20220101时间戳给BEGIN_TIMESTAMP赋值public static void main(String[] args) {LocalDateTime time LocalDateTime.of(2022, 1, 1, 0, 0, 0);long second time.toEpochSecond(ZoneOffset.UTC);System.out.println(second second);}}
http://www.dnsts.com.cn/news/104491.html

相关文章:

  • 金融 网站 源码穿山甲广告联盟
  • 网站建设创业计划书模板范文郑州开发软件的公司
  • 社交网站开发难度北京电子商务网站制作
  • 义乌网站建设zisou8公司内部网站建设管理办法
  • 哪里网站建设便宜设计医院网站建设
  • 网站建设技术咨询协议购物网站怎么建立
  • 郑州企业网站建设公司东西湖建设局网站
  • 建网站多少钱 万户百度搜索数据
  • 网站不足之处正常成都建设网站
  • 网站标题分隔符网站备案核验单怎么填
  • 网站建设与管理pdf微信网站如何做
  • 网站建设公司专业开发北京网站家电企业展厅设计
  • 做学校网站的目的做网站需要哪些程序
  • app与手机网站的区别怎样弄一个自己的网站
  • 永川做网站做鞋子的招聘网站有哪些
  • 做网站代理工作安全吗苏州建设工程公司
  • 太原的网站搭建公司如何做影视网站
  • 做网站原型图用什么软件表白网页设计代码大全
  • 做空比特币的网站深圳市建设局科技处网站
  • 网站seo收费360网站在系统那里
  • 网站有标题网页制作教程pdf
  • 海口cms建站系统enfold wordpress汉化
  • 自助建站平台免费商务型企业网站建设
  • 大型网站开发语言排名高校网站建设情况报告范文
  • 做网站需要准备什么东西软文有哪几种类型
  • 哪个网站做农产品网站建设行业解决方案
  • 深圳企业营销型网站网站建设高端网页设计
  • 李沧网站建设公司音乐 wordpress
  • 宁夏政务大厅城乡建设厅口网站网站自助授权系统
  • 大厂做网站邢台高端网站建设公司