Redis实现高可用集群策略和“假死”侦测
redis主从复制+哨兵机制(监控、提醒、自动故障迁移)+keepalived(自动重启),若重启多次仍不成功,可以通过邮件短信等方式通知。
redis长时间失去响应
按理说控制台应该输出1~50,但每次都是输出到8,控制台就停止输出程序没有停止也没有报任何错误,一开始以为redis挂了,但是对redis控制台输入命令一直都有响应,又想是不是redis执行lua脚本阻塞了,但是redis是单线程的,如果阻塞,redis控制台对我的命令是没有响应的.浪费半小时有终于找到原因,是我打开的redis资源没有关闭。
Redis 连接池在多线程环境下,不能正常释放解决方案。
当线程池在未初始化的时候,由于多线程同时执行redis连接池初始化工作引起的问题。
当10个线程同时请求redis连接资源时,10个线程都发现连接池为空(因为创建连接池相比创建线程比较耗时),这时10个线程都各自初始化成功一个连接池,并从中取得redis连接,并执行了redis操作。执行完毕,returnResource的时候,由于此时pool变量的引用是最后一个线程初始化的连接池,前面9个线程获得的redis连接并不属于最后一个连接池的资源,所以抛错:IllegalStateException: Invalidated object not currently part of this pool。
由于创建线程池,连接池等工作都是相对比较耗时的,所以我们一般放在应用启动的时候就初始化,把连接池的初始化工作交给Spring容器管理,同时把初始化连接池和获取连接两个操作实现方法分离,对初始化连接池的方法加上同步锁机制,并且二次判断是否为空,就算多线程情况下,在二次判断是否为空的时候,pool已经不为空了,直接返回。现在多线程安全的问题就得以解决。
优化前和优化后比较: