mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-11-03 23:14:13 +00:00 
			
		
		
		
	perf(server): reduce db query
This commit is contained in:
		
							parent
							
								
									aebd77ad38
								
							
						
					
					
						commit
						eb9e6d230f
					
				
					 2 changed files with 24 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -28,11 +28,22 @@ export class Cache<T> {
 | 
			
		|||
		this.cache.delete(key);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public async fetch(key: string | null, fetcher: () => Promise<T>): Promise<T> {
 | 
			
		||||
	/**
 | 
			
		||||
	 * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します
 | 
			
		||||
	 * optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします
 | 
			
		||||
	 */
 | 
			
		||||
	public async fetch(key: string | null, fetcher: () => Promise<T>, validator?: (cachedValue: T) => boolean): Promise<T> {
 | 
			
		||||
		const cachedValue = this.get(key);
 | 
			
		||||
		if (cachedValue !== undefined) {
 | 
			
		||||
			// Cache HIT
 | 
			
		||||
			return cachedValue;
 | 
			
		||||
			if (validator) {
 | 
			
		||||
				if (validator(cachedValue)) {
 | 
			
		||||
					// Cache HIT
 | 
			
		||||
					return cachedValue;
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				// Cache HIT
 | 
			
		||||
				return cachedValue;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Cache MISS
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,10 @@ import { awaitAll, Promiseable } from '@/prelude/await-all.js';
 | 
			
		|||
import { populateEmojis } from '@/misc/populate-emojis.js';
 | 
			
		||||
import { getAntennas } from '@/misc/antenna-cache.js';
 | 
			
		||||
import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const.js';
 | 
			
		||||
import { Cache } from '@/misc/cache.js';
 | 
			
		||||
import { Instance } from '../entities/instance.js';
 | 
			
		||||
 | 
			
		||||
const userInstanceCache = new Cache<Instance | null>(1000 * 60 * 60 * 3);
 | 
			
		||||
 | 
			
		||||
type IsUserDetailed<Detailed extends boolean> = Detailed extends true ? Packed<'UserDetailed'> : Packed<'UserLite'>;
 | 
			
		||||
type IsMeAndIsUserDetailed<ExpectsMe extends boolean | null, Detailed extends boolean> =
 | 
			
		||||
| 
						 | 
				
			
			@ -254,8 +258,11 @@ export class UserRepository extends Repository<User> {
 | 
			
		|||
			isModerator: user.isModerator || falsy,
 | 
			
		||||
			isBot: user.isBot || falsy,
 | 
			
		||||
			isCat: user.isCat || falsy,
 | 
			
		||||
			showTimelineReplies: user.showTimelineReplies || falsy,
 | 
			
		||||
			instance: user.host ? Instances.findOne({ host: user.host }).then(instance => instance ? {
 | 
			
		||||
			// TODO: typeorm 3.0にしたら .then(x => x || null) は消せる
 | 
			
		||||
			instance: user.host ? userInstanceCache.fetch(user.host,
 | 
			
		||||
				() => Instances.findOne({ host: user.host }).then(x => x || null),
 | 
			
		||||
				v => v != null
 | 
			
		||||
			).then(instance => instance ? {
 | 
			
		||||
				name: instance.name,
 | 
			
		||||
				softwareName: instance.softwareName,
 | 
			
		||||
				softwareVersion: instance.softwareVersion,
 | 
			
		||||
| 
						 | 
				
			
			@ -334,6 +341,7 @@ export class UserRepository extends Repository<User> {
 | 
			
		|||
				mutedInstances: profile!.mutedInstances,
 | 
			
		||||
				mutingNotificationTypes: profile!.mutingNotificationTypes,
 | 
			
		||||
				emailNotificationTypes: profile!.emailNotificationTypes,
 | 
			
		||||
				showTimelineReplies: user.showTimelineReplies || falsy,
 | 
			
		||||
			} : {}),
 | 
			
		||||
 | 
			
		||||
			...(opts.includeSecrets ? {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue