优化
SQL优化,JVM、DB,Tomcat参数调优>硬件性能优化(内存升级、CPU核心数增加、机械硬盘->固态硬盘等等)>业务逻辑优化/缓存 > 读写分离、集群等>分库分表
动态缓存热点数据
zset:通过数据最新访问时间来做排名,并过滤掉不常访问的数据,只留下经常访问的数据
怎么实现延迟队列 / 订单超时取消?
在 Redis 可以使用有序集合(ZSet),Score 属性可以用来存储延迟执行的时间
使用 zadd score1 value1 命令就可以一直往内存中生产消息。再利用 zrangebysocre 查询符合条件的所有待处理的任务, 通过循环执行队列任务即可
Redis分布式锁
误删别人的锁?
将锁变量的值设置为客户端的唯一标识(比如线程id)
超时释放了怎么办?
我们可以基于续约的方式设置超时时间:先给锁设置一个超时时间,然后启动一个守护线程,让守护线程在一段时间后,重新设置这个锁的超时时间。实现方式就是:写一个守护线程,然后去判断锁的情况,当锁快失效的时候,再次进行续约加锁,当主线程执行完成后,销毁续约锁即可,不过这种方式实现起来相对复杂
主从模式下锁重复获取
如果在 Redis 主节点获取到锁后,在没有同步到其他节点时,Redis 主节点宕机了,此时新的 Redis 主节点依然可以获取锁,所以多个应用服务就可以同时获取到锁。
分布式锁算法 Redlock(红锁):它是基于多个 Redis 节点 的分布式锁,让客户端和多个独立的 Redis 节点依次请求申请加锁,如果客户端能够和 半数以上 的节点成功地完成加锁操作,那么我们就认为,客户端成功地获得分布式锁,否则加锁失败。即使有节点发生了故障,锁变量仍然是存在的,客户端还是可以完成锁操作。