前言 项目中需要监听redis的一些事件比如键删除,修改,过期等。过期事件网上有很多例子可以参考,但修改或删除事件却很少。因为redis支持发布订阅所以其他的事件类型应该也是能实现的,通过过期事件监听结合上文键空间通知,我整理了相关代码,希望帮助需要的人快速解决问题。 代码实践 网上示例的失效事件监听代码 import com.alibaba.fastjson.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframewor.... Redis监听新增、修改、删除、过期事件 redis
最近一个粉丝朋友在面试时被面试官一个问题问懵了,看你简历上写着你深入研读过RocketMQ的源码,那请问一下:RocketMQ一个消费组内订阅同一个主题不同的TAG为什么会丢消息。 RocketMQ支持tag级别的消息过滤机制,其具体实现原理主要从存储、拉取模型两个部分进行展开。 MQ底层数据结构设计之巧妙 RocketMQ专门按照Topic为每一个topic建立索引,方便消费端按照topic进行消费,其具体实现为消息队列。 在RocketMQ中,ConsumeQueue的引入并不是为了提高消息写入的性能,而是为消费服务的。 消息消费队列中的每一个条目是一个定长的,设计极具技巧性,其每个条目使用固定长度(8字节commitlog物理偏移量、4字节消息长度、8字节tag hashcode),这里不是存储tag的原始字符串,而是存储hashcode。 目的就是确保每个条目的长度固定,可以使用访问类似数组下标的方式来快速定位条目,极大的提高了ConsumeQueue文件的读取性能,这样根据消费进度去访问消息的方法为使用逻辑偏移量logicOffset * 20即可找到该条目的起始偏移量.... RocketMQ一个消费组内订阅同一个主题不同的TAG为什么会丢消息 java
在MyBatis 的映射配置文件中,动态传递参数有两种方式: (1)#{} 占位符 (2)${} 拼接符 #{} 和 ${} 的区别 (1) 1)#{} 为参数占位符 ?,即sql 预编译 2)${} 为字符串替换,即 sql 拼接 (2) 1)#{}:动态解析 -> 预编译 -> 执行 2)${}:动态解析 -> 编译 -> 执行 (3) 1)#{} 的变量替换是在DBMS 中 2)${} 的变量替换是在 DBMS 外 (4) 1)变量替换后,#{} 对应的变量自动加上单引号 '' 2)变量替换后,${} 对应的变量不会加上单引号 '' (5) 1)#{} 能防止sql 注入 2)${} 不能防止sql 注入 #{} 和 ${} 的实例:假设传入参数为 1 (1)开始 1)#{}:select * from t_user where uid=#{uid} 2)${}:select * from t_user where uid= '${uid}' (2)然后 #{}:select * from t_u.... 有更新! mybatis中的#{}和${} sql