1. 利⽤消息中间件和缓存实现简单的秒杀系统
a. Redis是⼀个分布式缓存系统,⽀持多种数据结构,我们可以利⽤Redis轻松实现⼀个强⼤的秒杀系统。
b. 我们可以采⽤Redis 最简单的key-value数据结构,⽤⼀个原⼦类型的变量值(AtomicInteger)作为key,把⽤户id作 为value,库存数量便是原⼦变量的最⼤值。对于每个⽤户的秒杀,我们使⽤ RPUSH key value插⼊秒杀请求, 当插⼊的秒杀请求数达到上限时,停⽌所有后续插⼊。
c. 然后我们可以在台启动多个⼯作线程,使⽤ LPOP key 读取秒杀成功者的⽤户id,然后再操作数据库做最终的下订单减库存操作。
d. 当然,上⾯Redis也可以替换成消息中间件如ActiveMQ、RabbitMQ等,也可以将缓存和消息中间件 组合起来,缓存系统负责接收记录⽤户请求,消息中间件负责将缓存中的请求同步到数据库。
2. 如何实现双11购物限流:
1、限流策略:
- Nginx接⼊层限流:按照⼀定的规则如帐号、IP、系统调⽤逻辑等在Nginx层⾯做限流
业务应⽤系统限流,通过业务代码控制流量这个流量可以被称为信号量,可以理解成是⼀种锁,它可以限制⼀项资源最多能同时被多少进程访问。
2、lua脚本:
减少⽹络开销: 不使⽤ Lua 的代码需要向 Redis 发送多次请求, ⽽脚本只需⼀次即可, 减少⽹络传输;
原⼦操作: Redis 将整个脚本作为⼀个原⼦执⾏, ⽆需担⼼并发, 也就⽆需事务; 复⽤: 脚本会永久保存 Redis 中, 其他客户端可继续使⽤.
3、ip限流lua脚本:
3. 要缓存⽹站登录的⽤户信息,你有⼏种⽅式?
a. redis和memcached
b. Ehcache
c. ConcurrentHashMap