lock

lock

分布式锁

起因 之前遇到一些场景,使用了分布式锁,目前来做一个总结 redis 1. 单点redis 单点redis场景,主要容易存在单点故障。(分布式高可用的手段:1.单点故障转移 2.数据冗余) // 获取锁 SET key value NX PX xmilliseconds // 删除锁 if redis.call("get", KEYS[1]) == ARGS[1] then return redis.call("del", KEYS[1]) else return 0 end 设置key值,需要设置一下随机value,避免锁被其他竞争者删除 设置过期时间,避免客户端崩溃之后,

By chainhelen

数据库

数据库并发锁

问题 之前让同事修改需求,实现商品列表页上的每个购物车图标按钮,点击能够局部刷新用户的购物车 购物车数据库是这样设计的,每条数据主要跟用户id、商家id、商品id有关;另外还有一个字段是count,也就是说用户对某个商品的购物车数据就是该count 1. 如果查到三条信息一致的记录,那么就update原来的那条记录 count + 1 2. 如果没有查到这样的记录,那么insert一条 count = 1 的数据 问题就是这个insert;不然只有update的话,按照原来我写的文章 mysql数据一致性闲谈,搞一个悲观锁就ok了 问题场景 当一个新的用户,连续两次快速点击同一个商品的购物车按钮(前端没有做同步,允许并发),后台的ssh结构会导致两个线程都进入了上述情况2中 简化问题 因为我对java不是很熟,我们来把原有问题简化成如下问题 import java.util.*; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLo

By chainhelen

golang

mysql数据一致性闲谈

外部连接 首先让mysql在远程服务器上,现在希望它能被外部ip访问 在/etc/my.cnf里面,找到bind-address修改为0.0.0.0, //重启mysql service mysql restart //查看mysql服务 netstat -anp | grep mysqld 看到如下监听端口已经是0.0.0.0 但是发现外部ip还是访问不了远程的mysql 现在远程服务器上用mysql-client连上 //root 是用户名 mysql -u root -p //mysql本身的数据库 use mysql //创建 create user 'mysqlremoteusername'@'0.0.0.0' identified

By chainhelen