分布式
现在最流行的就是分布式概念,分布式的好处显而易见,多台服务器各自为政但相互通信,部署不同功能的代码,功能互相不重合,比如登陆功能在登陆服务器上,购物和买单又在其他的服务器上。但是这也使得系统变得更加复杂,也就是解决了一个问题又引入一个新的问题。对应这个新的问题又引入了新的概念来解决它。其中一个概念就是分布式锁
为什么需要分布式锁
为什么需要锁
了解分布式锁之前我们先了解锁,编程的世界其实与我们现实生活的世界的一些规则以及运行方式差不多。只是用不同的方式来实现这些规则罢了。毕竟艺术(编程)来源于生活嘛。
现实生活中锁是为了让自己独占某种东西的一种工具,比如门锁,车锁,电脑锁等等,编程中的锁其实也是这个意思,我先将想要的东西锁住不给别人用,这类东西一般是编程中共享的变量,等我用完了,我再将锁解开给别人用。但是现实世界中人是自私的,如果是私人物品,比如私家车,一般用完也不会给你解锁让你用(捂脸!)。
在分布式出现之前,编程中的锁一般是指单机环境中的线程锁,也就是一个进程中如果存在多个线程同时操作共同的变量,那么让先进来的线程锁住这个变量,当前线程出来之后再解锁给后面的线程使用。
分布式锁
分布式概念出现后,就有了多机环境,在多机环境下,比如后台库存服务器上需要往数据库加数据,而购物功能服务器此时需要对同一个商品进行减一个数据。由于在不同的服务器上,此处普通的锁是无法作用的,就需要一个数据中心这样的一个概念,来接受各方的请求,然后统一处理,在数据中心中完成加锁的操作,然后再统一发到后方数据库。此时的锁就是分布式锁,而此时的数据中心一般就是redis。
基于 redis 的 setnx()、get()、getset()方法可以简单的做分布式锁,但是实际应用中还需要考虑节点突然挂掉,执行时间不够等特殊情况,还需要考虑用lua脚本来实现原子性
其实再怎么分布式都得有一个中心来分发消息,比如分发任务需要有一个任务分配器等,这个就有点像网络拓扑中的二叉树,不管有分几个节点,都会有一个根结点