sách gpt4 ăn đã đi

SpringBoot3 tích hợp Redis

In lại Tác giả: Tôi là chú chim nhỏ Thời gian cập nhật: 2023-08-15 14:31:43 28 4
mua khóa gpt4 giày nike

Mục lục
  • 1. Giới thiệu
  • 2. Xây dựng công trình
    • 1. Kết cấu kỹ thuật
    • 2. Quản lý phụ thuộc
    • 3. Cấu hình Redis
  • 3. Cách sử dụng Redis
    • 1. Thiết lập môi trường
    • 2. Kiểu dữ liệu
    • 3. Cơ chế khóa
  • 4. Bộ đệm Mybatis
    • 1. Cấu hình cơ bản
    • 2. Triển khai tùy chỉnh
  • 5. Mã nguồn tham khảo

Nhãn: Redis.Mybatis.Lock;

1. Giới thiệu

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;

2. Xây dựng công trình

1. Kết cấu kỹ thuật

2. Quản lý phụ thuộc

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} 

                        
                      

3. Cấu hình Redis

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

                        
                      

3. Cách sử dụng Redis

1. Thiết lập môi trường

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

                        
                      

2. Kiểu dữ liệu

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

                        
                      

3. Cơ chế khóa

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

                        
                      

4. Bộ đệm Mybatis

1. Cấu hình cơ bản

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
{ }

2. Triển khai tùy chỉnh

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

                        
                      

5. Mã nguồn tham khảo

                        
                          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! .

28 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
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