生成流水号的优化

最近写的项目有一个生成流水号的场景,数据需要设置到千万。

场景:客户查询时需要上传文件,为文件生成递增的流水号,需要递增,数量要预留千万。

问题:因为上传文件的频率并不高,所以不适合使用批量操作。但是每次上传都要去oracle数据库读取上一次的流水号,感觉效率很低。

解决方案:原理:使用Redis实现类似于Lazy load的流水号加载. 每次上传先检查Redis中是否有最新的流水号,如果有则直接使用,并将原值更新为自增后的值。如果没有,则从oracle数据库中加载一次存入Redis。 这样可以减少数据库的读取操作,从而优化性能。

可能出现的问题,多个线程同时读取了Redis中的流水号,然后使用后更新,可能出现lost update. (写丢失)。 解决方案:使用同步方法去读取和更新Redis。

原文地址:https://www.cnblogs.com/singular/p/10982371.html

时间: 2024-08-01 02:17:47

生成流水号的优化的相关文章

java中生成流水号的一个例子(使用关系型数据库)

在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成4位流水号)我们可以把公司和日期联合起来作为一个业务编码,把这个业务编码和序列的值存储到数据库中,每次需要生成流水号的时候根据公司和日期联合起来生成的这个业务编码去数据库里边去查,若有记录的话就把记录的话就把对应的序列值返回,然后序列的值加一,若根据对应的业务编码查询不到相应的记录就把流水号对应的最小的值返回,然后在数据库中插入相应的记录 这种场景使用类似BerkeleyDB这种K,Value对数据库来实现是最

mysql 生成流水号 存储过程 订单编号

用存储过程生成流水号是很常用的,这里以生成订单编号的流水号作为示例.(新的一天的流水号从1开始,如:今天的订单编号是CD2013010900014,下一个订单编号将是CD2013010900015:明天的订单编号将从CD2013011000001开始) 生成规则:    2位前缀+年月日+5位流水号     或者 2位前缀+年月日时分+5位流水号     或者 2位前缀+年月日时分秒+5位流水号. 测试订单表(test_orders): 1 CREATE TABLE `test_orders`

SQL Server 存储过程生成流水号

SQL Server利用存储过程生成流水号 USE BiddingConfig SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO -- ============================================= -- Author: 小爽 -- Create date: 2017-05-25 -- Description: 业务数据KEY生成 -- 构成规则: [区域编号][应用系统编号][版本编号][功能编号][日期戳][流水记录号]

java中生成流水号的一个例子(使用BerkeleyDB)

package com.jiaoyiping.berkeleydb; import com.sleepycat.je.*; import com.sleepycat.utilint.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.UnsupportedEncodingException; /** * Created with IntelliJ IDEA. * User: 焦一

Oracle生成流水号函数

1:日期范围上 smalldatetime的有效时间范围1900/1/1~2079/6/6 datetime的有效时间范围1753/1/1~9999/12/31 2:精准度上 smalldatetime只精准到分,而datetime则可精准到3位的毫秒. 3:存储空间上 smalldatetime占用4个字节,前2个字节存储base date(1900年1月1日)之后的天数.后2个字节存储午夜后的分钟数. datetime占用8个字节,前4个字节存储base date(即1900年1月1日)之前

Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用

                                         Default.aspx 网页界面 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.

Oracle生成流水号

流水号规则表Rul_Sequence: 规则表中的数据: 生成流水号辅助的存储过程: CREATE OR REPLACE PROCEDURE Proc_GetSeqence(SeqCode in varchar2,ReturnNum out Varchar2,MessageCode out varchar2 ) -- 异常消息等 is seqNowNumStr VARCHAR2(20); SeqNowNum int; --当前值 year CHAR(4); --年 YYYY month CHAR

新增时自动生成流水号ID

在项目中,新增某条记录的时候,为了定义某个不可重复的值,会采用自动生成流水号的方式来定义这个值.根据需要,定义的方法也多种多样,比如日期加3位流水号(例:20180115001).因此了解到两种生成流水号的方法: 一.Java生成流水号 生成流水号格式为yyyyMMddXXXX import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; public class Primary

WB 小技巧 生成流水号 生成随机号

前台HTML代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="