Java使用Lettuce调用Redis Stream XADD时如何自定义Entry ID
Java Redis Stream自定义Entry ID实现方案
你当前使用的Jedis客户端已原生支持自定义Entry ID,只需调用xadd的重载方法即可,无需额外改造逻辑。
核心修改点
原代码调用的是默认自动生成ID的xadd重载,替换为带ID参数的重载即可,修改后完整代码如下:
public void onTick(Instrument instrument, ITick tick) throws JFException { String _streamName = instrument.name() + ":tick"; long _tickDate = tick.getTime(); String _sTickDate = Long.toString(_tickDate); double _ask = tick.getAsk(); double _bid = tick.getBid(); Map<String, String> _messageBody = new HashMap<>(); _messageBody.put( "ask", Double.toString(_ask) ); _messageBody.put( "bid", Double.toString(_bid) ); console.getOut().println("Sending to " + _streamName + " -> " + tick); // 新增自定义Entry ID逻辑,格式为「时间戳-序列号」,同毫秒下序列号从0递增 String customEntryId = _tickDate + "-0"; this.sync.xadd(_streamName, customEntryId, _messageBody); }
注意事项
- Redis Stream的Entry ID标准格式为
{毫秒时间戳}-{序列号},如果同一毫秒内只会产生1条tick数据,后缀固定为-0即可;如果同毫秒有多条数据,需要将序列号按顺序递增,避免ID重复导致写入失败。 - 默认情况下Redis要求新写入的Entry ID必须大于当前Stream中已存在的最大ID,否则会返回错误。行情tick数据本身按时间递增生成,正常业务场景下不会触发该限制。
内容的提问来源于stack exchange,提问作者Marcello Chiuminatto
相关产品推荐
相关产品推荐

