cuốn sách gpt4 ai đã làm

Bộ nhớ đệm tích hợp SpringBoot Sử dụng thực tế có thể lưu vào bộ nhớ đệm chi tiết

In lại Tác giả: Người biết Thời gian cập nhật: 2024-03-13 05:57:36 27 4
mua khóa gpt4 Nike

Lời nói đầu

Tôi biết rằng trong dự án giao diện api, các cuộc gọi thường xuyên đến giao diện để lấy dữ liệu và truy vấn cơ sở dữ liệu rất tốn tài nguyên, do đó có công nghệ bộ đệm, có thể lưu trữ một số dữ liệu không được cập nhật thường xuyên hoặc được sử dụng thường xuyên, sau đó lưu vào bộ đệm lần sau Khi yêu cầu, nó được lấy trực tiếp từ bộ đệm mà không cần truy vấn dữ liệu. Điều này có thể cải thiện hiệu suất chương trình, tăng trải nghiệm người dùng và tiết kiệm lãng phí tài nguyên dịch vụ.

hiện hữukhởi động lò xoHãy giúp chúng tôi tích hợp, có một trình khởi chạy cảnh tương ứng, chỉ cần giới thiệu nó giữa chúng tôi, giúp chúng tôi tích hợp nhiều bộ đệm khác nhau

  org.springframework.boot spring-boot-starter-cache  

Giới thiệu

Giới thiệu bộ nhớ đệm

Spring đã giới thiệu hỗ trợ cho Cache kể từ phiên bản 3.1. Các giao diện org.springframework.cache.Cache và org.springframework.cache.CacheManager được xác định để thống nhất các công nghệ bộ nhớ đệm khác nhau. và hỗ trợ việc sử dụng JCache (JSR-107)Chú thích đơn giản hóa sự phát triển của chúng tôi.

Cách sử dụng và nguyên tắc của nó tương tự như sự hỗ trợ của Spring cho việc quản lý giao dịch. Spring Cache hoạt động dựa trên các phương thức. Ý tưởng cốt lõi của nó là khi chúng ta gọi một phương thức bộ đệm, các tham số của phương thức và kết quả trả về sẽ được lưu trữ trong bộ đệm dưới dạng một cặp khóa-giá trị.

Mô tả giao diện Cache và CacheManager

Giao diện Cache chứa một tập hợp các hoạt động cache khác nhau. Bạn vận hành cache thông qua giao diện này.
Trong giao diện Cache, Spring cung cấp nhiều triển khai xxxCache khác nhau, chẳng hạn như: RedisCache, EhCache, ConcurrentMapCache

CacheManager xác định việc tạo, cấu hình, thu thập, quản lý và kiểm soát nhiều Cache có tên duy nhất. Các bộ đệm này tồn tại trong ngữ cảnh của CacheManager.

bản tóm tắt

Mỗi khi một phương thức yêu cầu bộ đệm được gọi, Spring sẽ kiểm tra xem phương thức đích đã chỉ định của tham số đã chỉ định đã được gọi hay chưa. Nếu chưa, nó sẽ trực tiếp lấy kết quả của lệnh gọi phương thức từ bộ đệm. phương thức và lưu trữ kết quả trước khi trả lại cho người dùng. Cuộc gọi tiếp theo sẽ được lấy trực tiếp từ bộ đệm.

Chúng ta cần chú ý hai điểm sau khi sử dụng tính năng trừu tượng hóa bộ đệm của Spring;

  1. Xác định các phương thức cần được lưu vào bộ nhớ đệm và chiến lược lưu vào bộ nhớ đệm của chúng
  2. Đọc dữ liệu được lưu trong bộ nhớ đệm trước đó từ bộ đệm

bắt đầu nhanh

  1. Để sử dụng bộ nhớ đệm, chúng ta cần kích hoạt bộ nhớ đệm dựa trên chú thích bằng cách sử dụng @EnableCaching Được đánh dấu trên lớp khởi động chính hoặc lớp cấu hình của springboot
@SpringBootApplication @MapperScan(value = {"cn.soboys.kmall.mapper","cn.soboys.kmall.sys.mapper","cn.soboys.kmall.security.mapper"},nameGenerator = UniqueNameGenerator.class) @ ComponentScan(value = {"cn.soboys.kmall"},nameGenerator = UniqueNameGenerator.class) @EnableCaching //Kích hoạt trình điều khiển chú thích bộ đệm, nếu không bộ đệm được sử dụng sau này sẽ không hợp lệ public class WebApplication { public static ApplicationContext applicationContext(String[] args) { applicationContext = SpringApplication.run(WebApplication.class, args) ; //displayAllBeans(); } /** * In tất cả các đậu đã tải */ public static void displayAllBeans() { String[] allBeanNames = applicationContext.getBeanDefinitionNames(); cho (Chuỗi BeanName : allBeanNames) { System.out.println(beanName);

hoặc lớp cấu hình

/** * @author kenx * @version 1.0 * @date 2021/8/17 15:05 * @webSite https://www.soboys.cn/ * Cấu hình bộ đệm tùy chỉnh */ @Configuration @Slf4j @EnableCaching // Bật trình điều khiển chú thích bộ đệm, nếu không bộ đệm được sử dụng sau này sẽ không hợp lệ public class CacheConfig { // Cấu hình lớp cấu hình tùy chỉnh keyGenerator @Bean("myKeyGenerator") public KeyGenerator keyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object target, Method Method, Object... params) { return Method.getName()+"["+ Arrays.asList(params).toString( ) +"]"; } }
  1. Chú thích bộ đệm chú thích được sử dụng khi cần bộ đệm.@Có thể lưu vào bộ nhớ đệmchú thích
@CacheConfig(cacheNames = "menuCache",keyGenerator ="myKeyGenerator" ) giao diện công khai IMenuService mở rộng IService { /** * Lấy thông tin menu người dùng* * tên người dùng @param tên người dùng* @return */ @Cacheable(key = " # tên người dùng") List getUserMenus(Tên người dùng chuỗi); }

@Có thể lưu vào bộ nhớ đệmChú thích có các tham số sau và chúng ta có thể thấy mã nguồn của nó

@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Cacheable { @AliasFor("cacheNames") String[] value() mặc định {}; value") Chuỗi[] cacheNames() mặc định {}; Chuỗi khóa() mặc định ""; Chuỗi keyGenerator() mặc định ""; Chuỗi cacheManager() mặc định ""; Chuỗi cacheResolver() mặc định ""; Chuỗi điều kiện() mặc định ""; Chuỗi trừ khi() mặc định ""; boolean sync() mặc định;

Hãy giới thiệu nó dưới đây @Có thể lưu vào bộ nhớ đệm Một số thuộc tính thường được sử dụng của chú thích này:

  1. cacheNames/value: Chỉ định tên của thành phần bộ đệm trong đó đặt kết quả trả về của phương thức vào bộ đệm, ở dạng mảng và có thể chỉ định nhiều bộ đệm;
  2. key: Khóa được sử dụng khi lưu trữ dữ liệu, bạn có thể sử dụng nó để chỉ định. Mặc định là sử dụng giá trị của tham số phương thức. (Bạn có thể sử dụng biểu thức spEL để viết khóa này như #id;Giá trị của tham số id#a0 #p0 #root.args[0])
  3. keyGenerator: Trình tạo khóa; bạn có thể tự chỉ định ID thành phần của trình tạo khóa và sau đó sử dụng key hoặc keyGenerator.
  4. cacheManager: có thể được sử dụng để chỉ định trình quản lý bộ đệm. Từ trình quản lý bộ đệm nào để lấy bộ đệm. Hoặc cacheResolver chỉ định trình phân giải
  5. điều kiện: có thể được sử dụng để chỉ định rằng bộ đệm sẽ chỉ được lưu vào bộ đệm nếu các điều kiện được đáp ứng.
condition="#id>0" condition="#a0>1": Bộ nhớ đệm chỉ được thực hiện khi giá trị của tham số đầu tiên >1
  1. trừ khi: Phủ nhận bộ nhớ đệm. Khi điều kiện được chỉ định bởitrừ khi là đúng, giá trị trả về của phương thức sẽ không được lưu vào bộ đệm. Tất nhiên, bạn cũng có thể nhận được kết quả để đánh giá. (Nhận kết quả phương pháp qua #result)
trừ khi = "#result == null"trừ khi = "#a0==2": Nếu giá trị của tham số đầu tiên là 2, kết quả sẽ không được lưu vào bộ đệm;
  1. đồng bộ hóa: Có sử dụng chế độ không đồng bộ hay không. Trong trường hợp chế độ không đồng bộTrừ khiKhông được hỗ trợ. Theo mặc định, phương thức này được thực thi và kết quả được phương thức trả về sẽ được lưu trữ trong bộ đệm một cách đồng bộ.

thuộc tính cacheNames/value

Được sử dụng để chỉ định tên của thành phần bộ đệm và bộ đệm nào sẽ đặt kết quả trả về của phương thức. Nó có thể ở dạng một mảng và hỗ trợ chỉ định nhiều bộ đệm.

/** * Lấy thông tin menu người dùng* * @param tên người dùng tên người dùng* @return */ @Cacheable(cacheNames = "menuCache") hoặc // @Cacheable(cacheNames = {"menuCache","neCacge"}) List getUserMenus(Tên người dùng chuỗi);

Nếu chỉ có một thuộc tính, cacheNames có thể bị bỏ qua và thuộc tính giá trị mặc định được sử dụng trực tiếp.

chìa khóa

Khóa được sử dụng khi lưu trữ dữ liệu. Theo mặc định, giá trị của tham số phương thức được sử dụng. Có thể được sử dụng câu thần chú biểu thức để viết.

Siêu dữ liệu có sẵn của Cache SpEL

tên Vị trí mô tả Ví dụ
tên phương thức đối tượng gốc Tên của phương thức hiện được gọi #root.tên phương thức
phương pháp đối tượng gốc Phương thức hiện được gọi #root.method.name
mục tiêu đối tượng gốc Phiên bản đối tượng mục tiêu hiện đang được gọi #root.target
lớp mục tiêu đối tượng gốc Lớp của đối tượng mục tiêu hiện đang được gọi #root.targetClass
lập luận đối tượng gốc Danh sách tham số của phương thức hiện được gọi #root.args[0]
bộ nhớ đệm đối tượng gốc Danh sách bộ đệm được sử dụng bởi lệnh gọi phương thức hiện tại #root.caches[0].name
tên đối số bối cảnh đánh giá Các tham số của phương thức hiện được gọi, chẳng hạn như findArtisan(nghệ nhân thủ công), có thể được lấy thông qua #artsian.id #artsian.id
kết quả bối cảnh đánh giá Giá trị trả về sau khi phương thức được thực thi (chỉ hợp lệ sau khi phương thức được thực thi, chẳng hạn như beforeInvocation=false của trừ khi cacheEvict) #kết quả
//key = "#username" là tham số tên người dùng @Cacheable(key = "#username", cacheNames = "menuCache") List getUserMenus(String username);

keyGenerator

Trình tạo khóa, bạn có thể tự chỉ định trình tạo khóa và sử dụng trình tạo khóa này để tạo khóa

Xác định lớp @Bean và thêm KeyGenerator vào vùng chứa Spring

@Configuration @Slf4j @EnableCaching //Bật trình điều khiển chú thích bộ đệm, nếu không bộ đệm được sử dụng sau này sẽ không hợp lệ public class CacheConfig { //Cấu hình lớp cấu hình tùy chỉnh keyGenerator @Bean("myKeyGenerator") public KeyGenerator keyGenerator(){ return new KeyGenerator ( ) { @Ghi đè đối tượng công khai tạo ra (Mục tiêu đối tượng, Phương thức phương thức, Đối tượng... params) { return phương thức.getName()+"["+ Arrays.asList(params).toString() +"]";

Chỉ định của riêng bạn khi sử dụng@Cacheable(cacheNames = "menuCache",keyGenerator = "myKeyGenerator" )

Lưu ý rằng các quy tắc tạo khóa được đưa vào bộ đệm được tạo theo keyGenerator tùy chỉnh của bạn. Tuy nhiên, cần lưu ý rằng khi sử dụng các thuộc tính @Cacheable, key và keyGenerator, bạn thường chọn một trong hai.

tình trạng

Chỉ lưu trữ nếu điều kiện được đáp ứng. Việc dữ liệu được phương thức trả về có nên được lưu vào bộ đệm hay không có thể được xác định một cách linh hoạt.

/** * Nhận thông tin menu người dùng * * @param tên người dùng tên người dùng * @return */ //Đánh giá rằng tên người dùng sẽ chỉ được lưu vào bộ đệm nếu tên người dùng bắt đầu bằng kenx @Cacheable(key = "#username" ,condition = "#username. startedWith ('kenx')") Danh sách getUserMenus(Tên người dùng chuỗi);

Trừ khi

Phủ nhận bộ nhớ đệm. Khi điều kiện được chỉ định bởitrừ khi là đúng, giá trị trả về của phương thức sẽ không được lưu vào bộ đệm.

/** * Nhận thông tin menu người dùng * * @param tên người dùng tên người dùng * @return */ //Đánh giá rằng tên người dùng tên người dùng bắt đầu bằng kenx và sẽ không được lưu vào bộ đệm @Cacheable(key = "#username" ,condition = "#username.startsWith ('kenx')") List getUserMenus(Tên người dùng chuỗi);

spEL ghi khóa

Tất nhiên chúng ta có thể cấu hình nó trên toàn cầu,cacheNames,keyGeneratorthuộc tính được thông qua@CacheConfigChú thích có thể được sử dụng để trích xuất cấu hình công khai của bộ đệm và sau đó thêm nó vào lớp, ví dụ: chẳng hạn như

//Cấu hình chung, phương thức bộ nhớ đệm được sử dụng bên dưới, nếu không được định cấu hình, @CacheConfig(cacheNames = "menuCache",keyGenerator ="myKeyGenerator" ) toàn cục sẽ được sử dụng theo giao diện công khai mặc định IMenuService mở rộng IService { /** * Nhận thông tin menu người dùng* * @param tên người dùng tên người dùng* @return */ @Cacheabl List getUserMenus(String username });

Sử dụng chuyên sâu

@CachePut

@CachePutChú thích cũng là chú thích cho bộ nhớ đệm, nhưng sự khác biệt rõ ràng giữa bộ nhớ đệm và @Cacheable làTức là gọi phương thức và cập nhật dữ liệu được lưu trong bộ nhớ cache, tức là bộ đệm được cập nhật đồng bộ sau khi thực hiện thao tác phương thức, vì vậy khóa chính này thường được sử dụng cho các hoạt động cập nhật và cũng có thể được sử dụng cho các truy vấn. Có nhiều điểm tương đồng giữa thuộc tính khóa chính và @Cacheable. @CachePut mã nguồn.

@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface CachePut { @AliasFor("cacheNames") String[] value() mặc định {}; value") Chuỗi[] cacheNames() mặc định {}; Chuỗi khóa() mặc định ""; Chuỗi keyGenerator() mặc định ""; Chuỗi cacheManager() mặc định ""; Chuỗi cacheResolver() mặc định ""; Chuỗi điều kiện() mặc định ""; Chuỗi trừ khi() mặc định "";
/** * @CachePut: Cả hai đều gọi phương thức và cập nhật dữ liệu được lưu trong bộ đệm; cập nhật bộ đệm một cách đồng bộ* Sửa đổi dữ liệu và cập nhật bộ đệm cùng một lúc*/ @CachePut(value = {"emp"}, key = "# result.id") public Nhân viên updateEmp(Nhân viên nhân viên){ memberMapper.updateEmp(nhân viên); LOG.info("Cập nhật dữ liệu nhân viên của {}",employee.getId()); trả về nhân viên; }

@CacheEvict

Xóa bộ nhớ đệm
Các thuộc tính chính:

  1. key: Chỉ định dữ liệu cần xóa
  2. allEntries = true: Chỉ định xóa tất cả dữ liệu trong bộ đệm này
  3. beforeInvocation = false: Theo mặc định, thao tác xóa bộ đệm được thực hiện sau khi phương thức được thực thi.
  4. beforeInvocation = true: có nghĩa là thao tác xóa bộ đệm được thực thi trước khi phương thức được chạy.
@CacheEvict(value = {"emp"}, beforeInvocation = true,key="#id") public void deleteEmp(Integer id){ workerMapper.deleteEmpById(id);

@Caching

@Caching Được sử dụng để xác định các quy tắc bộ nhớ đệm phức tạp và có thể được tích hợp@Cacheable và @CachePut

// @Caching xác định các quy tắc bộ nhớ đệm phức tạp @Caching( cacheable = { @Cacheable(/*value={"emp"},*/key = "#lastName") }, put = { @CachePut(/*value={ " emp"},*/key = "#result.id"), @CachePut(/*value={"emp"},*/key = "#result.email") } ) public getEmpByLastName(String LastName){ trả về nhân viênMapper.getEmpByLastName(lastName }

@CacheConfig

Chú thích @CacheConfig có thể được sử dụng để trích xuất cấu hình công khai của bộ đệm và sau đó thêm nó vào lớp

//Cấu hình chung, phương thức bộ nhớ đệm được sử dụng bên dưới, nếu không được định cấu hình, @CacheConfig(cacheNames = "menuCache",keyGenerator ="myKeyGenerator" ) toàn cục sẽ được sử dụng theo giao diện công khai mặc định IMenuService mở rộng IService { /** * Nhận thông tin menu người dùng* * @param tên người dùng Tên người dùng* @return */ @Cacheable(key = "#username" ) List getUserMenus(String username });

tham khảo

  1. Hướng dẫn sử dụng bộ đệm SpringBoot
  2. Bắt đầu với bộ nhớ đệm
27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress