本文不涉及集群搭建操作
关于在lua脚本中操作redis的应用场景
大家都知道redis对于单个集合的操作是原子性的;但是有可能有一种场景是这样.比如说抢红包,现在有十个人抢五份红包,抽象到我们java代码里就是十个线程争抢五份资源,
而这个逻辑如果使用redis操作的话,是需要进行多步骤的数据增改操作,但是因为是多步骤,所以在第一个步骤或第二个步骤进行操作的时候redis都没任何问题,但是第三步可能就失败了.但因为不是原子性的,第一个步骤和第二个就不会回滚,数据就会不一致,但其它线程也不知道,依然会继续往下走,并且因为如果是分布式的话,那么因为无法加锁的原因(使用分布式锁情况例外,但性能并不好),就可能会发生不可预估的情况;那么这个时候我们的lua脚本就派上用场了,我们只需要将对redis进行操作的代码写进脚本里,并交给java去执行,那么 它的这几个步骤就都是原子性的,失败就一起失败,不用担心不会回滚的问题,而且你就算是线程再多,也只能一个一个的来执行脚本,并且因为是jvm内部执行脚本(也就是由cpu直接操作),性能也很高;
redis主从模式:
redis的主从模式就是一个主负责写或读,而一个或几个从则只负责读,由主定时的将记录添加或更改数据的日志文件同步到从数据库中,并且在同步的过程中,不会堵塞客户端的请求,通过这个模式可以很好的实现读写分离.但缺点就是不能实现高可用,一旦主数据库故障就会全面挂掉;
redis哨兵模式:
一个主加一个或多个从,这个就是在主从模式上实现了多可用,由一个或多个Sentinel 实例来监视主数据库,一旦挂机,就终止复制,并且提升一个从为新的主;
redis cluster模式:
多个主加多个从组成的redis集群,也是现在最常用的模式,也就是一个主一般带一个从,并且主从之间实现了哨兵模式,一旦主挂掉,从立马补上,并且几个主也就是Master之间实现了互相通信;