Redis Repositories是spring的一个开源项目他很好的利用了redis的存储特性。让redis实现类了简单的条件查询。
https://docs.spring.io/spring-data/redis/docs/2.0.3.RELEASE/reference/html/ 废话不多说,开代码。
pom文件引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
创建实体映射
//表明该实体类映射对象到哈希,redis:repository:livePkReward为树状结构目录
@RedisHash("redis:repository:livePkReward")
public class LivePkReward {
//对象数据的id表示唯一,redis会对他建立索引
@Id
private String id;
//单纯的建立索引
@Indexed
private String customerId;
@Indexed
private String opCustomerId;
private Integer rewardCustCnt;
private BigDecimal rewardAmt;
private Integer opRewardCustCnt;
private BigDecimal opRewardAmt;
public LivePkReward(String id, String customerId, String opCustomerId, Integer rewardCustCnt, BigDecimal rewardAmt, Integer opRewardCustCnt, BigDecimal opRewardAmt) {
this.id = id;
this.customerId = customerId;
this.opCustomerId = opCustomerId;
this.rewardCustCnt = rewardCustCnt;
this.rewardAmt = rewardAmt;
this.opRewardCustCnt = opRewardCustCnt;
this.opRewardAmt = opRewardAmt;
}
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public String getCustomerId() {
return this.customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
public String getOpCustomerId() {
return this.opCustomerId;
}
public void setOpCustomerId(String opCustomerId) {
this.opCustomerId = opCustomerId;
}
public Integer getRewardCustCnt() {
return this.rewardCustCnt;
}
public void setRewardCustCnt(Integer rewardCustCnt) {
this.rewardCustCnt = rewardCustCnt;
}
public BigDecimal getRewardAmt() {
return this.rewardAmt;
}
public void setRewardAmt(BigDecimal rewardAmt) {
this.rewardAmt = rewardAmt;
}
public Integer getOpRewardCustCnt() {
return this.opRewardCustCnt;
}
public void setOpRewardCustCnt(Integer opRewardCustCnt) {
this.opRewardCustCnt = opRewardCustCnt;
}
public BigDecimal getOpRewardAmt() {
return this.opRewardAmt;
}
public void setOpRewardAmt(BigDecimal opRewardAmt) {
this.opRewardAmt = opRewardAmt;
}
}
import cn.folkcam.rablive.entity.redis.LiveInAnchor;
import org.springframework.data.repository.CrudRepository;
//创建dao,查询类CrudRepository相当于spring-data-jpa
public interface LiveInAnchorRepository extends CrudRepository<LivePkReward , String> {
}
一般这样就可以了,CrudRepository有@NoRepositoryBean注解已经托管给spring了,在相应的service层直接注入使用就好了。
@ComponentScan(basePackages = {"项目的包路径"})
CrudRepository内已经定义了很多相关操作的api,可以自行去查看,这里不一一列举了,总之有了他对redis缓存数据的查询已经方便许多了,其他功能带后续研究,希望能和大家一起探讨
package org.springframework.data.repository;
import java.util.Optional;
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S var1);
<S extends T> Iterable<S> saveAll(Iterable<S> var1);
Optional<T> findById(ID var1);
boolean existsById(ID var1);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> var1);
long count();
void deleteById(ID var1);
void delete(T var1);
void deleteAll(Iterable<? extends T> var1);
void deleteAll();
}
前几天在工作遇到了一个很恶心的问题,只这里记录下解决方案和大家一起探讨下。
场景一:大致情况是这样的,在app相关的项目中对用户的账户数据进行缓存到redis,实现所有交易先对用户账户的缓存数据进行预处理,再把交易数据持久化到MySQL的业务逻辑放到消息队列中处理(为了处理并发压力)。
场景二:在后台管理系统中需要对用户的账户数据做修改同时也需要对相关的缓存同步。
本来以上两个场景虽然是在不同项目中的但是使用的redis缓存的同一个,所有没什么问题和难点。但是问题是场景一的项目中使用的是redis的存储库Redis Repositories
场景二使用的还是RedisTempLate,因为后台管理系统架构比较老了,要升级的话成本太高,这样就很尴尬了。
一开始我也是痛苦的要si,有两个问题:第一要使用redis访问树形结构目录@RedisHash("redis:repository:account")
第二就是获取和修改缓存中的数据,Redis Repositories是对象到哈希的类型,
解决:
开始试了很多方式都不行,后来在网上看到一个查询redis数据类型的命令才恍然大悟。从下图可知实体数据为哈希类型。
//使用redisTemplate存值,这里要注意不能存入引用数据类型,只能使用基本数据类型,Redis Repositories在取值的时候会解析错误
redisTemplate.opsForHash().put("redis:repository:account:4678", "totalBal",new BigDecimal(12.56).doubleValue());
//使用redisTemplate取值
Object totalBal = redisTemplate.opsForHash().get("redis:repository:account:5120", "totalBal");