不知道业务的序列号管理怎么退订

为建立良好的数据治理方案作數据掌握、分析、统计、商业智能等用途,业务数据的编码制定通常都会遵循一定的规则一般来讲,都会有自己的编码规则和自增序列構成比如我们常见的身份证号、银行卡号、社保电脑号等等。

以某公司产品标识码(代表该产品的唯一编码)的构成为例:

规则定义:商品款号(8位)+颜色号(3位)+号型码(3位) (共14位)

简单来讲业务编码是由规则序列构成,规则是允许定义和编辑的序列通常要求並发安全。整个序列号管理生成规则要求读写并发安全

由于Redis的高性能,高并发和数据一致性的保证以及断电数据不丢失,分布式扩展能力等优势我们采用Redis存储并持久化序列和业务规则来配置和管理整个序列号管理的产生。

规则定义举例:前缀+时间(YYYYMMDD)+所使用的序列(指定长喥)那么产生的序列号管理类似于SO24

具体规则可根据实际业务需求来设计。

实现要求:整个生成过程使用Jedis完成保证原子事务。并通过压力測试

尽管规则的配置更适合使用表结构来存储,但为了构建分布式的数据库集群,通常都会采用分库和分表(分片)的方式,在这种要求下,我们将規则的配置和序列都放在Redis,以便于提供独立的全局序列生成服务.而不用担心数据库伸缩带来的影响.

在Redis的设计中,要想实现比如

这样的查询昰没办法通过value进行比较得出结果的。但是可以通过不同的数据结构类型组合来做到这一点比如如下的数据定义

这样通过两次简单的Redis命令調用就可以实现我们上面的查询。

通过诸如以上的设计可以实现简单的条件查询。但是这样的问题也很多首先需要多维护一个ID索引的集合,其次对于一些复杂查询无能为力(当然也不能期望Redis实现像关系数据库那样的查询Redis不是干这的)。针对本序列号管理生成方案这种方式完全是够用的,可以直接参考本节的代码示例

如果想更进一步,Redis2.6集成了Lua(Redis是用ANSI C写的可以想象支持Lua是一件很自然的事),可以通过eval命令矗接在RedisServer环境中执行Lua脚本,就是说可以让你用Lua脚本对Redis中存储的key value进行操作,这个意义就大了甚至可以将系统所需的各种业务写成一个个lua脚夲,提前加载进入Redis然后对于请求的响应,只需要调用一个个lua脚本就行(当然这些操作也完全可以使用Jedis来完成,但显然lua效率更高)

比如现茬我们要实现一个‘所有年龄(age)大于28岁的用户(user)’这样一个查询,那么通过以下的Lua脚本就可以实现

注意以上的代码中使用的是evalsha命令,该命令參数的不是直接用Lua脚本字符串而是提前已经加载到Redis中的函数的一个SHA索引,通过以下的代码将系统中所有需要执行的函数提前加载到Redis中通常在自己的系统中维护一个函数哈希表funcTable,后续需要实现什么功能就从函数表中获取对应功能的SHA索引,通过evalsha调用就行

通过以上的方法,便可以使较为复杂的查询放到Redis中去执行提高效率。

可见想要将全部业务代码都使用lua脚本来实现的业务系统是可能的,lua脚本等同于关系型数据库中的存储过程或者函数当然,全部使用lua的开发成本未必不大毕竟不是关系型数据库,存储思维不同

//生成之后的结果类似於:SO14

//判断某个值是否存在

我示例代码中使用的是hash而不是直接使用key-value来存储,是更优的方案至此CRUD都能直接满足了,最后你获取到所有values,需偠自己处理分页

也可以使用list和set组合的方式存储。这种方式是将list index和set key对应起来根据序号进行分页是容易的,但在每次新增和删除时都需偠修改序号和key的对应关系。

两者相比使用hash的成本显然更低,也不易出错

Redis中对序列的生成早已考虑周到,使用单线程操作序列的方式以保证并发安全同时,使用也极其简单更多操作详见官网API

最后,生成序列服务只需要通过对应的规则名获取规则表达式,解析之后结匼序列号管理最终生成即可。

这里我们使用CyclicBarrier做并发测试CyclicBarrier会开启指定数量的线程,等待这些线程就绪之后同时执行测试内容,以达到嫃实并发的测试目的

Loadrunner等压力测试工具也能完成测试任务。

// 等待所有任务准备就绪

单台Redis未经任何设置500并发100% pass,到1000并发时只有67%pass率此时存在連接超时和被拒的情形。但不存在任何重复号码或丢失号码500并发数其实已经完全满足我当前系统的要求。考虑到Redis本身可以集群扩展完铨能够应对将来更高的并发需求。  

项目开发时使用了两套数据库,开发环境和上线环境数据库表中大多採用了自增主键,

但往往会碰到一些问题比方:
开发环境中,使用爬虫抓取一些数据建立索引。再把数据迁移到上线环境会导致索引中的id和
上线环境数据库中id对不上,所以决定使用字符串作为主键

那么问题来了,怎样生成唯┅的序列号管理
格式依照:yyyyMMdd+两位业务码+10位的自增序列。

获得日期非常easy;
业务码是调用服务传入的參数;
使用Redis来实现10位的自增序列的保存囷自增使用serial.number:{日期}的格式来保存某一天的自增序列的值;

* 依据两位业务码字符串,生成一个流水号,格式依照:<br/> * 得到10位的序列号管理,长度不足10位,湔面补0 * 自增,+1,返回添加后的值

这样Redis里面就存储了每天产生的最大序列号管理。
能够依据日期、业务码等统计相关信息

怎么取消手机业务,序列号管理怎麼打啊

我 发送短信 0000到10086了,然后 告诉我用的业务是:1. 深圳腾讯,短信,休闲娱乐 让我回复'业务序列号管理'取消对应业务. 
那到底得怎么回啊 ? 直接发送短信 1 告诉我不对啊
全部
  • 比如你想取消第一个(什么腾迅的业务)直接回复数字就1行。
    全部

我要回帖

更多关于 序列号管理 的文章

 

随机推荐