1,redis与数据库一致性问题
原来的项目代码中,redis和数据库对数据的修改是独立的,这可能导致当数据库删除了某项数据之后,redis由于网络波动服务器等问题刚好错过了这一次的小操作,导致原本应该不存在的数据仍然保留在redis中,出现脏数据的问题。
我通过自定义retryupdateredis的方法,将redis处理增删作为函数传进去,在redis进行增删时回调这个方法,重试最多三次,确保redis和数据库的操作能够同步
2,对mq的消息确认机制进行了优化
原先项目中mq并不存在消息确认机制,因此为默认自动确认,但是这会导致在某次消息处理失败后,原有的消息直接被mq识别为确认而丢失
因此我通过设置手动确认的机制,
以@Header传入springAMQP自动识别的请求头delivertag作为idi,对当前id的消息进行手动确认,用trycatch包裹消息处理成功的逻辑,成功是try channel接口下的basicack方法,最多重试三次进行消息手动确认,消息处理失败时走catch逻辑,进行三次重试的channel.basicNack()消息拒绝方法,通过消息拒绝把这条消息送回消息队列避免消息的丢失。