高并发常见场景
商品抢购秒杀等活动
解决方式
使用Redis 列表结构实现队列数据结构,抢成功的使用 rpush 入队,再使用 lpop 出队。
Redis高并发可能产生的问题
redis宕机了,或者链接不上
解决方法:
配置主从复制,配置哨兵模式,一旦发现主机宕机,让下一个从机当做主机。
最坏的情况,只能关闭Redis连接,去往数据库连接。但由于数据量大,这样SQL数据库也会宕掉的。
如果redis缓存在高峰期到期失效,在这个时刻请求会向雪崩一样,直接访问数据库如何处理?
设置条件查询判断,判断redis缓存里是否有数据,如果没有,则去往数据库连接。当然要加分布式锁,利用redis的单线程+多路IO复用技术,原子性原理,让其它的线程请求等待,假若第一个线程进去获取到分布式锁在查询数据的途中宕掉了,不能让其它线程一直等待,设置等待一定时间判断是否取回数据,如果没有,递归调用自己的方法让第二个线程继续拿分布式锁查询数据库。当第二个锁从数据库拿到数据时,把数据值设置到redis数据库缓存中,设置失效时间,避免占内存,方便使用提高效率。
如果用户不停地查询一条不存在的数据,缓存没有,数据库也没有,那么会出现什么
如果数据不存在,缓存中没有,数据库也没有,当然如果不设置判断,会一直调用数据库,使数据库效率降低,访问量大时甚至会宕机。
解决方案:从数据库查询,如果数据库没有,则返回值为Null,判断数据库返回的值,如果为Null,则自定义把标识的字段存到Redis中,用key,value的方法,setex key empty,设置失效时间跟具体情况而定,然后调用get key ,判断是否获取的值"empty" ,如果相等,则抛出自定义异常,给用户提示,或者直接return null。这样用户再次查询的时候由于先从reids缓存中查询,redis会有对应的Key获取之前设置的value值,这样就不会再次调用数据库,影响效率等问题。
参考资料
网站大规模并发处理方案:电商秒杀与抢购 这篇写的很好
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Redis解决高并发问题 - Python技术站