利用redis解耦代码逻辑,实现异步入库

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队列来对请求进行了异步入库操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值