1. 程式人生 > >Spring Boot教程(三十四)使用Redis數據庫(2)

Spring Boot教程(三十四)使用Redis數據庫(2)

分享圖片 target object docs int cpp eas 序列 lean

除了String類型,實戰中我們還經常會在Redis中存儲對象,這時候我們就會想是否可以使用類似RedisTemplate<String, User>來初始化並進行操作。但是Spring Boot並不支持直接使用,需要我們自己實現RedisSerializer<T>接口來對傳入對象進行序列化和反序列化,下面我們通過一個實例來完成對象的讀寫操作。

  • 創建要存儲的對象:User
    public class User implements Serializable {
    
        private static final long serialVersionUID = -1L;
    
        private String username;
        private Integer age;
    
        public User(String username, Integer age) {
            this.username = username;
            this.age = age;
        }
    
        // 省略getter和setter
    
    }
    

      

  • 實現對象的序列化接口
    public class RedisObjectSerializer implements RedisSerializer<Object> {
    
      private Converter<Object, byte[]> serializer = new SerializingConverter();
      private Converter<byte[], Object> deserializer = new DeserializingConverter();
    
      static final byte[] EMPTY_ARRAY = new byte[0];
    
      public Object deserialize(byte[] bytes) {
        if (isEmpty(bytes)) {
          return null;
        }
    
        try {
          return deserializer.convert(bytes);
        } catch (Exception ex) {
          throw new SerializationException("Cannot deserialize", ex);
        }
      }
    
      public byte[] serialize(Object object) {
        if (object == null) {
          return EMPTY_ARRAY;
        }
    
        try {
          return serializer.convert(object);
        } catch (Exception ex) {
          return EMPTY_ARRAY;
        }
      }
    
      private boolean isEmpty(byte[] data) {
        return (data == null || data.length == 0);
      }
    }
     
    

      

  • 配置針對User的RedisTemplate實例
    @Configuration
    public class RedisConfig {
    
        @Bean
        JedisConnectionFactory jedisConnectionFactory() {
            return new JedisConnectionFactory();
        }
    
        @Bean
        public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, User> template = new RedisTemplate<String, User>();
            template.setConnectionFactory(jedisConnectionFactory());
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(new RedisObjectSerializer());
            return template;
        }
    
    
    }
     
    

      

     
  • 完成了配置工作後,編寫測試用例實驗效果
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(Application.class)
    public class ApplicationTests {
    
    	@Autowired
    	private RedisTemplate<String, User> redisTemplate;
    
    	@Test
    	public void test() throws Exception {
    
    		// 保存對象
    		User user = new User("超人", 20);
    		redisTemplate.opsForValue().set(user.getUsername(), user);
    
    		user = new User("蝙蝠俠", 30);
    		redisTemplate.opsForValue().set(user.getUsername(), user);
    
    		user = new User("蜘蛛俠", 40);
    		redisTemplate.opsForValue().set(user.getUsername(), user);
    
    		Assert.assertEquals(20, redisTemplate.opsForValue().get("超人").getAge().longValue());
    		Assert.assertEquals(30, redisTemplate.opsForValue().get("蝙蝠俠").getAge().longValue());
    		Assert.assertEquals(40, redisTemplate.opsForValue().get("蜘蛛俠").getAge().longValue());
    
    	}
    
    }
    

      

    當然spring-data-redis中提供的數據操作遠不止這些,本文僅作為在Spring Boot中使用redis時的配置參考,更多對於redis的操作使用,請參考Spring-data-redis Reference。

  • 技術分享圖片源碼來源

Spring Boot教程(三十四)使用Redis數據庫(2)