Heim  >  Artikel  >  Datenbank  >  Wie SpringBoot Redis mithilfe von @Cacheable und RedisTemplate integriert

Wie SpringBoot Redis mithilfe von @Cacheable und RedisTemplate integriert

PHPz
PHPznach vorne
2023-05-29 18:19:411394Durchsuche

Einige sehr einfache Optimierungen an der vorherigen Website vorgenommen und eine Paging-Funktion zur Benutzerliste hinzugefügt.

Es ist besser, beim Paginieren die Ladegeschwindigkeit zu berücksichtigen. Wenn Sie ein paar Sekunden warten müssen, um eine Seite zu wechseln, wird das Erlebnis sehr schlecht sein.

Also dachte ich darüber nach, einen Redis-Cache hinzuzufügen.

Es gibt zwei Möglichkeiten, Redis mit Springboot zu integrieren:

  • Erstens Annotationen verwenden, @EnableCaching @Cacheable usw.

  • Zweitens können Sie RedisTemplate verwenden, um den Cache zu betreiben , was effizienter ist als die Verwendung von Anmerkungen. Flexibel und bequem. Die Verwendung von Annotationen sollte theoretisch schneller sein, da die Daten direkt aus dem Cache abgerufen werden, ohne dass die Methode eingegeben werden muss. RedisTemplate muss in der Methode ausgeführt werden und die Beurteilung der Schreiblogik durchführen.

  • Das Folgende ist eine Aufzeichnung meiner Ideen zur Zwischenspeicherung von Paginierungen. Ich hoffe, dass mich jeder darauf hinweisen kann.

Das Geschäftsszenario ist ein Backend-Verwaltungssystem. Sie müssen der Echtzeit-Datenaktualisierung nicht zu viel Aufmerksamkeit schenken, sondern legen Sie einfach einen Ablauf von einer Stunde fest.

Meine Idee ist:

Wenn Sie eine Seite zum ersten Mal laden, fragen Sie die Daten der ersten vier Seiten aus der Datenbank ab. Auf diese Weise müssen Sie beim ersten Mal etwas länger warten, und es besteht fast keine Notwendigkeit auf nachfolgende Seitenänderungen warten. Auf diese Weise ist das Erlebnis besser. Überprüfen Sie dann jedes Mal, wenn Sie die Seite ändern, ob sie sich im Cache befindet. Wenn sie nicht nützlich ist, fügen Sie sie dem Cache hinzu.

@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));
}

Ich habe noch einmal versucht, im Statistikbereich Anmerkungen zu machen.

Fügen Sie beim Start zuerst die Annotation @EnableCaching hinzu.

Die Annotation ist einfach zu verwenden. Bevor Sie die Methode ausführen, wird überprüft, ob der Redis-Cache über den entsprechenden Wert verfügt Wenn nicht, wird die Methode ausgeführt.

value = „appUserData“ ist der Name des Cache-Bereichs und key ist der Name des Schlüssels.

Der folgende Schlüsselwert ist 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);
}

Andere Anmerkungen:

@CachePut

  • @Caching

  • @CacheEvict

Das obige ist der detaillierte Inhalt vonWie SpringBoot Redis mithilfe von @Cacheable und RedisTemplate integriert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen