Springboot-Redis - 5.通过 RedisTemplate 处理对象

Redis操作视图 (Operational views):

大多数用户可能会使用 RedisTemplate 及其相应的包,org.springframework.data.redis.core。事实上,template 是Redis模块的中心类,由于其丰富的功能集。该template为Redis的交互提供了一个高层次的抽象。RedisConnection 提供了接受和返回二进制值(byte 数组)的低级方法,模板负责序列化和连接管理,将用户从处理这些细节中解放出来。

此外,模板还提供了操作视图(operations view)(遵循Redis命令 参考 中的分组),这些视图提供了丰富的、生成的接口,用于针对某种类型或某种key(通过 KeyBound 接口)进行操作,如下表所述。

Key 类型的操作:

操作名称 作用 使用场景
GeoOperations Redis 的 geospatial 操作。 存储和查询地理位置信息,例如查询两点之间的距离。
HashOperations 操作 Redis 的哈希数据结构。 存储对象或字典样的数据。
HyperLogLogOperations Redis 的 HyperLogLog 操作。 进行基数估计,例如统计独立访客数量。
ListOperations 操作 Redis 的列表数据结构。 存储有序的元素列表。
SetOperations 操作 Redis 的集合数据结构。 存储不重复的值。
ValueOperations 操作 Redis 的字符串或值。 存储简单的 key-value 数据。
ZSetOperations 操作 Redis 的有序集合。 根据分数对值进行排序。

Key 绑定 操作:

操作名称 作用 使用场景
BoundGeoOperations Redis geospatial key 绑定操作。 对单个地理空间 key 执行多个操作。
BoundHashOperations Redis hash key 绑定操作。 对单个哈希 key 执行多个操作。
BoundKeyOperations Redis key 绑定操作。 对单一 key 执行多个常规操作。
BoundListOperations Redis list key 绑定操作。 对单一列表 key 执行多个操作。
BoundSetOperations Redis set key 绑定操作。 对单一集合 key 执行多个操作。
BoundValueOperations Redis string (or value) key 绑定操作。 对单一键值对进行操作。
BoundZSetOperations Redis zset (or sorted set) key 绑定操作。 对单一有序集合 key 执行多个操作。
@Configuration
class MyConfig {

  @Bean
  LettuceConnectionFactory redisConnectionFactory() {
    return new LettuceConnectionFactory();
  }

  @Bean
  RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

    RedisTemplate<String, String> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
  }
}
public class Example {

  // inject the actual template
  @Autowired
  private RedisTemplate<String, String> template;

  // inject the template as ListOperations
  @Resource(name="redisTemplate")
  private ListOperations<String, String> listOps;

  public void addLink(String userId, URL url) {
    listOps.leftPush(userId, url.toExternalForm());
  }
}

✌Key 类型的操作:

✍ 1. GeoOperations:

  • 作用: 提供方法来操作 Redis 的地理空间数据。
  • 使用场景: 当你需要存储和查询地理位置信息时,例如查询两点之间的距离或查询给定半径内的位置。
  • 示例:
    @Autowired
    private GeoOperations<String, String> geoOps;
    
    public void addLocation(String key, Point point, String member) {
        geoOps.geoAdd(key, point, member);
    }
    

✍ 2. HashOperations:

  • 作用: 用于操作 Redis 的哈希数据结构。
  • 使用场景: 当你需要存储对象或字典样的数据时。
  • 示例:
    @Autowired
    private HashOperations<String, String, Object> hashOps;
    
    public void addToHash(String key, String field, Object value) {
        hashOps.put(key, field, value);
    }
    

✍ 3. HyperLogLogOperations:

  • 作用: 用于操作 Redis 的 HyperLogLog 数据结构。
  • 使用场景: 当你需要进行基数估计,例如统计独立访客数量。
  • 示例:
    @Autowired
    private HyperLogLogOperations<String, String> hllOps;
    
    public void addToHLL(String key, String... values) {
        hllOps.add(key, values);
    }
    

✍ 4. ListOperations:

  • 作用: 用于操作 Redis 的列表数据结构。
  • 使用场景: 当你需要一个可以从头部或尾部添加或删除元素的列表时。
  • 示例:
    @Autowired
    private ListOperations<String, String> listOps;
    
    public void addToList(String key, String value) {
        listOps.leftPush(key, value);
    }
    

✍ 5. SetOperations:

  • 作用: 用于操作 Redis 的集合数据结构。
  • 使用场景: 当你需要存储不重复的值时。
  • 示例:
    @Autowired
    private SetOperations<String, String> setOps;
    
    public void addToSet(String key, String value) {
        setOps.add(key, value);
    }
    

✍ 6. ValueOperations:

  • 作用: 用于操作 Redis 的字符串或值。
  • 使用场景: 当你需要存储简单的 key-value 数据时。
  • 示例:
    @Autowired
    private ValueOperations<String, String> valueOps;
    
    public void setKeyValue(String key, String value) {
        valueOps.set(key, value);
    }
    

✍ 7. ZSetOperations:

  • 作用: 用于操作 Redis 的有序集合。
  • 使用场景: 当你需要根据分数对值进行排序时。
  • 示例:
    @Autowired
    private ZSetOperations<String, String> zSetOps;
    
    public void addToZSet(String key, String value, double score) {
        zSetOps.add(key, value, score);
    }
    

✌Key 绑定 操作:

这些操作提供了一种绑定到特定 key 的方法,使得操作更为简洁。例如,对于绑定操作,你不需要为每个操作提供 key,因为 key 已经预先绑定。

✍ 1. BoundGeoOperations:

  • 作用: 提供绑定到特定 key 的地理空间操作。
  • 使用场景: 当你想对单个地理空间 key 执行多个操作时。
  • 示例:
    BoundGeoOperations<String, String> boundGeoOps = redisTemplate.boundGeoOps("locationKey");
    boundGeoOps.geoAdd(new Point(13.361, 38.115), "loc1");
    

✍ 2. BoundHashOperations:

  • 作用: 提供绑定到特定 key 的哈希操作。
  • 使用场景: 当你想对单个哈希 key 执行多个操作时。
  • 示例:
    BoundHashOperations<String, String, Object> boundHashOps = redisTemplate.boundHashOps("hashKey");
    boundHashOps.put("field1", "value1");
    

✍ 3. BoundKeyOperations:

  • 作用: 提供绑定到特定 key 的基本操作。
  • 使用场景: 当你想对单一 key 执行多个常规操作时,如设置过期时间或删除 key。
  • 示例:
    BoundKeyOperations<String> boundKeyOps = redisTemplate.boundValueOps("sampleKey");
    boundKeyOps.expire(10, TimeUnit.SECONDS);
    

✍ 4. BoundListOperations:

  • 作用: 提供绑定到特定 key 的列表操作。
  • 使用场景: 当你想对单一列表 key 执行多个操作时。
  • 示例:
    BoundListOperations<String, String> boundListOps = redisTemplate.boundListOps("listKey");
    boundListOps.leftPush("value1");
    

✍ 5. BoundSetOperations:

  • 作用: 提供绑定到特定 key 的集合操作。
  • 使用场景: 当你想对单一集合 key 执行多个操作时。
  • 示例:
    BoundSetOperations<String, String> boundSetOps = redisTemplate.boundSetOps("setKey");
    boundSetOps.add("member1");
    

✍ 6. BoundValueOperations:

  • 作用: 提供绑定到特定 key 的值操作。
  • 使用场景: 当你想对单一键值对进行操作时。
  • 示例:
    BoundValueOperations<String, String> boundValueOps = redisTemplate.boundValueOps("valueKey");
    boundValueOps.set("newValue");
    

✍ 7. BoundZSetOperations:

  • 作用: 提供绑定到特定 key 的有序集合操作。
  • 使用场景: 当你想对单一有序集合 key 执行多个操作时。
  • 示例:
    BoundZSetOperations<String, String> boundZSetOps = redisTemplate.boundZSetOps("zsetKey");
    boundZSetOps.add("member1", 1.0);
    

这些“绑定操作”提供了一种直接方式在特定 key 上执行操作,使代码更简洁,因为不需要为每个操作提供 key 参数。

数据结构

✌a. 字符串 (String)

  • 作用:保存文本或二进制数据。

  • 使用场景:常规的键值存储,如保存配置、用户会话等。

  • 示例代码

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    public void saveStringValue() {
        stringRedisTemplate.opsForValue().set("key", "value");
    }
    
    public String getStringValue() {
        return stringRedisTemplate.opsForValue().get("key");
    }
    

✌b. 列表 (List)

  • 作用:有序集合,可以在两端进行插入或删除。

  • 使用场景:实现堆栈、队列、最近浏览的项目等。

  • 示例代码

    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    
    public void pushToList() {
        redisTemplate.opsForList().leftPush("listKey", "value");
    }
    
    public String popFromList() {
        return redisTemplate.opsForList().leftPop("listKey");
    }
    

✌c. 集合 (Set)

  • 作用:无序的字符串集合,不允许重复。

  • 使用场景:存储无序的唯一数据,如标签、关键字等。

  • 示例代码

    public void addToSet() {
        redisTemplate.opsForSet().add("setKey", "value1", "value2");
    }
    
    public boolean checkIfSetValueExists() {
        return redisTemplate.opsForSet().isMember("setKey", "value1");
    }
    

✌d. 散列 (Hash)

  • 作用:键值对的集合,是字符串到字符串的映射。

  • 使用场景:存储对象或数据实体。

  • 示例代码

    public void saveToHash() {
        redisTemplate.opsForHash().put("hashKey", "field", "value");
    }
    
    public Object getFromHash() {
        return redisTemplate.opsForHash().get("hashKey", "field");
    }
    

✌e. 位图 (BitMap)

  • 作用:使用位来存储数据,每个位的值只能是 0 或 1。

  • 使用场景:统计、实时分析等,如跟踪用户登录或记录用户活动。

  • 示例代码

    public void setBitValue() {
        redisTemplate.opsForValue().setBit("bitmapKey", 1, true);
    }
    
    public Boolean getBitValue() {
        return redisTemplate.opsForValue().getBit("bitmapKey", 1);
    }
    

✌f. HyperLogLog

  • 作用:用于估计唯一值的数量。

  • 使用场景:当精确值不重要,但内存使用效率很重要时,如统计网站的独立访客数。

  • 示例代码:(注意:Spring Data Redis 的接口不直接支持 HyperLogLog,但可以使用原始 Redis 命令来操作它)

简化的 API

与直接使用 Jedis 或 Lettuce 相比,Spring Data Redis 提供了一个更加直观和简化的 API。例如,你可以使用 RedisTemplate 或继承 CrudRepository 的接口来操作 Redis。

✌a. RedisTemplate

作用

RedisTemplate 提供了一种高级方式来与 Redis 进行交互。它处理了底层的连接管理、资源释放、异常处理等,同时提供了直观的操作 API。

使用场景

  • CRUD 操作。
  • 数据结构操作(例如,列表、集合、散列等)。
  • 发布/订阅。

优点

  • 简洁:提供了一致的 API,使得操作 Redis 变得简单。
  • 灵活:提供了大量的操作方法,几乎涵盖了所有 Redis 命令。
  • 类型安全:可以使用泛型来确保类型的安全性。

缺点

  • 性能开销:比直接使用 Jedis 或 Lettuce 有更多的性能开销,但对于大多数应用来说这是可以接受的。

示例代码

@Autowired
private RedisTemplate<String, String> redisTemplate;

public void setAndGet() {
    redisTemplate.opsForValue().set("key", "value");
    String value = redisTemplate.opsForValue().get("key");
}

✌b. 继承 CrudRepository

作用

Spring Data Redis 提供了对 Spring Data 的支持,允许你定义继承 CrudRepository 的接口,自动实现基于 Redis 的 CRUD 操作。

使用场景

  • 简单的 CRUD 操作。
  • 当你想使用类似于 JPA 的方式与 Redis 进行交互时。

优点

  • 简单:无需编写实现代码,只需定义接口。
  • 集成:与其他 Spring Data 项目(如 JPA、MongoDB)有相似的编程模型。
  • 自动生成方法:基于方法名称自动生成查询。

缺点

  • 不够灵活:对于复杂的操作或自定义查询,可能不够灵活。

示例代码

@Entity
public class Person {
    @Id
    private String id;
    private String name;
    // ... getters and setters
}

public interface PersonRepository extends CrudRepository<Person, String> {
    List<Person> findByName(String name);
}

@Service
public class PersonService {
    @Autowired
    private PersonRepository personRepository;

    public Person savePerson(Person person) {
        return personRepository.save(person);
    }

    public List<Person> findByName(String name) {
        return personRepository.findByName(name);
    }
}

总的来说,Spring Data Redis 提供了一套简化的 API,使得与 Redis 的交互更加直观和简洁。这些高级特性使得开发者可以更专注于业务逻辑,而不是底层的细节。

你可能感兴趣的:(spring,boot,redis,bootstrap)