Привет, мне нужно сделать несколько вставок формы
SADD ключевое значение
У меня есть пара "ключ-значение", и мне нужно знать, как выполнять массовые вставки с помощью JAVA. Я написал файл в протоколе Redis. Как действовать дальше
Привет, мне нужно сделать несколько вставок формы
SADD ключевое значение
У меня есть пара "ключ-значение", и мне нужно знать, как выполнять массовые вставки с помощью JAVA. Я написал файл в протоколе Redis. Как действовать дальше
Если у вас есть входные данные, записанные в формат протокола Redis, почему бы просто не использовать режим конвейера redis-cli или nc? Это объясняется в http://redis.io/topics/mass-insert.
Если у вас есть массовые (ключ, значение) входы, вы можете использовать Jedis для выполнения sadd с конвейерной обработкой, чтобы получить более высокую производительность.
В приведенном ниже примере предполагается, что iter (Iterator) имеет элементы, каждый элемент является формой значения ключа "\ t".
try (Jedis jedis = new Jedis(host, port)) {
Pipeline pipeline = jedis.pipelined();
while (iter.hasNext()) {
String[] keyValue = iter.next().split("\t");
pipeline.sadd(keyValue[0], keyValue[1]);
// you can call pipeline.sync() and start new pipeline here if you think there're so much operations in one pipeline
}
pipeline.sync();
}
Если вы выполняете фактические операции чтения / записи через Spring CacheManager с RedisTemplate, настроенным на использование Redis в качестве кеша, вы также можете использовать executePipelined метод RedisTemplate, который принимает обратный вызов в качестве аргумента. Обратный вызов должен определять метод doInRedis, который выполняет ту работу (операции чтения / записи) в Redis, которую вы хотите выполнять в пакете.
Следующий код показывает вставку списка объектов, заключенных в интерфейс CacheableObject, который имеет getKey () и getValue (), путем вызова redisTemplate.opsForHash (). Put ().
@Component
public class RedisClient {
@Autowired
RedisTemplate redisTemplate;
//batch-insert using Redis pipeline, a list of objects into the cache specified by cacheName
public void put(String cacheName, List<CacheableObject> objects) {
try {
this.redisTemplate.executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
for(CacheableObject object: objects) {
redisTemplate.opsForHash().put(cacheName, object.getKey(), object.getValue());
}
return null;
}
});
}
catch(Exception e) {
log.error("Error inserting objects into Redis cache: {}", e.getMessage());
}
}
Сам RedisTemplate настраивается с использованием класса конфигурации, например следующего:
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport implements
CachingConfigurer {
@Value("${redis.hostname}")
private String redisHost;
@Value("${redis.port}")
private int redisPort;
@Value("${redis.timeout.secs:1}")
private int redisTimeoutInSecs;
@Value("${redis.socket.timeout.secs:1}")
private int redisSocketTimeoutInSecs;
@Value("${redis.ttl.hours:1}")
private int redisDataTTL;
@Bean
JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisHost, redisPort);
return new JedisConnectionFactory(redisStandaloneConfiguration);
}
@Bean
public RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
return redisTemplate;
}
@Bean
public RedisCacheManager redisCacheManager (JedisConnectionFactory jedisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues()
.entryTtl(Duration.ofHours(redisDataTTL)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.java()));
redisCacheConfiguration.usePrefix();
RedisCacheManager redisCacheManager =
RedisCacheManager.RedisCacheManagerBuilder.
fromConnectionFactory(jedisConnectionFactory)
.cacheDefaults(redisCacheConfiguration).build();
redisCacheManager.setTransactionAware(true);
return redisCacheManager;
}
@Bean
public JedisPoolConfig poolConfig() {
final JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setTestOnBorrow(true);
jedisPoolConfig.setMaxTotal(100);
jedisPoolConfig.setMaxIdle(100);
jedisPoolConfig.setMinIdle(10);
jedisPoolConfig.setTestOnReturn(true);
jedisPoolConfig.setTestWhileIdle(true);
return jedisPoolConfig;
}
@Override
public CacheErrorHandler errorHandler() {
return new RedisCacheErrorHandler();
}
}