Spring boot 鏈接Redis實現HMSET操做

這篇文章記錄使用spring-boot-starter-redis訪問Redis。Redis相關的的配置文件放在Resources目錄下的application.yml文件中,以下所示:html

spring:
  profiles: dev,default,test
  redis:
    database: 1
    host: 192.168.107.253 #redis test server
    port: 6379

首先在pom.xml中添加依賴:java

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.3.2.RELEASE</version>
        </dependency>

RedisTemplate配置

Spring boot默認可以使用 @Autowired 注入RedisTemplate<String, String>,可是個人需求是使用HMSET來操做Redis,訪問Redis的模板類型爲:RedisTemplate<String, Map<String, String>>,所以使用一個配置類進行配置。redis

建立JedisConnectionFactory

默認狀況下,Spring boot就會爲Redis注入默認值,以下圖所示:spring

因爲實際部署的Redis的主機、端口、數據庫ID在application.yml配置文件中,所以使用 @Value 注入相應的值,shell

@Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.database}")
    private int databaseId;

而後在Jedis鏈接工廠時,主機、端口、數據庫ID set進去便可。數據庫

@Bean
    public JedisConnectionFactory jedisConnectionFactory() {
	JedisConnectionFactory factory = new JedisConnectionFactory();
	factory.setUsePool(true);
	JedisPoolConfig config = getRedisConfig();
	factory.setPoolConfig(config);
	factory.setHostName(host);
	factory.setPort(port);
	factory.setDatabase(databaseId);
	logger.info("host:{}, port:{}, database:{}", factory.getHostName(),factory.getPort(), factory.getDatabase());
	return factory;
    }

RedisTemplate建立須要傳入JedisConnectionFactory,而後設置對象的序列化格式,若是未正確設置序列化格式,可能會致使寫入的數據亂碼app

配置類使用 @Configuration 標識,整個類完整代碼以下:spring-boot

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;

import java.util.Map;

/**
 * Created by Administrator on 2018/4/9.
 */

@Configuration
public class LoginMacRedisConfig {

    private static final Logger logger = LoggerFactory.getLogger(LoginMacRedisConfig.class);

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.database}")
    private int databaseId;

    @Bean
    @ConfigurationProperties(prefix = "spring.redis")
    public JedisPoolConfig getRedisConfig() {
	JedisPoolConfig config = new JedisPoolConfig();
	return config;
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
	JedisConnectionFactory factory = new JedisConnectionFactory();
	factory.setUsePool(true);
	JedisPoolConfig config = getRedisConfig();
	factory.setPoolConfig(config);
	factory.setHostName(host);
	factory.setPort(port);
	factory.setDatabase(databaseId);
	logger.info("host:{}, port:{}, database:{}", factory.getHostName(),factory.getPort(), factory.getDatabase());
	return factory;
    }

    @Bean
    public RedisTemplate<String, Map<String, String>> redisTemplate() {
	final RedisTemplate<String, Map<String, String>> template = new RedisTemplate<>();
	template.setConnectionFactory(jedisConnectionFactory());

	StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
	template.setKeySerializer(stringRedisSerializer);
	template.setHashKeySerializer(stringRedisSerializer);
	template.setHashValueSerializer(stringRedisSerializer);
	return template;
    }
}

這樣,咱們就能夠在其餘類( @Service )中使用 @Autowired 注入RedisTemplate<String, Map<String, String>>了。這篇文章討論瞭如何注入各類泛型的RedisTemplate。ui

@Autowired
    private RedisTemplate<String, Map<String, String>> hmsetTemplate;

有個時候,咱們須要在一個Spring Boot Application中使用多個RedisTemplate,可參考:[How to create a second RedisTemplate instance in a Spring Boot applicationspa

RedisTemplate HMSET操做

HMSET key field value [field value ...]

HMSET接受一個key,而後能夠存儲多個 field value。

Map<String, String> results = new HashMap<>();
	    results.put("mac_addr", mac);
	    results.put("cli_verstr", cli_verstr);
	    hmsetTemplate.opsForHash().putAll(uid, results);

具體完整代碼之後再補充。

寫入Redis成功後,鏈接redis查看最終結果:

redis-cli -h 192.168.107.253 -p 6379
redis 192.168.107.253:6379[1]> KEYS *
1) "1097672"
2) "1210073"
3) "162284"
redis 192.168.107.253:6379[1]> HGET 1097672 mac_addr
"7893f695112c465"
redis 192.168.107.253:6379[1]> HGET 1097672623 cli_verstr
"2.8"
相關文章
相關標籤/搜索