Utilisez redis pour découpler la logique du code afin d'obtenir un stockage asynchrone

Redis possède de nombreuses fonctionnalités utiles, telles que la fourniture de méthodes de fonctionnement atomiques, une haute disponibilité et une forte concurrence. De nombreuses applications utilisent ces fonctionnalités, telles que l'écrêtage des pics, le découplage et l'amélioration de la réactivité du système.
Pic de trafic, exemple de stockage asynchrone: Le système a cet énorme tps en un instant, et ces demandes doivent toutes stocker les données dans la base de données, et ne nécessitent pas de quasi-temps réel, alors nous pouvons d'abord stocker les informations qui doivent être stocké dans Redis Cache one, puis utilisez le travail et d'autres minuteries pour stocker régulièrement les données dans la base de données.
L'exemple de code est le suivant:

/**
 * 通过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);
        }
    }
}


De cette manière, nous utilisons une simple file d'attente redis pour effectuer des opérations d'entreposage asynchrones sur les demandes.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43828467/article/details/114103656
conseillé
Classement