在分布式 项目 各个模块彼此相对独立,
比较夸张一点的情况, =>例如说: 大部分模块是 java 语言写 ,有的模块比较适合用Python,就有用Python语言写的模块,不同模块 彼此通过 json 字符串 交流沟通;
这个时候就产生了 对公共资源的一些问题;
/*************************************************************************************************************************************/
分布式 锁
Redis 解决方案:
把各个模块拟人化,大家需要访问共同的数据资源;这个资源需要保证同步;
大家共同约定 在 这个资源上 约定 一个锁 (redis 中的 一个 key);
比如说
张三进入这个资源的时候,就随手关门,把这个新增key锁(这个时候张三正在里面使用数据),
其他人,过来需要访问这个资源了,看这个有key锁, 就知道,现在不能进,则等待,过段时间再来尝试;
等张三完事以后释放资源,就是删除这个 key ,代表张三完事了,现在没人访问资源了;
这时其他模块看到 key 不存在了,就可以访问资源了;
如此用redis 作为 分布式的锁;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
在如上逻辑的基础之上,升级版
为这个key锁 设置超时时间;
可能出现糟糕的情况是,张三在门外挂着锁,然后张三因为意外在里面挂了,张三模块在释放锁之前宕机了,则 锁key将一直挂着们上,其他模块访问不到;
升级版是 大家 包括 张三 在进去 访问资源 挂起 key锁 的时候,为锁设置过期时间,每个人进去需要干多长时间,设置多久这个因人而异,但是都要设置这样
一个key的过期时间,保证锁最终会被释放;
这时有人肯定会说, 如果张三自己设置的时间,自己在里面超时也没做完自己的工作 锁自动过期了 怎么办;
为了严谨,张三在里面做事的时候 可以一直读秒,并且所有操作由redis 的事务保证 数据的一致性;
###########################################################################################
用Redis模拟Session
session 是 服务器 会话技术,是在服务器中 保存 会话 中的 临时数据 并给 客户端发一个小 cookie 是 键为JSESSIONID 以便区分 谁 是 谁;
分布式项目中,各个服务器 如何共享 session 数据,
可以通过 Redis 做 存储供大家来调用 session 数据;
###########################################################################################
MySQL 集群
表 中的 主键 往往 设置 int 类型 或者 bigint 类型 做主键自增 => 保证主键唯一性;
MySQL 集群中 新增 数据 它MySQL自己 保证 主键自增 是很难沟通协调的;
对应这种 新增数据 保证 主键唯一性 的情况;
可以利用Redis 单线程 的 特点,每次新增数据 主键 是多少 从 Redis 数据库 里面取, 取一个,Redis里面的值 自增1,
则保证 主键 的唯一性;
对于这种情景,Twitter 公司 开源了 一种 称为 雪花算法 SnowFlake 的算法技术,
寓意 雪花 从天空中落下,每一片雪花是相似的,但是没有一片雪花是相同的,
雪花算法就是这样可以 生成 存数字, 有序 不连续 的 数据,来作为 主键使用;