Redis有着很多很多很有用的特性,比如提供原子性操作的方法,高可用,高并发,利用这些特性能有很多应用,比如削峰,解耦,提高系统的响应能力。
流量削峰,异步入库实例:系统一瞬间有这超大的tps,这些请求都需要对数据进行数据库存储操作,且并不要求准实时,那么,我们可以将需要入库的信息先在Redis中缓存一道,然后通过job等定时器,定时将数据入库。
示例代码如下:
/**
* 通过redis来实现削峰,解耦,提高系统的性能
**/
class PeakClippingByRedisDemo{
private RedisService redisService;
private Logger loger;
//定义的reids lisy key
private final static String userRedisKey = "USER_REDIS_KEY_LIST";
/**
* 利用redis进行异步入库操作
**/
public boolean saveUserInfo(User user){
try {
//数据入redis list中
redisService.rpush(userRedisKey, JSON.toJSONString(user));
} catch (Exception e) {
loger.info("rpushAutoBrandPass error");
return false;
}
return true;
}
/**
* 此方法由job定时器定时触发
**/
public void jobTask(){
int count = 0;
//处理失败的
List<String> errorList = new ArrayList<>();
//防止处理时间过长,可以设置每次处理的最大数量
while (count < 100) {
count++;
//从redis中依次获取需要的数据
String json = redisService.lpop(userRedisKey);
if (StringUtils.isBlank(json)) {
break;
}
try {
User user = JSON.parseObject(json, User.class);
//TODO 对该对象做的实际业务处理
}catch (Exception e){
errorList.add(json);
}
}
//将处理失败的重新塞入redis
if (CollectionUtils.isNotEmpty(errorList)) {
for (String jsonStr : errorList) {
redisService.rpush(userRedisKey, jsonStr);
}
}
}
}
public class PeakClippingByRedis {
public static void main(String[] args) {
//模拟入口
PeakClippingByRedisDemo pd = new PeakClippingByRedisDemo();
List<User> uLsit = new ArrayList<>(100);
for (User u:uLsit) {
//这里是入库或其他需要大量耗时耗资源的操作
pd.saveUserInfo(u);
}
}
}
这样我们就通过一个简单的redis队列来对请求进行了异步入库操作。