


Bagaimana untuk menggunakan Redis dalam Node.js? Ternyata ia semudah itu!
Bagaimana untuk menggunakan Redis dalam
Nod? Artikel berikut akan memperkenalkan kepada anda cara menggunakan Redis dalam Node.js Anda akan mendapati bahawa ia sangat mudah saya harap ia akan membantu anda.
Dalam artikel sebelum ini, kami sebenarnya meninggalkan dua tempat yang boleh dioptimumkan dengan redis
:
- Satu adalah log masuk kami Pada masa ini , pelayan telah melaksanakan
JWT
untuk menjanatoken
dan mengesahkan maklumattoken
yang dihantar oleh pelanggan. [Tutorial berkaitan yang disyorkan: tutorial video nodejs, Video pengaturcaraan] - melaksanakan fungsi menyukai artikel dengan menulis data seperti itu terus ke dalam pangkalan data
JWT token
Kaedah pelaksanaan adalah untuk meletakkan maklumat asas terus dalam token
untuk memudahkan penggunaan sistem yang diedarkan, tetapi kami tidak menetapkan tempoh terhad (ini boleh dicapai), dan pelayan tidak boleh mengambil inisiatif Biarkan token
gagal. Redis secara semula jadi menyokong masa tamat tempoh, dan juga boleh membenarkan pelayan tamat tempoh secara aktif token
.
Sudah tentu, ini tidak bermakna bahawa token JWT tidak sebaik pelaksanaan token redis Ia bergantung pada senario penggunaan di sini kita tidak membincangkan yang mana lebih baik, tetapi hanya menyediakan penyelesaian pelaksanaan untuk dibiarkan semua orang tahu bagaimana untuk melaksanakannya.
1. Kenali redis
Bagi rakan-rakan hadapan, Redis mungkin agak asing, mari kita kenali
Redis is What
Redis ialah sistem storan struktur data berasaskan memori (berlesen BSD), ia boleh digunakan sebagai pangkalan data, cache dan perisian tengah mesej pangkalan data NoSQL yang popular sekarang.
Ia mempunyai ciri-ciri berikut:
- Kelajuan pantas
- Satu nod boleh membaca 110,000 kali/s dan menulis 81,000 kali/s
- Berjalan berdasarkan memori , prestasi tinggi
- Dilaksanakan dalam bahasa C, lebih dekat dengan sistem pengendalian
- Kegigihan
- Kemas kini data akan disimpan secara tidak segerak ke cakera keras (RDB dan AOF
- Struktur data berbilang
- bukan sahaja menyokong data jenis nilai kunci ringkas
- tetapi juga menyokong: rentetan, cincang, senarai, Set, set tersusun
- Sokong berbilang bahasa pengaturcaraan, dsb.
Redis senario penggunaan biasa
Caching
Caching boleh dikatakan sebagai salah satu fungsi Redis yang paling biasa digunakan Caching yang munasabah bukan sahaja dapat mempercepatkan akses, tetapi juga mengurangkan tekanan pada pangkalan data bahagian belakang
. Sistem ranking
Menggunakan ciri-ciri senarai Redis dan koleksi yang dipesan, sistem ranking boleh dibuat pada masa ini di pusat membeli-belah, berita, blog , dsb.
Aplikasi pembilang
Aplikasi pembilang pada asasnya adalah sama dengan sistem pemeringkatan, yang merupakan keperluan biasa kebanyakan tapak web, seperti kiraan permainan daripada laman web video Bilangan paparan di laman web e-dagang, dsb., tetapi angka ini secara amnya agak besar Jika disimpan dalam pangkalan data hubungan, ia masih akan menjadi cabaran besar kepada MySQL atau pangkalan data hubungan lain, dan Redis pada asasnya boleh. dikatakan secara semula jadi menyokong aplikasi kaunter
(Video langsung) rentetan mesej
Senarai pengguna dalam talian, kedudukan hadiah, mesej rentak dan maklumat lain dalam bilik siaran langsung. semuanya sesuai untuk penyimpanan menggunakan struktur SortedSet dalam Redis membuat pemprosesan mesej lebih mudah untuk Redis. Senario aplikasi adalah lebih daripada ini >Saya tidak akan memperkenalkan pemasangan dan penggunaan mudah Redis satu persatu di sini. Berikut adalah dua artikel yang saya tulis sebelum ini:
ZREVRANGEBYSCORE
zpopmax
Pemasangan Rediszpopmin
Bermula dengan Redis - Penggunaan Asas
Anda boleh memasang, memahami jenis data Redis dan arahan yang biasa digunakan
- Pelanggan visualDigunakan di bawah Windows RedisClient
- , di bawah mac anda boleh menggunakanRedis Desktop Manager
untuk menjalankannya
Selepas bermula, klik <.>
Selepas menyambung, anda boleh melihat keadaan keseluruhan:
Tidak seperti data jenis SQL, redis tidak menyediakan operasi mencipta pangkalan data baharu kerana ia disertakan dengan 16 (0 -15) pangkalan data (0 pangkalan data digunakan secara lalai). Dalam perpustakaan yang sama, kunci adalah satu-satunya yang wujud dan tidak dibenarkan untuk diulang. Ia seperti "kunci" dan hanya boleh membuka satu "kunci". Intipati storan nilai kunci ialah menggunakan kunci untuk mengenal pasti nilai Apabila anda ingin mendapatkan semula nilai, anda mesti menggunakan kunci yang sepadan dengan nilai untuk mencari
Pengetahuan Redis adalah prasyarat untuk artikel tersebut penghujung artikel. Mari kita ke intinya~
Artikel ini terutamanya menggunakan Redis untuk melaksanakan fungsi caching.
2. Menggunakan
dalam Versi Nest.js:
库 | 版本 |
---|---|
Nest.js | V8.1.2 |
adalah berdasarkan versi Nest.js 8.x
, yang berbeza daripada versi Nest.js 9.x
Artikel berikut secara khusus menyusun arahan tentang perbezaan antara kedua-dua versi dan cara meningkatkan daripada V8
kepada V9
. . Ini adalah Tetapi jangan terlalu membincangkannya.
Pertama, kami menyambungkan Redis dalam projek Nest.js Parameter yang diperlukan untuk menyambungkan Redis:
REDIS_HOST:Redis 域名 REDIS_PORT:Redis 端口号 REDIS_DB: Redis 数据库 REDIS_PASSPORT:Redis 设置的密码
Tulis parameter ke dalam fail konfigurasi .env
dan .env.prod
: <.>
npm install cache-manager --save npm install cache-manager-redis-store --save npm install @types/cache-manager -D
Menyediakan API bersatu untuk pelbagai storan cache Storan data terbina dalam adalah dalam memori, tetapi anda juga boleh menggunakan Nest
untuk menggunakan penyelesaian lain, seperti menggunakan cache-manager
untuk cache. Redis
dan panggil ConfigModule
atau register()
menghantar parameter konfigurasi respons. registerAsync()
dan laksanakannya seperti berikut: src/db/redis-cache.module.ts
import { ConfigModule, ConfigService } from '@nestjs/config'; import { RedisCacheService } from './redis-cache.service'; import { CacheModule, Module, Global } from '@nestjs/common'; import * as redisStore from 'cache-manager-redis-store'; @Module({ imports: [ CacheModule.registerAsync({ isGlobal: true, imports: [ConfigModule], inject: [ConfigService], useFactory: async (configService: ConfigService) => { return { store: redisStore, host: configService.get('REDIS_HOST'), port: configService.get('REDIS_PORT'), db: 0, //目标库, auth_pass: configService.get('REDIS_PASSPORT') // 密码,没有可以不写 }; }, }), ], providers: [RedisCacheService], exports: [RedisCacheService], }) export class RedisCacheModule {}
- kaedah
CacheModule
menggunakan konfigurasi Redis Store untuk berkomunikasiregisterAsync
- nilai atribut
store
, menunjukkan atribut 'cache-manager-redis-store'redisStore
- atribut ditetapkan kepada
isGlobal
untuk mengisytiharkannya sebagai modul global, apabila kita masukkantrue
dalam Apabila diimport ke dalamRedisCacheModule
, modul lain boleh digunakan terus tanpa mengimport lagiAppModule
Memandangkan maklumat Redis ditulis dalam fail konfigurasi, kaedah - digunakan untuk memproses data tak segerak. . Jika ia adalah data statik, anda boleh Gunakan
registerAsync()
register
baharu dan laksanakan bacaan dan penulisan cache dalam perkhidmatan redis-cache.service.ts
import { Injectable, Inject, CACHE_MANAGER } from '@nestjs/common'; import { Cache } from 'cache-manager'; @Injectable() export class RedisCacheService { constructor( @Inject(CACHE_MANAGER) private cacheManager: Cache, ) {} cacheSet(key: string, value: string, ttl: number) { this.cacheManager.set(key, value, { ttl }, (err) => { if (err) throw err; }); } async cacheGet(key: string): Promise<any> { return this.cacheManager.get(key); } }Seterusnya. , import
dalam app.module.ts
iaitu Boleh. RedisCacheModule
Laraskan proses pengeluaran dan pengesahan token
Kami menggunakan redis untuk melaksanakan pemprosesan tamat tempoh token, pembaharuan token automatik dan log masuk pengguna unik.- Pemprosesan tamat tempoh: masukkan maklumat pengguna dan token ke dalam redis, dan tetapkan masa tamat tempoh
- Pembaharuan automatik token: masa tamat tempoh token ialah 30 minit, jika dalam 30 minit ini Jika ada tiada operasi, log masuk semula Jika terdapat operasi dalam masa 30 minit, token akan diperbaharui secara automatik untuk masa baharu untuk mengelakkan terputus sambungan semasa digunakan.
- Log masuk unik untuk setiap pengguna: akaun yang sama, log masuk komputer berbeza, pengguna yang log masuk dahulu akan ditolak ke luar talian oleh pengguna yang log masuk kemudian
// auth.service.ts async login(user: Partial<User>) { const token = this.createToken({ id: user.id, username: user.username, role: user.role, }); + await this.redisCacheService.cacheSet( + `${user.id}&${user.username}&${user.role}`, + token, + 1800, + ); return { token }; }Apabila mengesahkan token, dapatkan token daripada redis Jika anda tidak dapat mendapatkan token, token itu mungkin telah tamat tempoh.
// jwt.strategy.ts + import { RedisCacheService } from './../core/db/redis-cache.service'; export class JwtStrategy extends PassportStrategy(Strategy) { constructor( @InjectRepository(User) private readonly userRepository: Repository<User>, private readonly authService: AuthService, private readonly configService: ConfigService, + private readonly redisCacheService: RedisCacheService, ) { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), secretOrKey: configService.get('SECRET'), + passReqToCallback: true, } as StrategyOptions); } async validate(req, user: User) { + const token = ExtractJwt.fromAuthHeaderAsBearerToken()(req); + const cacheToken = await this.redisCacheService.cacheGet( + `${user.id}&${user.username}&${user.role}`, + ); + if (!cacheToken) { + throw new UnauthorizedException('token 已过期'); + } const existUser = await this.authService.getUser(user); if (!existUser) { throw new UnauthorizedException('token不正确'); } return existUser; } }
Log masuk pengguna sahaja
Apabila pengguna log masuk, setiap token baharu yang dikeluarkan akan menimpa token sebelumnya dan menentukan token dan permintaan dalam redis Semak sama ada token masuk adalah sama. Jika ia tidak sama, mungkin anda telah log masuk di tempat lain, dan ralat token akan digesa.// jwt.strategy.ts async validate(req, user: User) { const token = ExtractJwt.fromAuthHeaderAsBearerToken()(req); const cacheToken = await this.redisCacheService.cacheGet( `${user.id}&${user.username}&${user.role}`, ); if (!cacheToken) { throw new UnauthorizedException('token 已过期'); } + if (token != cacheToken) { + throw new UnauthorizedException('token不正确'); + } const existUser = await this.authService.getUser(user); if (!existUser) { throw new UnauthorizedException('token不正确'); } return existUser; }
Token diperbaharui secara automatik
Terdapat banyak pilihan pelaksanaan, anda boleh menjana jwt di latar belakang (jwt sah selama 30 minit) dan access_token
, lebih lama daripada refresh_token
Pelanggan menyimpan dua token ini Apabila refresh_token
tamat tempoh, pelanggan membawa access_token
untuk mendapatkan access_token
yang baharu. Penyelesaian ini memerlukan kerjasama pembangun panggilan antara muka. refresh_token
access_token
Saya terutamanya akan memperkenalkan di sini pembaharuan automatik token yang dilaksanakan oleh backend tulen
Proses pelaksanaan:
①: Apabila jwt menjana token, tempoh sah adalah tetapkan untuk menggunakan Tiada tamat tempoh- ②: Tetapkan tempoh sah kepada 30 minit apabila redis cache token
- ③: Apabila pengguna membawa permintaan token, jika kunci wujud dan nilainya ialah sama, tempoh sah ditetapkan semula kepada 30 minit
- Tetapkan token yang dijana oleh jwt dan ia tidak akan tamat tempoh kod ini dalam fail
Siri Praktikal Nest.js Bahagian 2 - Melaksanakan Pendaftaran dan Mengimbas Log masuk Kod QR, pengesahan jwt auth.module.ts
// auth.module.ts const jwtModule = JwtModule.registerAsync({ inject: [ConfigService], useFactory: async (configService: ConfigService) => { return { secret: configService.get('SECRET', 'test123456'), - signOptions: { expiresIn: '4h' }, // 取消有效期设置 }; }, });yang digunakan tidak mengemas kini tempoh sah secara langsung, ia dicapai dengan menetapkan semula:
cache-manager
// jwt.strategy.ts async validate(req, user: User) { const token = ExtractJwt.fromAuthHeaderAsBearerToken()(req); const cacheToken = await this.redisCacheService.cacheGet( `${user.id}&${user.username}&${user.role}`, ); if (!cacheToken) { throw new UnauthorizedException('token 已过期'); } if (token != cacheToken) { throw new UnauthorizedException('token不正确'); } const existUser = await this.authService.getUser(user); if (!existUser) { throw new UnauthorizedException('token不正确'); } + this.redisCacheService.cacheSet( + `${user.id}&${user.username}&${user.role}`, + token, + 1800, + ); return existUser; }
Selain menggunakan kaedah yang disyorkan secara rasmi dalam Nest, anda juga boleh menggunakan
untuk mencapainya Jika anda ingin menyimpan token apabila anda ingin menyimpan struktur, apabila anda menggunakan nestjs-redis
, anda akan mendapati tiada kaedah deposit dan pengeluaran nilai Menyediakan hash
(ia memerlukan sedikit usaha untuk mengetahui). cache-manager-redis-store
Nota: Jika anda menggunakan
nest-redis
untuk melaksanakan caching redis, ralat akan dilaporkan di bawah versi Nest.js 8, Rakan boleh menggunakan@chenjm/nestjs-redis
sebaliknya, atau merujuk kepada penyelesaian tentang isu: Pepijat Nest 8 redis.
Ringkasan
Alamat kod sumber: https://github.com/koala-coding/nest-blog
Lebih banyak pengaturcaraan berkaitan Untuk pengetahuan, sila layari: Pengajaran Pengaturcaraan! !
Atas ialah kandungan terperinci Bagaimana untuk menggunakan Redis dalam Node.js? Ternyata ia semudah itu!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Ya, teras enjin JavaScript ditulis dalam C. 1) Bahasa C menyediakan prestasi yang efisien dan kawalan asas, yang sesuai untuk pembangunan enjin JavaScript. 2) Mengambil enjin V8 sebagai contoh, terasnya ditulis dalam C, menggabungkan kecekapan dan ciri-ciri berorientasikan objek C. 3) Prinsip kerja enjin JavaScript termasuk parsing, penyusun dan pelaksanaan, dan bahasa C memainkan peranan penting dalam proses ini.

JavaScript adalah di tengah -tengah laman web moden kerana ia meningkatkan interaktiviti dan dinamik laman web. 1) Ia membolehkan untuk menukar kandungan tanpa menyegarkan halaman, 2) memanipulasi laman web melalui Domapi, 3) menyokong kesan interaktif kompleks seperti animasi dan drag-and-drop, 4) mengoptimumkan prestasi dan amalan terbaik untuk meningkatkan pengalaman pengguna.

C dan JavaScript mencapai interoperabilitas melalui webassembly. 1) Kod C disusun ke dalam modul WebAssembly dan diperkenalkan ke dalam persekitaran JavaScript untuk meningkatkan kuasa pengkomputeran. 2) Dalam pembangunan permainan, C mengendalikan enjin fizik dan rendering grafik, dan JavaScript bertanggungjawab untuk logik permainan dan antara muka pengguna.

JavaScript digunakan secara meluas di laman web, aplikasi mudah alih, aplikasi desktop dan pengaturcaraan sisi pelayan. 1) Dalam pembangunan laman web, JavaScript mengendalikan DOM bersama -sama dengan HTML dan CSS untuk mencapai kesan dinamik dan menyokong rangka kerja seperti JQuery dan React. 2) Melalui reaktnatif dan ionik, JavaScript digunakan untuk membangunkan aplikasi mudah alih rentas platform. 3) Rangka kerja elektron membolehkan JavaScript membina aplikasi desktop. 4) Node.js membolehkan JavaScript berjalan di sisi pelayan dan menyokong permintaan serentak yang tinggi.

Python lebih sesuai untuk sains data dan automasi, manakala JavaScript lebih sesuai untuk pembangunan front-end dan penuh. 1. Python berfungsi dengan baik dalam sains data dan pembelajaran mesin, menggunakan perpustakaan seperti numpy dan panda untuk pemprosesan data dan pemodelan. 2. Python adalah ringkas dan cekap dalam automasi dan skrip. 3. JavaScript sangat diperlukan dalam pembangunan front-end dan digunakan untuk membina laman web dinamik dan aplikasi satu halaman. 4. JavaScript memainkan peranan dalam pembangunan back-end melalui Node.js dan menyokong pembangunan stack penuh.

C dan C memainkan peranan penting dalam enjin JavaScript, terutamanya digunakan untuk melaksanakan jurubahasa dan penyusun JIT. 1) C digunakan untuk menghuraikan kod sumber JavaScript dan menghasilkan pokok sintaks abstrak. 2) C bertanggungjawab untuk menjana dan melaksanakan bytecode. 3) C melaksanakan pengkompil JIT, mengoptimumkan dan menyusun kod hot-spot semasa runtime, dan dengan ketara meningkatkan kecekapan pelaksanaan JavaScript.

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Dreamweaver Mac版
Alat pembangunan web visual

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

MantisBT
Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Dreamweaver CS6
Alat pembangunan web visual
