【业务场景】:10 万用户在同 1 秒种进行抢红包的操作,红包只有 10 个
【回答1】:
对于这种大并发抽奖, 注意 3 点
1. redis incr 使用原子计数可以解决, 并发情况下不会超发
2. 用户锁, 解决同一用户同时多次秒杀, 除非你不在乎一个用户中了多次奖品
3. 防人机, 简单的方案是图形码 或者是 CSRF 都可以
注意一下流控, 不要让大流量冲垮你的系统, 宁愿让用户看到系统忙, 也不要让用户看到 500
【回答2】:
因为 Redis 支持原子操作,所以可以使用 Redis 做。
另外,一般的配置, Redis 并发几万的请求一点问题也没有。
【回答3】:
1. 用 Redis 的 queue ,开奖前 enqueue 10 个元素进去,开奖后 dequeue ;
2. 用 Redis 的 setNx ,预定义 10 个 key ,能 setNx 成功表示得奖了
【参考文档】:
redis incr: http://redisdoc.com/string/incr.html
redis setnx:http://redisdoc.com/string/setnx.html
【相关实现】:
PHP:https://github.com/zhaocong6/lock
GO:https://github.com/go-redsync/redsync https://github.com/go-locks/distlock
1、容器是独立运行的一个或一组应用,及他们的运行环境。容器是Docker中的一个重要的概念。
2、docker容器的启动有三种方式
a.交互方式,基于镜像新建容器并启动
例如我们可以启动一个容器,打印出当前的日历表
[root@rocketmq-nameserver4 ~]# docker run my/python:v1 cal ##my/python:v1为镜像名和标签
我们还可以通过指定参数,启动一个bash交互终端。
[root@rocketmq-nameserver4 ~]# docker run -it my/python:v1 /bin/bash
参数-t
让Docker分配一个伪终端并绑定在容器的标准输入上,-i
让容器的标准输入保持打开。
使用docker run
命令来启动容器,docker在后台运行的标准操作包括
1.检查本地是否存在指定的镜像,不存在则从公有仓库下载
2.使用镜像创建并启动容器
3.分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
4.从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去
5.从地址池分配一个ip地址给容器
6.执行用户指定的应用程序
7.执行完毕之后容器被终止
映射本地文件夹到容器
docker run -it -v /c/Work/sm2:/home/sm2 lizarel/phpstudy:php71 /bin/bash
b、短暂方式,直接将一个已经终止的容器启动运行起来
可以使用docker start命令,直接将一个已经终止的容器启动运行起来。
[root@rocketmq-nameserver4 ~]# docker run my/python:v1 /bin/echo hello test
hello test
命令执行完,控制台会打印"hello test",container就终止了,不过并没有消失,
可以用docker ps -n 5
看一下最新前5个的container,第一个就是刚刚执行过的container,可以再次执行一遍:docker start container_id
不过这次控制台看不到”hello tes
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz
tar zxvf openssl-1.1.1c.tar.gz
cd openssl-1.1.1c
./config shared zlib --prefix=/usr/local/ssl
一定记得加上shared选项,不然重新编译php的openssl扩展的时候,OpenSSL Library Version和OpenSSL Header Version会不一致。用--prefix
指定安装路径
make && make install
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
# ① 用find / -name openssl查询一下(如果PHP采用了--with-openssl=/usr/local/openssl选项来编译,一般和这个选项的值相同),所以也有可能是这个路径
# mv /usr/local/openssl /usr/local/openssl.bak
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
# 用find / -name openssl查询一下,也有可能是这个路径(同① )
# ln -s /usr/local/ssl/include/openssl /usr/local/openssl
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig
openssl version
cd /root/lnmp/src/php-7.2.20/ext/openssl
c