Maison  >  Article  >  base de données  >  Comment SpringBoot intègre Redis à l'aide de @Cacheable et RedisTemplate

Comment SpringBoot intègre Redis à l'aide de @Cacheable et RedisTemplate

PHPz
PHPzavant
2023-05-29 18:19:411394parcourir

J'ai effectué quelques optimisations très simples sur le site Web précédent et ajouté une fonction de pagination à la liste des utilisateurs.

Il vaut mieux tenir compte de la vitesse de chargement lors de la pagination. Si vous devez attendre quelques secondes pour changer de page, l'expérience sera très mauvaise.

J'ai donc pensé à ajouter un cache redis.

Il existe deux façons pour Springboot d'intégrer Redis :

  • 1. Utilisez des annotations, @EnableCaching @Cacheable etc. 🎜## 🎜🎜#

  • 2. Utilisez RedisTemplate
  • Vous pouvez utiliser RedisTemplate pour faire fonctionner le cache, ce qui est plus flexible et plus pratique que en utilisant des annotations. L'utilisation des annotations devrait théoriquement être plus rapide car elle récupère les données directement du cache sans entrer dans la méthode. RedisTemplate doit être exécuté dans la méthode et effectuer le jugement de la logique d'écriture.

Ce qui suit est un compte rendu de mes idées pour la mise en cache de la pagination. Il doit y avoir de nombreuses lacunes. J'espère que tout le monde pourra me les signaler.

Le scénario commercial est un système de gestion backend. Vous n'avez pas besoin de prêter trop d'attention à l'actualisation des données en temps réel, il suffit de définir une expiration d'une heure.

Mon idée est :

Lorsque vous chargez la page pour la première fois, interrogez les données des quatre premières pages de la base de données, vous devez donc attendre encore un peu la première fois, il n’est presque pas nécessaire d’attendre les modifications de page ultérieures, ce qui rend l’expérience meilleure. Ensuite à chaque fois que vous changez de page, vérifiez si elle est dans le cache. Si cela n'est pas utile, ajoutez-la au cache.

@RequestMapping("/appUser/{currentPage}")
public R<String> getTableData1(@PathVariable int currentPage) {
    //第一次请求 前面几页用到的概率更大  把后面三页存入redis 减少后面分页请求的时间  以后每次加载页面都把那页放入redis
    // 设置一个小时过期
    Page<AppUser> appUserPage = new Page<AppUser>(currentPage, 12);
    if (currentPage == 1 && !redisTemplate.hasKey(1)) {
        for (int i = 1; i < 5; i++) {
            Page<AppUser> redisPage = new Page<AppUser>(i, 12);
            redisTemplate.opsForValue().set(i, appUserServiceInterface.page(redisPage), 1, TimeUnit.HOURS);
        }
    } else if (!redisTemplate.hasKey(currentPage)) {
        redisTemplate.opsForValue().set(currentPage, appUserServiceInterface.page(appUserPage), 1, TimeUnit.HOURS);
        return R.success((Page<AppUser>) redisTemplate.opsForValue().get(currentPage));
    } else if (redisTemplate.hasKey(currentPage)) {
        return R.success((Page<AppUser>) redisTemplate.opsForValue().get(currentPage));
    }
    return R.success(appUserServiceInterface.page(appUserPage));
}

J'ai réessayé d'annoter les statistiques des données.

Ajoutez d'abord l'annotation @EnableCaching au démarrage

L'annotation est simple à utiliser. Ajoutez simplement @Cacheable à la méthode Avant d'exécuter la méthode, le cache redis sera interrogé. pour voir s'il y en a une correspondante. Si la clé est présente, la valeur sera obtenue directement. Sinon, la méthode sera exécutée.

value = "appUserData" est le nom de la zone de cache et key est le nom de la clé.

La valeur clé suivante est appUserData : : userArea

@RequestMapping ("/userArea")
@Cacheable(value = "appUserData",key ="&#39;userArea&#39;")
public R<String> area() {
    List<AppUser> userList = appUserServiceInterface.list();
    List<String> areaList = new ArrayList<>();

    for (AppUser appUser : userList) {
        areaList.add(appUser.getArea());
    }
    //放入map记录每个月份出现的次数
    Map<String, Integer> areaTimes = new HashMap<>();
    for (String s : areaList) {
        if (!areaTimes.containsKey(s)) {
            areaTimes.put(s, 1);
        }else {
            areaTimes.put(s, areaTimes.get(s) + 1);
        }
    }
    //排序
    //自定义比较器
    Comparator<Map.Entry<String, Integer>> valCmp = new Comparator<Map.Entry<String, Integer>>() {
        @Override
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            // TODO Auto-generated method stub
            return o2.getValue() - o1.getValue();  // 降序排序,如果想升序就反过来
        }
    };
    //将map转成List,map的一组key,value对应list一个存储空间
    List<Map.Entry<String, Integer>> mapList = new ArrayList<Map.Entry<String, Integer>>(areaTimes.entrySet()); //传入maps实体
    Collections.sort(mapList, valCmp);

    //取前8
    int len = mapList.size();
    for (int i = 0; i < len-8; i++) {
        mapList.remove(8);
    }

    Map<String, String> resMap = new HashMap<>();
    for (Map.Entry<String, Integer> m : mapList) {
        resMap.put(m.getKey(), m.getValue().toString());
    }
    return R.success(resMap);
}

Autres notes :

    @CachePut#🎜🎜 #
  • @Caching
  • @CacheEvict

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer