Redis والجلسات#
يمكن أن يعمل Redis كمزوّد تخزين للتخزين المؤقت لـ بيانات الجلسة مثل بيانات اعتماد المستخدم.
إذا لم يُوفَّر RedisSessionsDelegate مخصص، فسيُستخدم واحد افتراضي.
السلوك الافتراضي#
إنشاء SessionID#
ما لم تُنفّذ الدالة makeNewID() في RedisSessionsDelegate الخاص بك، فستُنشأ جميع قيم SessionID بالقيام بما يلي:
توليد 32 بايت من الأحرف العشوائية
ترميز القيمة بترميز base64
على سبيل المثال: Hbxozx8rTj+XXGWAzOhh1npZFXaGLpTWpWCaXuo44xQ=
تخزين SessionData#
سيخزّن التنفيذ الافتراضي لـ RedisSessionsDelegate بيانات SessionData كقيمة نصية JSON بسيطة باستخدام Codable.
ما لم تُنفّذ الدالة makeRedisKey(for:) في RedisSessionsDelegate الخاص بك، فستُخزَّن SessionData في Redis بمفتاح يسبق SessionID بالبادئة vrs- (Vapor Redis Sessions)
على سبيل المثال: vrs-Hbxozx8rTj+XXGWAzOhh1npZFXaGLpTWpWCaXuo44xQ=
تسجيل مندوب مخصص#
لتخصيص كيفية قراءة البيانات من Redis وكتابتها إليه، سجّل كائن RedisSessionsDelegate الخاص بك كما يلي:
import Redis
struct CustomRedisSessionsDelegate: RedisSessionsDelegate {
// implementation
}
app.sessions.use(.redis(delegate: CustomRedisSessionsDelegate()))
RedisSessionsDelegate#
توثيق واجهة برمجة التطبيقات:
RedisSessionsDelegate
يمكن استخدام كائن مطابق لهذا البروتوكول لتغيير كيفية تخزين SessionData في Redis.
لا يلزم سوى تنفيذ دالتين من قِبل النوع المطابق للبروتوكول: redis(_:store:with:) وredis(_:fetchDataFor:).
كلتاهما مطلوبة، لأن الطريقة التي تخصّص بها كتابة بيانات الجلسة إلى Redis مرتبطة جوهريًا بكيفية قراءتها من Redis.
مثال Hash لـ RedisSessionsDelegate#
على سبيل المثال، إذا أردت تخزين بيانات الجلسة كـ Hash في Redis، فستُنفّذ شيئًا كالتالي:
func redis<Client: RedisClient>(
_ client: Client,
store data: SessionData,
with key: RedisKey
) -> EventLoopFuture<Void> {
// stores each data field as a separate hash field
return client.hmset(data.snapshot, in: key)
}
func redis<Client: RedisClient>(
_ client: Client,
fetchDataFor key: RedisKey
) -> EventLoopFuture<SessionData?> {
return client
.hgetall(from: key)
.map { hash in
// hash is [String: RESPValue] so we need to try and unwrap the
// value as a string and store each value in the data container
return hash.reduce(into: SessionData()) { result, next in
guard let value = next.value.string else { return }
result[next.key] = value
}
}
}