Redis使用中的笔记

终于有机会在实际项目中使用redis了。代码review的过程中学到了很多,以后关于redis使用中需要注意的都记在这里

1.redis用完记得关闭. getJedis() 使用完了之后一定要释放连接。

2.善用redis的原子操作

比如我们规定卖10个产品,有2个窗口同时卖,用redis中一个string在进行计数。

每个窗口每次买卖数量不一定,假定是n。

如果我们用下面的逻辑(伪代码)

1.查询可卖数量                           available=jedis.get("total")-jedis.get("key")

2.和n进行比较                            n<=available

3.如果可以交易则进行交易             domission

4.修改可卖数量                          jedis.incrby("key",n)

那么当第一个窗口进行第1,2,3步的时候,第二个窗口也开始执行任务,则会造成冲突,很可能卖出超过10个产品

所以应该用如下的逻辑

1.增加可用                               count=jedis.incrby("key",n)

2.比较                                    count<=jedis.get("total")

3.交易                                    domission

 

用第二种方法中,incrby是原子操作,保证两个线程取到的都是加过之后的。这样就能避免了多线程造成的过度交易问题。

但是,当count>available时,我们不进行交易,不过此时我们必须将已经加上的计数去除,即再执行一次 jedis.decrby("key",n)

这样的方法,当第一个窗口要卖12个时,第二个窗口要卖1个。由于第一个窗口incr后,导致第二个窗口也超限而不卖。这样线程并发时两个都不会进行交易。

看起来不好,但是这样总好过超量交易造成严重后果。

 

这条看起来很简单,但是在是使用的过程中还是要注意

 

posted @ 2016-05-22 23:49  麻木鲁克  Views(123)  Comments(0)    收藏  举报