Banyak projek di Dachang digunakan pada berbilang pelayan ini wujud di pelbagai wilayah Apabila kami mengakses perkhidmatan, walaupun perkhidmatan yang sama dilaksanakan, ia mungkin dijalankan pada pelayan yang berbeza ;
Saya menemui senario log masuk seperti saya belajar projek. sama ada pengguna log masuk:
Dengan andaian log masuk ini dilakukan melalui pelayan 01, maka maklumat sesi log masuk kali ini disimpan dalam memori 01 tetapi apabila saya melawat semula , ia dilaksanakan oleh operasi pelayan 02, tetapi maklumat sesi log masuk berada dalam memori 01, dan pelayan 02 tidak dapat memperolehnya, jadi ia akan menilai bahawa saya tidak log masuk dan mengembalikan maklumat yang salah...
Apa yang ingin kami capai ialah melalui sesi yang dihasilkan oleh log masuk pelayan boleh dikongsi dengan pelayan lain , jadi bagaimana untuk mencapai ini?
Penyelesaian Ideanya ialah memandangkan memori pelayan ini tidak dapat dikongsi, maka selagi ada ruang yang dikongsi untuk pelayan ini mengakses bersama-sama (seperti yang ditunjukkan dalam gambar);
Perkara pertama yang terlintas di fikiran ialah pangkalan data Selagi kluster pelayan ini berkongsi pangkalan data dan menyimpan maklumat sesi yang dijana dalam pangkalan data, ia akan mencukupi supaya semua orang boleh mengaksesnya; Pangkalan data termasuk hubungan dan bukan hubungan (NoSql):
Pangkalan data hubungan: Mysql, dll.
Bukan -pangkalan data hubungan: Redis (pangkalan data K /V), dsb.
Malah, sebaiknya pilih pangkalan data bukan hubungan di sini, kerana Redis berdasarkan memori dan mempunyai prestasi baca dan tulis, yang sangat sesuai untuk situasi ini di mana maklumat pengguna kerap dibaca;
Ia juga boleh dilaksanakan melalui pelayan fail, yang tidak akan diperkenalkan di sini
Ada; kaedah lain, yang boleh dilaksanakan melalui iphash daripada nginx Kaedah ini sangat mudah, tetapi ideanya berbeza daripada dua di atas Prinsip Iaitu, semua permintaan untuk IP yang sama akan dikira oleh nginx, dan hasilnya akan terikat kepada pelayan yang ditentukan Selepas itu, permintaan ini akan mengakses pelayan.
Tetapi terdapat beberapa masalah dengan ini Pertama sekali, pengimbangan beban tidak masuk akal Jika pelayan terikat, maka iphash akan menjadi tidak sah; atau permintaan anda akan diedarkan oleh perkhidmatan lain dan bukannya perkhidmatan nginx . , maka iphash juga tidak akan berkuat kuasa; jadi gunakannya dengan berhati-hati; 🎜>Berikut adalah satu projek pengurusan Pengguna, kod logik log masuk akan merekodkan maklumat sesi pengguna log masuk semasa log masuk:
Perkhidmatan ini mempunyai dua antara muka berikut: (Ujian berikut diuji dalam perkhidmatan yang sama) Antara muka log masuk: rekod maklumat sesi pengguna log masuk Ujian log masuk: Dapatkan antara muka maklumat pengguna semasa: Dapatkan maklumat pengguna semasa melalui sesi log masuk
Dapatkan ujian maklumat pengguna log masuk semasa: Oleh kerana ini adalah dua perkhidmatan sekarang, pastinya tidak mungkin untuk berkongsi sesi Walaupun perkhidmatan dihidupkan port 8080 dilog masuk, perkhidmatan pada port 8082 tidak boleh dilog masuk. Dapatkan maklumat pengguna semasa (saya tekankan sekali lagi: ujian di atas boleh mendapatkan maklumat pengguna semasa kerana ia diuji dalam perkhidmatan yang sama. Sudah tentu, yang sama; sesi perkhidmatan disimpan dalam ingatannya sendiri dan boleh diakses dengan sendirinya) Operasi khusus
Berikut adalah untuk melaksanakan sesi kongsi melalui konfigurasi redis:
Muat turun redis pertama dan cari tutorial dalam talian; di sini saya terus menggunakan bekas redis yang dibuat oleh docker pada pelayan (mudah dan mudah digunakan, sangat disyorkan):
Anda boleh menyambungkannya melalui alat visual:
Dengan cara ini, redis dikonfigurasikan sekarang dalam kod projek:
Perkenalkan pergantungan redis ke. projek Bergantung pada konfigurasi sesi musim bunga (menyimpan sesi secara automatik dalam redis):
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.6.4</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>2.6.3</version> </dependency>
Konfigurasikan redis sambungan dan konfigurasi berkaitan sesi dalam fail application.yml:
spring: # session配置 session: timeout: 86400 # 设置session失效时间 store-type: redis # 修改spring-session存储配置,默认存储到服务器内存中,现在设置存到redis中(关键) # redis配置 redis: port: 8081 # redis的端口号(这里是我的redis容器在docker中对应的端口号) host: xx.xxx.xxx.xxx # 我的云服务器ip database: 0 # 设置存入redis的哪一个库(默认是0)
Malah , hanya terdapat satu konfigurasi kunci: store-type: redis, selagi ini dikonfigurasikan, sesi dalam kod akan disimpan dalam redis dan bukannya memorinya sendiri
Kemudian anda boleh menguji:
Panggil antara muka log masuk , jana maklumat sesi pengguna, semak semula:
Anda boleh melihat bahawa sesi log masuk pengguna telah disimpan dalam redis, jadi saya log masuk di port 8080 dan juga boleh mendapatkannya di 8082 Maklumat sesi Log masuk:
Log Masuk:
Dapatkan maklumat:
Cara ini melalui redis Capai perkongsian sesi;
Nota: pengenalan versi pergantungan redis dan spring-redis perlu hampir.
Atas ialah kandungan terperinci Apakah kaedah untuk redis melaksanakan perkongsian sesi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!