聚合全网技术文章,根据你的阅读喜好进行个性推荐
这种的话,先进行抢购,然后隔一段时间再同步到数据库中? 抢购纪录表,抢购成功的表, 剩余量等表。 纪录表应该在进行中就要保存吧。
楼主码农几年了?
评论删除后,数据将无法恢复
最终的实现方式是这样的,利用redis+lua脚本。 redis2.6开始就可以使用lua作为脚本了,能够保证原子性。 测试后发现 600并发 0s发出去,跑了2个小时,平均响应时间 300ms , 性能非常强。 现在还没有时间写文章,特提供一个连接,大家可是试试。http://blog.csdn.net/hengyunabc/article/details/19433779
是否需要判断resulut里头的值?
if (result == null || result.isEmpty()) {
jedis.unwatch();
} else {
引用来自“圣杰是也”的评论
这种的话,先进行抢购,然后隔一段时间再同步到数据库中? 抢购纪录表,抢购成功的表, 剩余量等表。 纪录表应该在进行中就要保存吧。
引用来自“首席打酱油”的评论
什么玩意啊 redis本身就支持原子增减的,还用你实现什么锁?Long redis.clients.jedis.Jedis.incrBy(String key, long integer)?
直接往redis中扔一个红包个数,比如10,每有人抢一次调用一次incrBy(String key, -1)
当返回值是0说明抢完了。
Long redis.clients.jedis.Jedis.incrBy(String key, long integer)?
直接往redis中扔一个红包个数,比如10,每有人抢一次调用一次incrBy(String key, -1)
当返回值是0说明抢完了。
成功抢到的 加上这句:jedis.zincrby("count", 1.0d, userId + "");
以上代码并发测试通过的。
Transaction tx2 = jedis.multi();
// //注意TX2不能做查询 否则就出现:Cannot use Jedis when in Multi. Please use JedisTransaction instead.
if(RedisAPI.zscore("count", userId+"")==null)
{ tx2.zadd("count", 0.0d, userId+"");
}
if (RedisAPI.zscore("count", userId + "") != null)
if (RedisAPI.zscore("count", userId + "") == 0.0d) {
tx2.zincrby("cpunt", 1.0d, userId + "");
} else {
System.out.println("setp1:失败的:"+userId);
flag = 2;
return flag;
}
List<Object> result = tx2.exec();
if (result == null || result.isEmpty()) {
System.out.println("setp2:失败的:"+userId);
flag = 2;
return flag;
}
jedis.unwatch();
}
引用来自“dongzhecao”的评论
/ 每个请求对应一个userIdint userId = new Random().nextInt(999999);
// 判断是否购买过
Boolean isBuy = RedisAPI.sismember("userIdSet", userId + "");
if (isBuy) {......................
在并发下,这样的控制显然是有漏洞(已领用的可以再次领),可以用并发压一下(把随机数改小点更容易显现)
int userId = new Random().nextInt(999999);
// 判断是否购买过
Boolean isBuy = RedisAPI.sismember("userIdSet", userId + "");
if (isBuy) {......................
在并发下,这样的控制显然是有漏洞(已领用的可以再次领),可以用并发压一下(把随机数改小点更容易显现)
引用来自“wangjianme”的评论
支持引用来自“猪的暧昧”的评论
楼主码农几年了?