跳到主要内容

数据写入

通过 dbVisitor 执行 Redis 写入命令。SETDEL 返回更新数,但 INCR 等修改命令返回查询结果,需要按返回形式选择 API。读取已保存的数据见查询操作

写入和删除键

JdbcTemplate jdbc = new JdbcTemplate(dataSource);
jdbc.executeUpdate("SET ? ?", new Object[] { "user:1001:name", "mali" });
jdbc.executeUpdate("DEL ?", "user:1001:name");

SET 覆盖原值,DEL 删除键;这两条命令通过 executeUpdate 返回更新数。写入 Hash 字段使用 HSET

jdbc.executeUpdate("HSET ? ? ?", new Object[] { "user:1001", "name", "mali" });

HGETALL 的读取及映射见查询操作

通过 Mapper 写入

@SimpleMapper
public interface NameWriteMapper {
@Insert("SET #{key} #{name}")
int save(@Param("key") String key, @Param("name") String name);

@Delete("DEL #{key}")
int remove(@Param("key") String key);
}
Session session = new Configuration().newSession(dataSource);
NameWriteMapper mapper = session.createMapper(NameWriteMapper.class);
mapper.save("user:1001:name", "mali");

BaseMapper 执行文件写入

BaseMapper 的文件语句执行方法可调用上面的 saveremove 命令。它不会根据实体生成 Redis 写入命令;命令仍须在 Mapper 文件中明确配置。

读取写入返回值

INCR 会修改值,但返回的是新数值,应使用查询方法获取:

Long value = jdbc.queryForLong("INCR ?", "order:sequence");

在 Mapper 中,这条命令使用 @Query,而不是 @Update。选择 API 要看适配器的返回形式,不能只看命令是否修改数据。ZADD、LPOP 也有类似情况,见命令语法

Session 与 API 混用

方法注解、Mapper 文件和 session.jdbc() 可以读写同一组 Redis 键。多个 Session 连接同一个 Redis 数据库时,也能读取对方已写入的值:

Configuration configuration = new Configuration();
try (Session writer = configuration.newSession(dataSource);
Session reader = configuration.newSession(dataSource)) {
writer.createMapper(NameWriteMapper.class).save("user:1001:name", "mali");
String name = reader.jdbc().queryForString("GET ?", "user:1001:name");
}

这里仍执行明确的 Redis 命令。session.lambda() 和 BaseMapper 按实体自动生成 CRUD 的方式不适用;BaseMapper 可用的文件命令执行方式不受此限制。

覆盖与异常

错误命令会报告异常,但 SET 已存在的键会覆盖原值,不会报告“重复主键”。读取不存在的键也不是异常,见查询异常

多键写入与事务

多键写入可用 MSET,它是一条 Redis 命令,不是 JDBC batch。多次 SET 调用不会自动构成事务,事务相关行为见事务支持