余量扣除,即在高并发,大用户下,每个用户的余量数据频繁发生变化。例如:12306的某车次票的余量,商品库存,短信余量账本等。
针对,此类频繁发生修改的原子类余量对象,采用mysql,oracle等数据,一定会存在操作瓶颈。本文拟采用内存的办法实现,使用redis Redisson客户端完成。当然,或许可以采用mangodb这类no-sql数据库。
Redisson客户端
https://github.com/mrniko/redisson/wiki
实现redis分布锁的客户端开源项目,redission支持4中连接redis方式,分别为单机,主从, Sentinel , Cluster 集群,并提供以下类库
1.AtomicLong原子操作
2.分布式List
3.分布式Set
4.分布式Map
5.分布式Queue,
6.分布式SortedSet,
7.分布式ConcureentMap
8.分布式Lock
9.分布式CountDownLatch
10. 分布式Publish / Subscribe, HyperLogLog等
余量扣除代码片段
resources/redis.properties
#redis部署模式SingleHost1MasterSlave2Sentinel3Cluster4
redis.deploymentModel=2
redis.hosts=192.168.161.73:6379,192.168.161.129:6379
redis.masterName=mymaster
redis.masteAddress=192.168.161.73:6379
RedissonClient
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.util.Properties;
importjava.util.concurrent.Future;
importorg.redisson.Config;
importorg.redisson.Redisson;
importorg.redisson.connection.RandomLoadBalancer;
importorg.redisson.core.RAtomicLong;
importorg.redisson.core.RMap;
publicclassRedissonClient{
privatestaticRedissonClientinstance;
privateRedissonClient(Stringfilename)throwsFileNotFoundException,IOException{
init(filename);
}
publicstaticsynchronizedRedissonClientgetInstance(Stringfilename){
if(instance==null){
try{
instance=newRedissonClient(filename);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
returninstance;
}
publicstaticvoidmain(String[]args){
RedissonClientclient=RedissonClient.getInstance("resources/redis.properties");
Redissonredisson=client.getSingleClient("ip:6379");
|