{"repo":"ms100/cache-as-multi","free":true,"listed":false,"github":"https://github.com/ms100/cache-as-multi","clone":"git clone https://github.com/ms100/cache-as-multi.git","description":"Extend Spring Cache to implement batch methods that take a collection as input and return a Map or List, breaking down the caching semantics into one cache entry per element. 扩展 Spring Cache 以实现把「集合入参 + Map/List 出参」的批量方法，缓存语义拆成「每个元素一条缓存」。","language":"Java","stars":19,"topics":["cache","spring-boot","spring-cache","spring","java","redis"],"license":"Apache-2.0","category":"databases-storage","readme_excerpt":"CacheAsMulti In English 安装 Maven 最近更新 v1.3 若批量方法返回的 List 不能保证与【对象集合参数】大小相同并顺序一致时，可以使用 @CacheAsMulti.asElementField 指定【对象集合参数】的元素在 List 的元素中所在的字段。这将更适合数据库查询。 使用 本注解需要与下面两套注解搭配使用，以实现对被注解参数所在的方法进行批量的缓存操作。 Spring的缓存注解 @Cacheable 、 @CachePut 、 @CacheEvict JSR-107的注解 @CacheResult 、JSR-107的 @CachePut 、 @CacheRemove 、 @CacheKey 只支持 PROXY 模式，不支持 ASPECTJ 模式 @Cacheable 和 @CacheResult 普通方法 假设已有获取单个对象的方法，如下： 此时如果需要获取批量对象的方法，通常会是下面两种写法： 获取批量对象的方法相对于获取单个对象的方法会有两点变化： 1. 入参从单个对象(以下称【对象参数】)变为对象集合(以下称【对象集合参数】)，例如 Integer 变为 Collection 或 Set 或 List 。 2. 返回值从单个对象变为 Map 或者 List 。例如 Map 或 List ，若返回的是 List 类型，那应与【对象集合参数】大小相同并顺序一致（PS: v1.3版本之后不再有此限制，详见更新细节）。 加缓存 在上面例子中，如果需要对获取单个对象的方法做缓存，会使用 @Cacheable 或 @CacheResult 注解： (PS: 这里将 @CacheResult 和 @Cacheable 放在一起举例子，实际使用时通常只用其中的一个) 如果对获取批量对象的方法直接加上 @Cacheable 或 @CacheResult ，则会使用【对象集合参数】整体生成一个缓存 key，将返回的 Map 或 List 整体作为一个缓存值。 但通常我们会希望它能变为多个 fooId = Foo 的缓存，即：使用【对象集合参数】中每个【元素】和它对应的值分别作缓存。 此时只需要在【对象集合参数】上加上 @CacheAsMulti 注解即可实现我们想要的缓存方式。 更多示例 与其他注解搭配使用时的说明 与 Spring 的 @CachePut 搭配时，同样符合上面的例子。 与 @CacheEvict 搭配时，若注解的 @CacheEvict.key() 参数中没有 #result ，对【方法】返回类型无要求；若 key 中有 #result ，【方法】返回类型需要是 Map 或 List 。 与 Spring 的 @CachePut 、 @CacheEvict 搭配，若 key 参数中已有 #result ， 则可以没有【对象集合参数】的引用。 与 @CacheRemove 搭配时，对【方法】返回类型无要求。 与 JSR-107 的 @CachePut 搭配时，对【方法】返回类型无要求，可参照下面的示例： JSR-107 的 @CachePut 单个参数做key，未配置 @CacheKey ： 更多示例 总结和补充 1. @CacheAsMulti 注解不能替代 Spring 缓存注解中的 key 参数，例如： @Cacheable.key() ，也不能替代 @CacheKey 、 @CacheValue 注解。 2. 如果使用自定义的 KeyGenerator ，则会用【对象集合参数】的每个【元素】","default_branch":null,"files":null,"tree":[],"storefront":"/r/ms100","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/ms100/cache-as-multi/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}