Rumah  >  Artikel  >  pangkalan data  >  Bagaimana SpringBoot menyepadukan Redis menggunakan @Cacheable dan RedisTemplate

Bagaimana SpringBoot menyepadukan Redis menggunakan @Cacheable dan RedisTemplate

PHPz
PHPzke hadapan
2023-05-29 18:19:411390semak imbas

Membuat beberapa pengoptimuman yang sangat mudah pada tapak web sebelumnya dan menambah fungsi halaman pada senarai pengguna.

Semasa membuat penomboran, adalah lebih baik untuk mempertimbangkan kelajuan pemuatan Jika anda perlu menunggu beberapa saat untuk menukar halaman, pengalaman akan menjadi sangat teruk.

Jadi saya terfikir untuk menambah cache redis.

Terdapat dua cara untuk menyepadukan redis dengan springboot:

  • 1 Gunakan anotasi, @EnableCaching @Cacheable .

  • 2. Gunakan RedisTemplate

Anda boleh menggunakan RedisTemplate untuk mengendalikan cache, yang lebih fleksibel dan mudah daripada menggunakan anotasi. Menggunakan anotasi secara teori seharusnya lebih pantas kerana ia mengambil data terus daripada cache tanpa memasukkan kaedah. RedisTemplate perlu dijalankan dalam kaedah dan melaksanakan pertimbangan logik penulisan.

Berikut adalah rekod idea saya untuk caching penomboran Mesti ada banyak kekurangan saya harap anda boleh menunjukkannya kepada saya.

Senario perniagaan ialah sistem pengurusan bahagian belakang Anda tidak perlu memberi terlalu banyak perhatian kepada penyegaran data masa nyata, cuma tetapkan tamat tempoh satu jam.

Idea saya ialah:

Apabila memuatkan halaman buat kali pertama, tanya data empat halaman pertama daripada pangkalan data dengan cara ini, jika anda menunggu sedikit lagi untuk yang pertama masa, perubahan halaman seterusnya hampir mustahil. Tidak perlu menunggu, ini adalah pengalaman yang lebih baik. Kemudian setiap kali anda menukar halaman, semak sama ada ia berada dalam cache. Jika ia tidak berguna, tambahkannya pada 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));
}

Saya cuba menganotasi statistik sekali lagi.

Mula-mula tambah anotasi @EnableCaching pada permulaan

Anotasi mudah digunakan Hanya tambahkan @Cacheable pada kaedah tersebut, ia akan menanyakan sama ada cache redis mempunyai kunci yang sepadan Jika ya, Dapatkan nilai secara langsung, jika tidak, laksanakan kaedah.

value = "appUserData" ialah nama kawasan cache dan kunci ialah nama kunci.

Nilai utama berikut ialah 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);
}

Anotasi lain:

  • @CachePut

  • @Caching

  • @CacheEvict

Atas ialah kandungan terperinci Bagaimana SpringBoot menyepadukan Redis menggunakan @Cacheable dan RedisTemplate. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam