Redis 高并发解决方案

 

针对大流量瞬间冲击,比如秒杀场景

redis前面可以加一层限流 sentinel / Hystrix

 

redis高并发(读多写少)下缓存数据库双写误差:

1. 修改操作使用分布式锁(就是修改的时候加锁,一次只能有一个线程修改,可以多线程读),对于读多的场景更有利;推荐(以较少的性能代价换取了绝对的一致)

2. 延迟删除缓存

    修改一个key后,删除缓存,为了防止之前有线程读过旧数据然后再次写入,sleep 10毫秒再删除一次,但此步要后台处理,不然可能会大幅降低整体性能。

3. 写直接写入数据库,通过canal等中间件订阅binlog,然后将变化应用到缓存,缓存只提供读操作; 可能存在读延迟

 

 

多读写也多

1. 使用消息中间件,不推荐使用redis缓存

2. 直接使用数据库都比再加个缓存快,尤其那些高速写入又马上查询,甚至还会统计分析的业务。

 

Redis缓存的超时时间

    要把这个因素的考虑,贯穿到所有场景。要根据自己的业务场景来设定超时时间

    被动删除:过期的key不会立即删除,会在下次被get时删除。

    主动删除:定期主动删除过期key

 

 

不推荐方案-一个大redis集群后面多个数据库

    这相当于让并发集中在redis那里了,不仅没有提升性能,还降低了性能

    要让redis集群与数据库集群一一对应,拆分开来

    如果这样都行,那么直连数据库也没啥问题; 那问题来了,为啥还要浪费一堆资源弄个redis集群呢?

 

 

Redis连接池配置

    对于高并发场景,配置maxTotal = maxIdle,即减少了连接创建与销毁的资源; 非高并发的场景不要这么配,因为连接的存在也是耗费资源的。

    连接池预热。Redis的连接是用时才生成,如果你知道某个时间点(定点秒杀,一天都没有啥请求,就等那个时间点)会瞬间生成大量连接,可以使用使用jedis.ping()提前生成一些连接。

 

posted @ 2020-11-13 21:09  方诚  阅读(2960)  评论(0编辑  收藏  举报