Nhãn: Redis.Mybatis.Lock;
Bộ nhớ đệm về cơ bản là một trong những thành phần bắt buộc trong quá trình phát triển dự án. Là một hệ thống lưu trữ khóa-giá trị, Redis có hiệu suất đọc và ghi dữ liệu cực cao, đồng thời hỗ trợ nhiều loại dữ liệu và được sử dụng rộng rãi trong các tình huống kinh doanh;
Một kịch bản ứng dụng điển hình của Redis là khả năng lưu trữ dữ liệu, được sử dụng để giải quyết các vấn đề về hiệu suất truy vấn phổ biến nhất trong doanh nghiệp và cải thiện hiệu quả phản hồi của hệ thống. Thứ hai là cơ chế khóa phân tán, được sử dụng để giải quyết vấn đề bảo mật của hệ thống; tài nguyên xử lý đồng thời đa luồng trong hệ thống phân tán;
Máy khách Redis sử dụng phiên bản 6.2.4.RELEASE của thành phần rau diếp, có khả năng mở rộng và an toàn theo luồng, đồng thời hỗ trợ nhiều tính năng nâng cao khác nhau của Redis, chẳng hạn như trọng điểm, cụm, đường ống, kết nối lại tự động, v.v.;
org.springframework.boot spring-boot-starter-data-redis ${spring-boot.version} org.springframework.integration spring-integration-redis ${spring-integration.version}
Tệp cấu hình, thành phần nhóm kết nối common-pool2 được sử dụng theo mặc định trong thành phần rau diếp và một số tham số cốt lõi chung được xác định trong cấu hình;.
spring: # Redis dữ liệu cấu hình: redis: máy chủ: 127.0.0.1 cổng: 6379 cơ sở dữ liệu: 1 # Thời gian chờ đọc: 3000 # Thời gian chờ kết nối connectTimeout: 5000 # Nhóm kết nối rau diếp rau diếp: nhóm: # Kết nối nhàn rỗi tối thiểu tối thiểu: 5 # Kết nối nhàn rỗi tối đa không hoạt động tối đa: 10 # Số lượng kết nối tối đa hoạt động tối đa: 100 # Thời gian tối đa phân bổ kết nối sẽ chặn thời gian chờ tối đa: 2000
Lớp cấu hình.
@Configuration public class RedisConfig { /** * Mô tả RedisTemplate */ @Bean("redisTemplate") public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(factory); redisTemplate.setKeySerializer(new StringRedisSerializer()); return redisTemplate; } /** * Mô tả StringRedisTemplate */ @Bean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) { StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(); stringRedisTemplate.setConnectionFactory(factory); stringRedisTemplate.setKeySerializer(new StringRedisSerializer()); trả về chuỗiRedisTemplate; } /** * Redis分布式锁 */ @Bean public RedisLockRegistry redisLockRegistry(RedisConnectionFactory Factory){ // 1、锁的密钥前缀:REDIS-LOCK // 2、锁的过期时间:20秒 trả về RedisLockRegistry(factory, "KHÓA REDIS", 20000L); } }
Tài liệu Redis khuyên bạn nên sử dụng công cụ brew để cài đặt. Môi trường cục bộ là phiên bản 4.1. Bạn có thể tìm kiếm redis@6.2, nghĩa là cài đặt phiên bản này và bạn có thể sử dụng lệnh brew để quản lý việc khởi động và dừng Redis;
brew --version Homebrew 4.1.0 brew search redis ==> Công thức redis redis-leveldb redis@3.2 redis@4.0 redis@6.2 brew install redis@6.2 brew services start redis@6.2 ==> Đã khởi động thành công `redis@6.2` (nhãn: homebrew.mxcl.redis@6.2) brew services restart redis@6.2 ==> Đã dừng thành công `redis@6.2` (nhãn: homebrew.mxcl.redis@6.2) ==> Đã khởi động thành công `redis@6.2` (nhãn: homebrew.mxcl.redis@6.2) brew services stop redis@6.2 ==> Đã dừng thành công `redis@6.2` (nhãn: homebrew.mxcl.redis@6.2)
Định cấu hình các biến môi trường Redis để có thể sử dụng các hướng dẫn gốc của Redis trên dòng lệnh cho các hoạt động khởi động và máy khách. Sau khi hoàn tất quá trình kiểm tra, môi trường redis@6.2 cục bộ của hệ thống Mac được định cấu hình;
mở -e ~/.bash_profile xuất REDIS_HOME=/usr/local/opt/redis@6.2 xuất PATH=$REDIS_HOME/bin:$PATH nguồn ~/.bash_profile redis-server Redis 6.2.13 ,Chạy ở chế độ độc lập , Cổng: 6379 , PID: 7966 redis-cli 127.0.0.1:6379> chọn 1 OK 127.0.0.1:6379> đặt redis-key redis-value OK 127.0.0.1:6379> lấy redis-key "redis-value" 127.0.0.1:6379> xóa redis-key (số nguyên) 1
Chuỗi: Chuỗi là kiểu dữ liệu cơ bản nhất, biểu thị một chuỗi byte và là kiểu được sử dụng phổ biến nhất. Một chuỗi có thể lưu trữ tới 512MB;.
public void dataString () throws Exception { // 1、Khóa KV ảo redisTemplate.opsForValue().set("key-01","value-01",300, TimeUnit.SECONDS); // 2、Khóa JSON ảo JsonMapper jsonMapper = new JsonMapper() ; String jsonVar = jsonMapper.writeValueAsString(new IdValue(1,"Json ảo")) ; redisTemplate.opsForValue().set("key-02",jsonVar,500,TimeUnit.SECONDS); Đối tượng key01 = redisTemplate.opsForValue().get("key-01"); Đối tượng key02 = redisTemplate.opsForValue().get("key-02"); log.info("key01:{},key02:{}",key01,key02); }
Danh sách: Cấu trúc danh sách liên kết, có thể lưu trữ nhiều giá trị chuỗi một cách có trật tự. Nó có thể mô phỏng một hàng đợi tin nhắn dựa trên cách ghi dữ liệu từ trái sang phải và đọc từ bên phải. 2^32-1;
public void dataList (){ // 1、Danh sách dữ liệu được định nghĩa redisTemplate.opsForList().leftPushAll("data-list","value-01","value-02","value-03"); // 2、Danh sách dữ liệu được định nghĩa Object rightPop01 = redisTemplate.opsForList().rightPop("data-list") ; Object rightPop02 = redisTemplate.opsForList().rightPop("data-list") ; log.info("rightPop01:{},rightPop02:{}",rightPop01,rightPop02); }
Bộ: được sử dụng để lưu trữ các bộ chuỗi duy nhất, không có thứ tự, thường được sử dụng để theo dõi và phân tích các kịch bản kinh doanh của các mục duy nhất, chẳng hạn như nhóm người dùng dưới nhãn duy nhất, IP độc lập, v.v.;
public void dataSet (){ // 1、写数据 redisTemplate.opsForSet().add("data-set","Java","C++","Python","C++"); // 2、读数据 Object pop01 = redisTemplate.opsForSet().pop("data-set"); Đối tượng pop02 = redisTemplate.opsForSet().pop("data-set"); log.info("pop01:{},pop02:{}",pop01,pop02); }
Băm: Trong chính cấu trúc KV của Redis, loại dữ liệu KV có thể được sử dụng lại về mặt giá trị. Khi lưu trữ dữ liệu quan hệ quy mô lớn, loại này sẽ được sử dụng đầu tiên;.
public void dataHash (){ // 1、Phương thức khởi tạo HashMap hashMap = new HashMap<>() ; hashMap.put("key1","value1") ; hashMap.put("key2","value2") ; redisTemplate.opsForHash().putAll("data-hash",hashMap); // 2、Phương thức khởi tạo Object kv1 = redisTemplate.opsForHash().get("data-hash","key1"); Object kv2 = redisTemplate.opsForHash().get("data-hash","key2"); log.info("kv1:{},kv2:{}",kv1,kv2); }
Sorted-sets: Một tập hợp các chuỗi duy nhất nhưng thứ tự có thể được duy trì thông qua điểm tương quan của từng chuỗi. Điểm ở đây có thể biểu thị thứ tự xếp hạng hoặc có thể được xác định là trọng số hoặc mức độ ưu tiên của đối tượng.
public void dataSortedSet (){ // 1、Phương thức định nghĩa redisTemplate.opsForZSet().add("sorted-set","Java",1.0); redisTemplate.opsForZSet().add("sorted-set","Python",3.0); redisTemplate.opsForZSet().add("sorted-set","C++",2.0); // 2、Phương thức định nghĩa Object popMax = redisTemplate.opsForZSet().popMax("sorted-set"); Object popMin = redisTemplate.opsForZSet().popMin("sorted-set"); log.info("popMax:{},popMin:{}",popMax,popMin); }
Sử dụng phương thức SETNX, nghĩa là setIfAbsent trong mã. Nếu khóa không tồn tại, hãy đặt khóa để lưu giá trị của chuỗi, tương đương với SET.
@Service public class RedisLockService { @Resource private RedisTemplate redisTemplate ; public Boolean lock (String lock,long timeout){ return redisTemplate.opsForValue().setIfAbsent(lock,lock,timeout, TimeUnit.SECONDS); } public void unLock (String lock){ Object lockVal = redisTemplate.opsForValue().get(lock); if (!Objects.isNull(lockVal) && Objects.equals(lockVal.toString(),lock)){ redisTemplate.delete(lock) ; } } }
RedisLockRegistry là một lớp đóng gói được cung cấp bởi thành phần tích hợp lò xo. Nó dựa trên khả năng triển khai các khóa phân tán của Redis. Để thử nghiệm hai cơ chế khóa, bạn có thể xem lớp thử nghiệm đơn vị RedisLockTest trong dự án mã.
@Service public class LockRegistryService { @Resource protected RedisLockRegistry redisLockRegistry; /** * Không có giá trị mặc định */ @SneakyThrows public Boolean tryLock(T lockKey, Long time) { return redisLockRegistry.obtain(lockKey).tryLock(time, TimeUnit.SECONDS); } /** * Không có giá trị mặc định */ @SneakyThrows public Boolean reTryLock(T lockKey, Long time,int retryNum) { Boolean lockFlag = tryLock(lockKey, time); if (Boolean.TRUE.equals(lockFlag)) { return Boolean.TRUE; } for (int i = 0; i < retryNum; i++) { if (Boolean.TRUE.equals(tryLock(lockKey, time))){ return Boolean.TRUE; } } return Boolean.FALSE; } /** * Khóa */ public void unlock(T lockKey) { redisLockRegistry.obtain(lockKey).unlock(); } }
Trong khung Mybatis, bộ đệm cấp một đề cập đến cấp SqlSession; bộ đệm cấp hai đề cập đến cấp Mapper và cần được bật trong tệp cấu hình. Bộ đệm cấp hai không phù hợp với các tình huống kinh doanh có dữ liệu. thường xuyên được sửa đổi;.
tập tin cấu hình.
mybatis-plus: cấu hình: cache-enabled: true log-implement: org.apache.ibatis.logging.stdout.StdOutImpl
Chú thích của Mapper, lớp MybatisCache tùy chỉnh được sử dụng ở đây và thành phần Redis được sử dụng để lưu trữ dữ liệu;
@CacheNamespace(implementation = MybatisCache.class) giao diện công khai ArticleMapper mở rộng BaseMapper { }
Bằng cách triển khai giao diện Cache, bạn có thể xác định chiến lược xử lý của bộ đệm cấp hai. Bạn có thể chạy phương thức trong lớp kiểm tra MybatisTest và phân tích nguyên tắc thực thi của nó. Nó tuân theo chế độ Cache-Aside, tức là truy vấn. bộ nhớ đệm trước, nếu thiếu, hãy truy vấn cơ sở dữ liệu và lưu kết quả vào bộ nhớ đệm, bộ nhớ đệm liên quan sẽ bị xóa khi dữ liệu được cập nhật;
lớp công khai MybatisCache triển khai Cache { riêng tư tĩnh cuối cùng Logger log = LoggerFactory.getLogger(MybatisCache.class); riêng tư RedisTemplate redisTemplate; riêng tư Chuỗi id; công khai MybatisCache (Chuỗi id){ log.info("mybatis...cache...id:{}",id); this.id = id; } công khai RedisTemplate getRedisTemplate(){ nếu(redisTemplate == null) { đồng bộ hóa (MybatisCache.class) { nếu(redisTemplate == null) { redisTemplate = SpringContextUtil.getBean("redisTemplate",RedisTemplate.class); trả về redisTemplate; } trả về redisTemplate; } } trả về redisTemplate; } @Ghi đè công khai Chuỗi getId() { trả về this.id; } @Ghi đè public void putObject(Object key, Object value) { log.info("mybatis...cache...put...key:{},value:{}",key,value); this.getRedisTemplate().opsForValue().set(String.valueOf(key),value,5, TimeUnit.MINUTES); } @Ghi đè public Object getObject(Object key) { log.info("mybatis...cache...get...key:{}",key); return this.getRedisTemplate().opsForValue().get(String.valueOf(key)) ; } @Ghi đè public Object removeObject(Object key) { log.info("mybatis...cache...remove...key:{}",key); return this.getRedisTemplate().delete(String.valueOf(key)); } @Ghi đè public void clear() { Đặt keys = this.getRedisTemplate().keys("*" + id + "*"); if (keys != null && keys.size()>0){ log.info("mybatis...cache...clear...keys:{}",keys); this.getRedisTemplate().delete(keys) ; } } @Ghi đè public int getSize() { Đặt keys = this.getRedisTemplate().keys("*" + id + "*"); if (keys != null){ log.info("mybatis...cache...size...keys:{}",keys.size()); return keys.size() ; } return 0; } }
Kho tài liệu: https://gitee.com/cicadasmile/butte-java-note Kho mã nguồn: https://gitee.com/cicadasmile/butte-spring-parent
Cuối cùng, bài viết về SpringBoot3 tích hợp Redis kết thúc tại đây. Nếu bạn muốn biết thêm về SpringBoot3 tích hợp Redis, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Sự khác biệt giữa xác thực Windows Tích hợp (NTLM) và Windows Tích hợp (Kerberos) là gì? Cách triển khai những điều này trong IIS6 wrt MSDN Câu trả lời hay nhất Kerberos và NTLM
Keycloak là một giải pháp quản lý danh tính và xác thực nguồn mở được viết bằng Java. Nó cung cấp bộ điều hợp nodejs mà tôi có thể tích hợp thành công với express. Đây là tệp định tuyến hợp lệ: 'use strict'
Đây là câu hỏi thứ hai của tôi (Câu hỏi đầu tiên của tôi) về Bamboo. Hiểu biết của tôi sau khi đọc tin nhắn tư vấn là tôi cần một công cụ xây dựng như nAnt hoặc MSbuild để viết một tập lệnh lấy mã nguồn và xây dựng nó (tôi đang phát triển
Các sơ đồ xác thực có sẵn để tích hợp ứng dụng của bên thứ ba với jira 4.3 là gì? Rõ ràng, việc lấy tên người dùng và mật khẩu từ khách hàng nghe có vẻ vô lý. Ngoài ra, tôi biết rằng xác thực oauth chỉ hoạt động với phiên bản 5. Xin vui lòng cho tôi biết. Cảm ơn. tái bút tôi không ở đây
Tôi có một ứng dụng C++ cũ sử dụng DDS để liên lạc/nhắn tin không đồng bộ. Tôi cần tích hợp ứng dụng này vào môi trường JavaEE bằng JMS để nhắn tin. Ngoài việc xây dựng mô-đun cầu nối JMS/DDS độc lập, tôi còn có các
Tôi đang cố gắng gửi tin nhắn thử nghiệm bằng Whatsapp nhưng tôi nhận được thông báo lỗi này: "error":{"code":27,"description">Người nhận không có trên chann
Tôi muốn tích hợp photologue với ứng dụng Django của mình và sử dụng nó để hiển thị ảnh trong kho xe...giống như những gì Boost Motor Group Inc. cung cấp. Tôi đã tích hợp ứng dụng này rồi
Tôi hiện đang cố gắng tìm cách tích hợp với trình quét scansnap fujitsu nhưng không thể tìm thấy bất kỳ chi tiết nào từ fujitsu về cách trình quản lý scansnap fujitsu gọi ứng dụng của bạn và gửi tệp đến ứng dụng của bạn.
Trong dự án của mình, tôi đã sử dụng 9 (chín) int-ip:udp-inbound-channel-adapter và một jms:inbound-channel-adapter. Bộ điều hợp Jms nhận được từ máy chủ
Trong nguyên mẫu hiện tại của chúng tôi, hầu hết các điều khiển HTML tiêu chuẩn đều được thay thế bằng các applet và quan trọng nhất là việc gửi biểu mẫu được kích hoạt bởi các applet. Có cách nào để gọi các hoạt động liên quan ở phía máy chủ như thế này không?
Có thể gửi/nhận tin nhắn văn bản từ whatsapp bằng số twilio không? Có ai đã thử twilio với whatsapp chưa? Tôi hỏi bộ phận chăm sóc khách hàng xem có được không thì anh ấy nói, không chắc lắm nhưng rất nhiều người đã hỏi câu hỏi này. Câu trả lời hay nhất trong trường hợp có người khác đến
Việc kiểm soát phiên bản hầu như không tồn tại trong văn phòng của chúng tôi, điều này rõ ràng gây ra nhiều rắc rối. Chúng tôi muốn thiết lập tính năng này bằng SVN và Notepad++... Có ai có ý tưởng nào về cách đạt được điều này không? Tôi đã bắt đầu nghiên cứu và duyệt trang web này: http://www.sw
Đã từng có một dự án mô-đun lò xo cung cấp khả năng tích hợp như vậy, tuy nhiên, dự án này hiện không còn được dùng nữa. Có ai tiếp tục hỗ trợ tích hợp này bây giờ? Cảm ơn. Câu trả lời hay nhất đang được tiến hành. http://blog.athico.com/sear
Sự hiểu biết của tôi là, theo http://wiki.dbpedia.org/Datasets, DBpedia lấy hệ thống phân cấp lớp từ YAGO chứ không phải các thực thể. .Tuy nhiên, đại loại như http://dbpedia.org/cl
Ai có thể giúp tôi cách tích hợp OpenCMS với ứng dụng web Java Spring không. Đã googled và duyệt nhiều trang web nhưng không có kết quả. Vậy xin hãy giúp tôi. Câu trả lời hay nhất tôi nghĩ là kết hợp SpringMVC với Ope
Tôi đang cố gắng sử dụng nơi nghỉ ngơi di chuyển mới (MPGS) Tôi đã làm theo mã trong url tiếp theo https://ap-gateway.mastercard.com/api/documentation/i
đóng cửa. Câu hỏi này không đáp ứng các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Bạn muốn cải thiện vấn đề này? Câu hỏi được cập nhật để làm cho câu hỏi trở thành chủ đề cho Stack Overflow. Đóng cửa 4 năm trước. Cải thiện điều này
Tôi có một dự án cmake. Tôi muốn dễ dàng thực hiện những thao tác sau để tìm kiếm các khai báo, định nghĩa và tham chiếu của bất kỳ biến, hàm, v.v. dưới con trỏ, có thể được khai báo trong tệp tiêu đề bên ngoài có đường dẫn trong CMakeLists.txt bằng INCLUDE_DIRECTOR
Bất cứ ai có thể chỉ cho tôi hướng thư viện Objective-C (hoặc c/c++) hoặc cho tôi hướng dẫn về cách tải lên hoặc tải xuống qua FTP (Objective-C) không? Sẽ tốt hơn nếu chỉ ra cách tải một tệp xuống một thư mục tạm thời và sau đó tải nó lên sau? Tôi không ngại nhắm mục tiêu
tích hợp() đưa ra câu trả lời rất sai: tích hợp(hàm (x) dnorm(x, -5, 0.07), -Inf, Inf, subdivisions = 10000L) #2.127
Tôi là một lập trình viên xuất sắc, rất giỏi!