Spring Redis(6)Redis持久化

Redis持久化

RedisRepositories能够简化将实体存入Hash的操作,并自动维护索引字段。只需要象Hibernate那样使用save、delete等简单方法即可持久化数据到Redis。

Redis Repositories最低需要Redis 2.8.0.

简单使用

定义实体


// 定义Redis实体的keyspace为persons
@RedisHash("persons")
public class Person {

  // 每个Redis实体必须有且只有一个@Id
  @Id 
  String id;
  String firstname;
  String lastname;
  Address address;
}

public class Address {
  String city;
  String country;
}

定义Repository 接口,CrudRepository 提供基本的CRUD和查找方法,Spring将自动生成该接口的实现类



public interface PersonRepository extends CrudRepository<Person, String> {

}

定义配置类,默认扫描配置类所在包下的类,可以通过注解EnableRedisRepositories的参数来指定扫描的包,如@EnableRedisRepositories({“com.htfg.*”})

@Configuration
@EnableRedisRepositories
public class ApplicationConfig {

  @Bean
  public RedisConnectionFactory connectionFactory() {
    return new JedisConnectionFactory();
  }

  @Bean
  public RedisTemplate<?, ?> redisTemplate() {

    RedisTemplate<byte[], byte[]> template = new RedisTemplate<byte[], byte[]>();
    return template;
  }
}


@Autowired PersonRepository repo;

public void basicCrudOperations() {

  Person rand = new Person("rand", "al'thor");
  rand.setAddress(new Address("emond's field", "andor"));
  // 如果rand的id值不存在,将会自动创建
  // 默认生成hash的key为keyspace:id样式,例如persons:5d67b7e1-8640-4475-beeb-c666fab4c0e5
  repo.save(rand);                                         
  // 使用keyspace:id查找数据
  repo.findOne(rand.getId());           

  repo.count();                                            
  repo.delete(rand);                                       
}

对象映射到Hash

上文的Peron对象将被用以下方式存储到Redis的hash中
key值等于”persons:5d67b7e1-8640-4475-beeb-c666fab4c0e5”
field、value包括

_class = org.example.Person           
id = 5d67b7e1-8640-4475-beeb-c666fab4c0e5
firstname = rand                       
lastname = al’thor
address.city = emond's field          
address.country = andor

_class属性为Redis实体的类名

复杂的类型属性用点号分隔路径

Java映射规则
简单类型,如String

String firstname = “rand”;

映射为

firstname = “rand”

复合类型,如Address对象

Address adress = new Address(“emond’s field”);

映射为

address.city = “emond’s field”

List

List nicknames = asList(“dragon reborn”, “lews therin”);

映射为

nicknames.[0] = “dragon reborn”,
nicknames.[1] = “lews therin”

Map

Map

List复合类型

List

addresses = asList(new Address(“em…​

映射为

addresses.[0].city = “emond’s field”,
addresses.[1].city = “…​

Map复合类型

Map

自定义映射规则
Json映射


@WritingConverter
public class AddressToBytesConverter implements Converter<Address, byte[]> {

  private final Jackson2JsonRedisSerializer<Address> serializer;

  public AddressToBytesConverter() {

    serializer = new Jackson2JsonRedisSerializer<Address>(Address.class);
    serializer.setObjectMapper(new ObjectMapper());
  }

  @Override
  public byte[] convert(Address value) {
    return serializer.serialize(value);
  }
}

@ReadingConverter
public class BytesToAddressConverter implements Converter<byte[], Address> {

  private final Jackson2JsonRedisSerializer<Address> serializer;

  public BytesToAddressConverter() {

    serializer = new Jackson2JsonRedisSerializer<Address>(Address.class);
    serializer.setObjectMapper(new ObjectMapper());
  }

  @Override
  public Address convert(byte[] value) {
    return serializer.deserialize(value);
  }
}

使用上面的定制Converter将生成下面的类似的filed和value

_class = org.example.Person
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand
lastname = al’thor
address = { city : "emond's field", country : "andor" }
自定义映射


@WritingConverter
public class AddressToMapConverter implements Converter<Address, Map<String,byte[]>> {

  @Override
  public Map<String,byte[]> convert(Address source) {
    return singletonMap("ciudad", source.getCity().getBytes());
  }
}

@ReadingConverter
public class MapToAddressConverter implements Converter<Address, Map<String, byte[]>> {

  @Override
  public Address convert(Map<String,byte[]> source) {
    return new Address(new String(source.get("ciudad")));
  }
}

使用上面的定制Converter将生成下面的类似的filed和value



_class = org.example.Person
id = e2c7dcee-b8cd-4424-883e-736ce564363e
firstname = rand
lastname = al’thor
ciudad = "emond's field"

Keyspaces

Keyspaces定义前缀用于创建Hash的key,默认使用在Redis实体的getClass().getName()。

可通过在Redis实体注解RedisHash 参数设置

@RedisHash("persons")
public class Person {

}

也可以在配置类中用EnableRedisRepositories设置。



@Configuration
@EnableRedisRepositories(keyspaceConfiguration = MyKeyspaceConfiguration.class)
public class ApplicationConfig {

  //... RedisConnectionFactory and RedisTemplate Bean definitions omitted

  public static class MyKeyspaceConfiguration extends KeyspaceConfiguration {

    @Override
    protected Iterable<KeyspaceSettings> initialConfiguration() {
      return Collections.singleton(new KeyspaceSettings(Person.class, "persons"));
    }
  }
}

或者在配置类中编码设置



@Configuration
@EnableRedisRepositories
public class ApplicationConfig {

  //... RedisConnectionFactory and RedisTemplate Bean definitions omitted

  @Bean
  public RedisMappingContext keyValueMappingContext() {
    return new RedisMappingContext(
      new MappingConfiguration(
        new MyKeyspaceConfiguration(), new IndexConfiguration()));
  }

  public static class MyKeyspaceConfiguration extends KeyspaceConfiguration {

    @Override
    protected Iterable<KeyspaceSettings> initialConfiguration() {
      return Collections.singleton(new KeyspaceSettings(Person.class, "persons"));
    }
  }
}

索引

Redis对字段的索引是通过

TTL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值