redis计数器应用场景
常用数据类型11111
与memcache对比
PHP
课程介绍
> 认识Redis的本质:设计目标,应用场景
>理解Redis的工作模式
>认识Redis计数器
>如何用Redis计数器实现并发场景下的数量控制
课程总结
Redis 的本质
Redis 的工作模式
用 Redis:实现计数器
用 Redis 计数器实现并发场景下的数量控制
数量控制器 v2
数量控制器 v1
并发场景:客户端 A、B 同时访问数量控制器
问题 1:
A 先执行 incrby,然后 B 执行 set,数据不一致
问题 2:
假定限量 100,A、B 同时读到当前数量为 99,A、B 执行完 incrby 后,总量为 101,超限了
Redis 计数器
频率控制:接口防刷,密码尝试次数限制。
数量统计:请求量统计。
数量控制:商品抢购,奖励额度控制。
Redis 常用数据类型
STRING 字符串。整数型字符串
HASH 哈希。PHP 关联数组,Python 字典
LIST 列表。Python 元组
SET 集合。集合中的元素唯一
ZSET 有序集合。元素有分值,用于排序
Redis 的数据类型如此丰富,如果仅仅当作缓存来用,确实是“杀鸡焉用牛刀”。Memcache 更合适。
Redis 优缺点
优点:无需处理并发问题,降低系统复杂度
缺点:不适合缓存大尺寸对象(超过 100KB)(为什么?)
Redis 的工作模式
单进程 单进程 单进程(重要的事情说三遍!!!)
阻塞式
Redis 在同一时刻只能处理一个请求,后来的请求需要排队等待!
Redis 与 Memcache 对比
Memcache 是内存对象缓存系统,设计目标为通过缓解数据库的压力来加快 web 应用的响应速度
Redis 应用场景更丰富,Memcache 仅适合作为缓存使用
Redis 是什么
缓存
数据库
消息代理
课程介绍
认识 Redis 的本质:设计目标,应用场景
理解 Redis 的工作模式
认识 Redis 计数器
如何用 Redis 计数器实现并发场景下的数量控制
并发场景下数量控制
v1
function v1() {
$amountLimit = 100;
// ...
}
PHP function
Linux Redis PHP Nginx
setnx = set not exists
先计算,后判断
并发请求,导致数据不一致问题
set 可能会出现覆盖
先判断,后计算,计算错误
流程图 抽奖
微信抢红包,金额随机分配逻辑
数量控制
商品抢购
抽奖
抢红包
超时时间 30s
```sh
127.0.0.1:6379> expire test2 30
(integer) 1
127.0.0.1:6379> ttl test2
(integer) 23
127.0.0.1:6379> ttl test2
(integer) 21
127.0.0.1:6379> ttl test2
(integer) 17
127.0.0.1:6379> ttl test2
(integer) 14
127.0.0.1:6379> ttl test2
(integer) 12
127.0.0.1:6379> ttl test2
(integer) 8
127.0.0.1:6379> ttl test2
(integer) 6
127.0.0.1:6379> ttl test2
(integer) 3
127.0.0.1:6379> ttl test2
(integer) -2
127.0.0.1:6379> ttl test2
(integer) -2
127.0.0.1:6379> exists test2
(integer) 0
127.0.0.1:6379>
```
setnx 判断是否存在,不存在才会set,防止错误的覆盖
```sh
127.0.0.1:6379> get test
"6"
127.0.0.1:6379> setnx test 2020
(integer) 0
127.0.0.1:6379> setnx test2 2020
(integer) 1
127.0.0.1:6379> get test
"6"
127.0.0.1:6379> get test2
"2020"
127.0.0.1:6379>
127.0.0.1:6379> set test2 77
OK
127.0.0.1:6379> get test2
"77"
```
```sh
➜ ~ redis-cli
127.0.0.1:6379> exists test
(integer) 0
127.0.0.1:6379> set test 3
OK
127.0.0.1:6379> get test
"3"
127.0.0.1:6379> incr test
(integer) 4
127.0.0.1:6379> get test
"4"
(integer) 3
127.0.0.1:6379> incrby test 3
(integer) 7
127.0.0.1:6379> get test
"7"
127.0.0.1:6379> incrby test -1
(integer) 6
127.0.0.1:6379> get test
"6"
127.0.0.1:6379>
```
redis 应用场景
频率限制, 计数器 key ip value time
数量控制
数量统计
Memcache
redis 数据类型 string hash list set zset 有序集合
Redis big key
对象大小 小于100KB
list 元素个数小于 10 万个
为什么redis 不适合存储大key对象
缓存 数据库 消息队列