- Tạo ứng dụng Spring Boot bằng Spring Launchizr
- Cấu hình Cassandra trong Spring Boot
- Định cấu hình nhóm kết nối Tomcat trên Spring Boot
- Định tuyến tin nhắn Camel đến Artemis được nhúng bằng WildFly
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ò xo
Hã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
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ị.
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.
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;
@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( ) +"]"; } }
@Có thể lưu vào bộ nhớ đệm
chú thích@CacheConfig(cacheNames = "menuCache",keyGenerator ="myKeyGenerator" ) giao diện công khai IMenuService mở rộng IService
@Có thể lưu vào bộ nhớ đệm
Chú 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:
#id;Giá trị của tham số id#a0 #p0 #root.args[0]
)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
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;
Trừ khi
Khô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ộ.Đượ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.
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);
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.
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);
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);
Tất nhiên chúng ta có thể cấu hình nó trên toàn cầu,cacheNames,keyGenerator
thuộc tính được thông qua@CacheConfig
Chú 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 });
@CachePut
Chú 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; }
Xóa bộ nhớ đệm
Các thuộc tính chính:
@CacheEvict(value = {"emp"}, beforeInvocation = true,key="#id") public void deleteEmp(Integer id){ workerMapper.deleteEmpById(id);
@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 }
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
Tôi đã đọc về JSR 107 Caching (JCache). Tôi bối rối: theo như tôi biết, mỗi CPU quản lý bộ nhớ đệm của nó (không có bất kỳ sự trợ giúp nào từ hệ điều hành). Vậy tại sao chúng ta cần trình xử lý bộ đệm Java? (Nếu C.
Được rồi, tôi mới làm quen với jQuery. Tôi đã loay hoay một chút ở đây và ở đó và quen với nó. Cuối cùng tôi đã tìm ra nó (nó không khó như một số người nghĩ). Vì vậy, đưa ra liên kết này: http://jqueryui.com/sortable/#dis
Tôi đang sử dụng Struts 2 và Hibernate. Tôi có một bảng đơn giản chứa trường ngày lưu trữ thông tin về thời điểm xảy ra một hành động cụ thể. Giá trị ngày này được hiển thị trong jsp của tôi. Vấn đề tôi gặp phải là ngủ đông nhiều hơn
Tôi hơi không chắc chuyện gì đang xảy ra ở đây, nhưng tôi đang cố gắng giải thích chuyện gì đang xảy ra và có thể viết một câu hỏi hay hơn khi tôi hiểu chính xác mình đang hỏi gì. Tôi vừa cài đặt Varnish và nó có vẻ rất phù hợp với nhu cầu của tôi. Đây là Magneto 2
Sau khi giải quyết vấn đề với Project Euler, tôi tìm thấy mã Haskell sau trong diễn đàn: fillRow115 minLength = cache which cache = ((map fill
Tôi đang cố gắng tìm cách lưu vào bộ đệm hoặc lưu trữ một số gói python nhất định cho mỗi máy tính trên mạng của mình. Tôi đã xem xét các giải pháp sau: pypicache nhưng nó không còn được phát triển tích cực nữa, tác giả khuyên dùng devpi, xem tại đây: https://bitbuc
Một câu hỏi xuất hiện trong đầu là liệu ổ cắm web có thể được lưu vào bộ nhớ đệm ngay từ đầu không? Trong cấu trúc liên kết của tôi, tôi có 2 máy chủ Apache (với Google PageSpee
Tôi khó có thể nhận ra sự khác biệt giữa các vùng bộ đệm (HĐH) khác nhau. Tôi muốn giải thích ngắn gọn về disk\buffer\swap\page cache. Họ sống ở đâu? Sự khác biệt chính giữa chúng là gì? Theo tôi hiểu, bộ đệm trang là một phần của bộ nhớ chính được sử dụng để lưu trữ dữ liệu thu được từ các thiết bị I/O.
1. Câu hỏi yêu cầu bạn thiết kế và triển khai cấu trúc dữ liệu cho thuật toán bộ đệm ít được sử dụng nhất (LFU). Triển khai lớp LFUCache: LFUCache(int energy) - khởi tạo đối tượng với dung lượng của cấu trúc dữ liệu
1. Câu hỏi yêu cầu bạn thiết kế và triển khai cấu trúc dữ liệu thỏa mãn ràng buộc bộ đệm LRU (ít được sử dụng gần đây nhất). Triển khai lớp LRUCache: ① LRUCache(int dung lượng) sử dụng số nguyên dương làm dung lượng dung lượng
Tôi muốn tắt bộ nhớ đệm cho một số trang khi truy cập Chế độ xem này. Nó phù hợp với các trang chỉ truy vấn các đối tượng mô hình. Có vẻ như khi 'Django.middleware.cache.FetchFromCacheMiddleware' được bật
tài liệu là trạng thái phần tử ExePackage Mục đích của thuộc tính Cache là lưu trữ gói mặc định.
Tôi biết docker lưu trữ từng hình ảnh bằng các lớp. Nếu tôi có nhiều người dùng trên một máy chủ phát triển và mọi người đang chạy cùng một Dockerfile nhưng lưu trữ hình ảnh dưới dạng user1_myapp thì lưu nó dưới dạng use.
Sau một vài năm không gặp vấn đề về bộ nhớ đệm trong Codeigniter, tôi đã phát hiện ra một vấn đề. Tôi đã thấy câu hỏi này ở nơi khác nhưng không có giải pháp nào hiệu quả với tôi. Ví dụ: nếu tôi thay đổi một số văn bản html đơn giản trong Xem và tải lên tệp mới và nhấn F5
Tôi đã đọc về Janusgraph Cache trong tài liệu Janusgraph. Về bộ nhớ đệm giao dịch, tôi có một vài nghi ngờ. Tôi đang sử dụng máy chủ janusgrah được nhúng trong ứng dụng của mình. Nếu tôi chỉ đọc ví dụ:
Tôi tự hỏi liệu có bất kỳ lệnh nào từ thiết bị đầu cuối mà tôi có thể sử dụng để phù hợp với việc sử dụng Tệp thực thi > Bộ nhớ đệm/Khởi động lại không hợp lệ trong Android Studio hay không. Cảm ơn bạn! Câu trả lời hay nhấtTheo một nhân viên của JetBrains
Tôi muốn tạo một trình trang trí python cho chức năng bộ nhớ. Ví dụ: nếu @memoization_trang trí def add(a, b, Negative=False): print "Com
Tôi thường sử dụng $(this) trong trình xử lý sự kiện jQuery và không bao giờ lưu nó vào bộ đệm. Nếu tôi thực hiện var $this = $(this); và sử dụng các biến thay vì hàm tạo, liệu mã của tôi có đạt được hiệu suất bổ sung đáng kể nào không?
Vâng, thành thật mà nói, tôi không biết sơn vcl, tôi có thể giải quyết một số vấn đề cơ bản, nhưng tôi không hiểu lắm, đó là lý do tại sao tôi gặp vấn đề. Tôi đang cố gắng thiết lập tính năng ngăn chặn bộ nhớ đệm thông qua yêu cầu http, nhưng yêu cầu này không đi qua DNS mà thông qua Varn
Tôi gặp phải sự cố này khi tải khoảng 4000 người dùng đồng thời trên trang WP của tôi. Đây là cấu hình của tôi: Bộ cân bằng tải F5 ---> Varnish 4, 8 lõi, RAM 32 Gb ---> 9 phụ trợ, 4 lõi, mỗi lõi 16 RA
Tôi là một lập trình viên xuất sắc, rất giỏi!