Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

ASP.NET Core कैशिंग में महारत हासिल करें: Redis, इन-मेमोरी और डिस्ट्रिब्यूटेड पैटर्न पीक प्रदर्शन के लिए - भाग 27

ASP.NET Core कैशिंग में महारत हासिल करें: Redis, इन-मेमोरी और डिस्ट्रिब्यूटेड पैटर्न पीक प्रदर्शन के लिए - भाग 27

पिछला लेख: ASP.NET Core प्रदर्शन हैक्स: Async, प्रोफाइलिंग और ऑप्टिमाइज़ेशन तकनीकें (भाग - 40 में से 26)

विषय सूची

  1. कैशिंग क्रांति
  2. कैशिंग फंडामेंटल्स और आर्किटेक्चर
  3. इन-मेमोरी कैशिंग डीप डाइव
  4. Redis के साथ डिस्ट्रिब्यूटेड कैशिंग
  5. रिस्पांस कैशिंग रणनीतियाँ
  6. रियल-वर्ल्ड ई-कॉमर्स कैशिंग
  7. कैश अमान्यता पैटर्न
  8. प्रदर्शन निगरानी और एनालिटिक्स
  9. उन्नत कैशिंग पैटर्न
  10. सुरक्षा और सर्वोत्तम अभ्यास
  11. कैशिंग रणनीतियों का टेस्टिंग
  12. प्रोडक्शन डिप्लॉयमेंट

1. कैशिंग क्रांति

क्यों कैशिंग आपका प्रदर्शन सिल्वर बुलेट है

कैशिंग डेटाबेस लोड को कम करके, प्रतिक्रिया समय घटाकर, और स्केलेबिलिटी में सुधार करके एप्लिकेशन प्रदर्शन को बदल देती है। आधुनिक वेब एप्लिकेशन में, कैशिंग सिर्फ एक ऑप्टिमाइज़ेशन नहीं है—यह एक आवश्यकता है।

वास्तविक जीवन की उपमा: एक व्यस्त कॉफी शॉप की कल्पना करें। कैशिंग के बिना, हर ग्राहक ऑर्डर के लिए आवश्यक होगा:

  • सप्लायर वेयरहाउस जाना (डेटाबेस)
  • बीन्स चुनना (क्वेरी निष्पादन)
  • ताजा पीसना (डेटा प्रोसेसिंग)
  • व्यक्तिगत रूप से ब्रू करना (प्रतिक्रिया जनरेशन)

कैशिंग के साथ, लोकप्रिय ड्रिंक्स प्री-पेयर्ड होते हैं और तुरंत सर्व करने के लिए तैयार!

// प्रदर्शन प्रभाव प्रदर्शन
public class ProductServiceWithoutCaching {
    private readonly ApplicationDbContext _context;
    public async Task<Product> GetProductAsync(int id) {
        // हर कॉल डेटाबेस को हिट करता है - धीमा!
        return await _context.Products
            .Include(p => p.Category)
            .Include(p => p.Reviews)
            .FirstOrDefaultAsync(p => p.Id == id);
    }
}
public class ProductServiceWithCaching {
    private readonly ApplicationDbContext _context;
    private readonly IMemoryCache _cache;
    public async Task<Product> GetProductAsync(int id) {
        // पहले कैश ट्राई करें - तेज़!
        if (_cache.TryGetValue($"product_{id}", out Product product)) return product;
        // कैश मिस - डेटाबेस से प्राप्त करें
        product = await _context.Products
            .Include(p => p.Category)
            .Include(p => p.Reviews)
            .FirstOrDefaultAsync(p => p.Id == id);
        // भविष्य के अनुरोधों के लिए कैश में स्टोर करें
        _cache.Set($"product_{id}", product, TimeSpan.FromMinutes(30));
        return product;
    }
}

कैशिंग प्रदर्शन प्रभाव

परिदृश्य कैशिंग के बिना कैशिंग के साथ सुधार
डेटाबेस क्वेरीज़ 1000 क्वेरीज़/सेकंड 50 क्वेरीज़/सेकंड 20x कमी
प्रतिक्रिया समय 200ms 5ms 40x तेज़
सर्वर लोड 80% CPU 20% CPU 4x कमी
लागत $1000/माह $250/माह 75% बचत

2. कैशिंग फंडामेंटल्स और आर्किटेक्चर

कैशिंग आर्किटेक्चर पैटर्न

// व्यापक कैशिंग सर्विस इंटरफेस
public interface ICacheService {
    Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory, TimeSpan? expiration = null);
    Task<T> GetAsync<T>(string key);
    Task SetAsync<T>(string key, T value, TimeSpan? expiration = null);
    Task RemoveAsync(string key);
    Task<bool> ExistsAsync(string key);
    Task RemoveByPatternAsync(string pattern);
}
// एकाधिक कैश प्रोवाइडर्स का समर्थन करने वाला कार्यान्वयन
public class CacheService : ICacheService {
    private readonly IMemoryCache _memoryCache;
    private readonly IDistributedCache _distributedCache;
    private readonly ILogger<CacheService> _logger;
    private readonly CacheSettings _settings;
    public CacheService(IMemoryCache memoryCache, IDistributedCache distributedCache, ILogger<CacheService> logger, IOptions<CacheSettings> settings) {
        _memoryCache = memoryCache;
        _distributedCache = distributedCache;
        _logger = logger;
        _settings = settings.Value;
    }
    public async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory, TimeSpan? expiration = null) {
        try {
            // पहले मेमोरी कैश ट्राई करें (सबसे तेज़)
            if (_memoryCache.TryGetValue(key, out T cachedValue)) {
                _logger.LogDebug("मेमोरी कैश हिट फॉर की: {Key}", key);
                return cachedValue;
            }
            // डिस्ट्रिब्यूटेड कैश ट्राई करें
            var distributedValue = await _distributedCache.GetAsync<T>(key);
            if (distributedValue != null) {
                _logger.LogDebug("डिस्ट्रिब्यूटेड कैश हिट फॉर की: {Key}", key);
                // तेज़ बाद के एक्सेस के लिए मेमोरी कैश पॉप्युलेट करें
                var memoryCacheOptions = new MemoryCacheEntryOptions {
                    AbsoluteExpirationRelativeToNow = expiration ?? _settings.DefaultExpiration
                };
                _memoryCache.Set(key, distributedValue, memoryCacheOptions);
                return distributedValue;
            }
            // कैश मिस - फैक्ट्री मेथड निष्पादित करें
            _logger.LogDebug("कैश मिस फॉर की: {Key}, फैक्ट्री निष्पादित कर रहे हैं", key);
            var value = await factory();
            if (value != null) {
                // दोनों कैश में स्टोर करें
                var cacheExpiration = expiration ?? _settings.DefaultExpiration;
                // मेमोरी कैश
                var memoryOptions = new MemoryCacheEntryOptions {
                    AbsoluteExpirationRelativeToNow = cacheExpiration
                };
                _memoryCache.Set(key, value, memoryOptions);
                // डिस्ट्रिब्यूटेड कैश
                var distributedOptions = new DistributedCacheEntryOptions {
                    AbsoluteExpirationRelativeToNow = cacheExpiration
                };
                await _distributedCache.SetAsync(key, value, distributedOptions);
            }
            return value;
        } catch (Exception ex) {
            _logger.LogError(ex, "GetOrCreateAsync में त्रुटि फॉर की: {Key}", key);
            // यदि कैशिंग विफल होती है, तो फैक्ट्री मेथड पर फॉल बैक करें
            return await factory();
        }
    }
    public async Task<T> GetAsync<T>(string key) {
        // फैक्ट्री फॉलबैक के बिना ऊपर के समान कार्यान्वयन
        if (_memoryCache.TryGetValue(key, out T memoryValue)) return memoryValue;
        var distributedValue = await _distributedCache.GetAsync<T>(key);
        if (distributedValue != null) {
            // मेमोरी कैश पॉप्युलेट करें
            _memoryCache.Set(key, distributedValue, TimeSpan.FromMinutes(_settings.MemoryCacheExpirationMinutes));
            return distributedValue;
        }
        return default(T);
    }
    public async Task SetAsync<T>(string key, T value, TimeSpan? expiration = null) {
        var cacheExpiration = expiration ?? _settings.DefaultExpiration;
        // मेमोरी कैश
        _memoryCache.Set(key, value, cacheExpiration);
        // डिस्ट्रिब्यूटेड कैश
        await _distributedCache.SetAsync(key, value, new DistributedCacheEntryOptions {
            AbsoluteExpirationRelativeToNow = cacheExpiration
        });
    }
    public async Task RemoveAsync(string key) {
        _memoryCache.Remove(key);
        await _distributedCache.RemoveAsync(key);
        _logger.LogInformation("कैश हटाया गया फॉर की: {Key}", key);
    }
    public async Task<bool> ExistsAsync(string key) {
        return _memoryCache.TryGetValue(key, out _) || await _distributedCache.GetAsync(key) != null;
    }
    // कैश अमान्यता के लिए पैटर्न-आधारित हटाना
    public async Task RemoveByPatternAsync(string pattern) {
        // यह एक सरलीकृत संस्करण है - वास्तविक कार्यान्वयन कैश प्रोवाइडर पर निर्भर करता है
        _logger.LogInformation("पैटर्न से मेल खाने वाली कैश एंट्रीज़ हटा रहे हैं: {Pattern}", pattern);
        // वास्तविक कार्यान्वयन में, आप Redis keys कमांड या समान का उपयोग करेंगे
        // यह एक वैचारिक कार्यान्वयन है
    }
}
// कॉन्फ़िगरेशन मॉडल
public class CacheSettings {
    public TimeSpan DefaultExpiration { get; set; } = TimeSpan.FromMinutes(30);
    public int MemoryCacheExpirationMinutes { get; set; } = 10;
    public string RedisConnectionString { get; set; }
    public bool UseDistributedCache { get; set; } = true;
}

Program.cs में कैश कॉन्फ़िगरेशन

// Program.cs - व्यापक कैशिंग सेटअप
var builder = WebApplication.CreateBuilder(args);
// कैश सेटिंग्स कॉन्फ़िगर करें
builder.Services.Configure<CacheSettings>(builder.Configuration.GetSection("CacheSettings"));
// मेमोरी कैश जोड़ें (हमेशा उपलब्ध)
builder.Services.AddMemoryCache(options => {
    options.SizeLimit = 1024 * 1024 * 100; // 100MB सीमा
    options.CompactionPercentage = 0.25; // 25% भरे होने पर कॉम्पैक्ट करें
});
// कॉन्फ़िगरेशन के आधार पर डिस्ट्रिब्यूटेड कैश जोड़ें
var cacheSettings = builder.Configuration.GetSection("CacheSettings").Get<CacheSettings>();
if (cacheSettings.UseDistributedCache && !string.IsNullOrEmpty(cacheSettings.RedisConnectionString)) {
    builder.Services.AddStackExchangeRedisCache(options => {
        options.Configuration = cacheSettings.RedisConnectionString;
        options.InstanceName = "MyApp:";
    });
    // सीधी पहुंच के लिए Redis कनेक्शन रजिस्टर करें
    builder.Services.AddSingleton<IConnectionMultiplexer>(sp =>
        ConnectionMultiplexer.Connect(cacheSettings.RedisConnectionString));
} else {
    // विकास के लिए डिस्ट्रिब्यूटेड मेमोरी कैश पर फॉलबैक
    builder.Services.AddDistributedMemoryCache();
}
// कैशिंग सर्विसेज रजिस्टर करें
builder.Services.AddScoped<ICacheService, CacheService>();
builder.Services.AddScoped<IProductCacheService, ProductCacheService>();
builder.Services.AddScoped<IUserCacheService, UserCacheService>();
// रिस्पांस कैशिंग जोड़ें
builder.Services.AddResponseCaching(options => {
    options.MaximumBodySize = 1024 * 1024; // 1MB
    options.UseCaseSensitivePaths = false;
});
// आउटपुट कैशिंग जोड़ें (ASP.NET Core 7+)
builder.Services.AddOutputCache(options => {
    options.AddBasePolicy(builder => builder.Expire(TimeSpan.FromMinutes(10)));
    options.AddPolicy("Products", builder => builder.Expire(TimeSpan.FromMinutes(5))
        .Tag("products"));
});
var app = builder.Build();
// रिस्पांस कैशिंग मिडलवेयर उपयोग करें
app.UseResponseCaching();
// आउटपुट कैशिंग मिडलवेयर उपयोग करें
app.UseOutputCache();
app.Run();

3. इन-मेमोरी कैशिंग डीप डाइव

उन्नत मेमोरी कैश पैटर्न

// एविक्शन पॉलिसीज़ के साथ स्मार्ट मेमोरी कैश सर्विस
public class SmartMemoryCacheService {
    private readonly IMemoryCache _cache;
    private readonly ILogger<SmartMemoryCacheService> _logger;
    private readonly ConcurrentDictionary<string, CacheEntryInfo> _cacheEntries;
    public SmartMemoryCacheService(IMemoryCache cache, ILogger<SmartMemoryCacheService> logger) {
        _cache = cache;
        _logger = logger;
        _cacheEntries = new ConcurrentDictionary<string, CacheEntryInfo>();
    }
    public async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory, CacheOptions options = null) {
        options ??= new CacheOptions();
        if (_cache.TryGetValue(key, out T cachedValue)) {
            // एक्सेस आंकड़े अपडेट करें
            UpdateAccessStats(key);
            _logger.LogDebug("कैश हिट फॉर {Key}", key);
            return cachedValue;
        }
        // कैश मिस - फैक्ट्री मेथड उपयोग करें
        _logger.LogDebug("कैश मिस फॉर {Key}, फैक्ट्री निष्पादित कर रहे हैं", key);
        // कैश स्टैम्पीड सुरक्षा लागू करें
        var semaphore = new SemaphoreSlim(1, 1);
        await semaphore.WaitAsync();
        try {
            // लॉक प्राप्त करने के बाद डबल-चेक
            if (_cache.TryGetValue(key, out cachedValue)) {
                UpdateAccessStats(key);
                return cachedValue;
            }
            var value = await factory();
            if (value != null) {
                var cacheEntryOptions = CreateCacheEntryOptions(options);
                // एविक्शन के लिए कॉलबैक रजिस्टर करें
                cacheEntryOptions.RegisterPostEvictionCallback(EvictionCallback);
                _cache.Set(key, value, cacheEntryOptions);
                // कैश एंट्री ट्रैक करें
                _cacheEntries[key] = new CacheEntryInfo {
                    Key = key,
                    Created = DateTime.UtcNow,
                    LastAccessed = DateTime.UtcNow,
                    AccessCount = 1,
                    Size = EstimateSize(value),
                    Options = options
                };
            }
            return value;
        } finally {
            semaphore.Release();
        }
    }
    public CacheStatistics GetStatistics() {
        var entries = _cacheEntries.Values.ToList();
        return new CacheStatistics {
            TotalEntries = entries.Count,
            TotalSize = entries.Sum(e => e.Size),
            HitRate = CalculateHitRate(),
            MostAccessed = entries.OrderByDescending(e => e.AccessCount).Take(10),
            OldestEntries = entries.OrderBy(e => e.LastAccessed).Take(10)
        };
    }
    public void Cleanup() {
        var now = DateTime.UtcNow;
        var toRemove = new List<string>();
        foreach (var entry in _cacheEntries) {
            var age = now - entry.Value.LastAccessed;
            if (age > entry.Value.Options.MaxIdleTime) {
                toRemove.Add(entry.Key);
            }
        }
        foreach (var key in toRemove) {
            _cache.Remove(key);
            _cacheEntries.TryRemove(key, out _);
            _logger.LogInformation("आइडल कैश एंट्री हटाई गई: {Key}", key);
        }
    }
    private void UpdateAccessStats(string key) {
        if (_cacheEntries.TryGetValue(key, out var info)) {
            info.LastAccessed = DateTime.UtcNow;
            info.AccessCount++;
        }
    }
    private void EvictionCallback(object key, object value, EvictionReason reason, object state) {
        _logger.LogInformation("कैश एंट्री एविक्टेड: {Key}, कारण: {Reason}", key, reason);
        _cacheEntries.TryRemove(key.ToString(), out _);
    }
    private MemoryCacheEntryOptions CreateCacheEntryOptions(CacheOptions options) {
        var cacheOptions = new MemoryCacheEntryOptions {
            Size = options.Size
        };
        if (options.AbsoluteExpiration.HasValue) cacheOptions.SetAbsoluteExpiration(options.AbsoluteExpiration.Value);
        if (options.SlidingExpiration.HasValue) cacheOptions.SetSlidingExpiration(options.SlidingExpiration.Value);
        if (options.Priority.HasValue) cacheOptions.SetPriority(options.Priority.Value);
        return cacheOptions;
    }
    private long EstimateSize<T>(T value) {
        // सरल आकार अनुमान - प्रोडक्शन में, अधिक सटीक विधियों का उपयोग करें
        if (value == null) return 0;
        try {
            using var stream = new MemoryStream();
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, value);
            return stream.Length;
        } catch {
            return 1024; // डिफ़ॉल्ट 1KB अनुमान
        }
    }
    private double CalculateHitRate() {
        var entries = _cacheEntries.Values.ToList();
        if (entries.Count == 0) return 0;
        var totalAccesses = entries.Sum(e => e.AccessCount);
        var hits = entries.Sum(e => e.AccessCount - 1); // पहला एक्सेस हमेशा मिस होता है
        return totalAccesses > 0 ? (double)hits / totalAccesses : 0;
    }
}
// सहायक क्लासेज
public class CacheOptions {
    public TimeSpan? AbsoluteExpiration { get; set; }
    public TimeSpan? SlidingExpiration { get; set; }
    public TimeSpan MaxIdleTime { get; set; } = TimeSpan.FromHours(24);
    public long Size { get; set; } = 1;
    public CacheItemPriority? Priority { get; set; }
}
public class CacheEntryInfo {
    public string Key { get; set; }
    public DateTime Created { get; set; }
    public DateTime LastAccessed { get; set; }
    public long AccessCount { get; set; }
    public long Size { get; set; }
    public CacheOptions Options { get; set; }
}
public class CacheStatistics {
    public int TotalEntries { get; set; }
    public long TotalSize { get; set; }
    public double HitRate { get; set; }
    public IEnumerable<CacheEntryInfo> MostAccessed { get; set; }
    public IEnumerable<CacheEntryInfo> OldestEntries { get; set; }
}

रियल-वर्ल्ड मेमोरी कैश कार्यान्वयन

// इंटेलिजेंट कैशिंग के साथ ई-कॉमर्स उत्पाद कैटलॉग
public class ProductCatalogService {
    private readonly IProductRepository _productRepository;
    private readonly SmartMemoryCacheService _cache;
    private readonly ILogger<ProductCatalogService> _logger;
    private const string ProductsByCategoryKey = "products_category_{0}";
    private const string FeaturedProductsKey = "products_featured";
    private const string ProductDetailsKey = "product_{0}";
    private const string ProductSearchKey = "products_search_{0}";
    public ProductCatalogService(IProductRepository productRepository, SmartMemoryCacheService cache, ILogger<ProductCatalogService> logger) {
        _productRepository = productRepository;
        _cache = cache;
        _logger = logger;
    }
    public async Task<List<Product>> GetProductsByCategoryAsync(int categoryId, int page = 1, int pageSize = 20) {
        var cacheKey = string.Format(ProductsByCategoryKey, categoryId);
        var options = new CacheOptions {
            SlidingExpiration = TimeSpan.FromMinutes(15),
            AbsoluteExpiration = DateTimeOffset.Now.AddHours(1)
        };
        return await _cache.GetOrCreateAsync(cacheKey, async () => {
            _logger.LogInformation("श्रेणी {CategoryId} के लिए उत्पाद डेटाबेस से लोड कर रहे हैं", categoryId);
            var products = await _productRepository.GetProductsByCategoryAsync(categoryId, page, pageSize);
            // व्यक्तिगत उत्पाद विवरण प्री-कैश करें
            foreach (var product in products) {
                var productCacheKey = string.Format(ProductDetailsKey, product.Id);
                await _cache.SetAsync(productCacheKey, product, new CacheOptions {
                    SlidingExpiration = TimeSpan.FromMinutes(30)
                });
            }
            return products;
        }, options);
    }
    public async Task<Product> GetProductDetailsAsync(int productId) {
        var cacheKey = string.Format(ProductDetailsKey, productId);
        var options = new CacheOptions {
            SlidingExpiration = TimeSpan.FromMinutes(30),
            AbsoluteExpiration = DateTimeOffset.Now.AddHours(2)
        };
        return await _cache.GetOrCreateAsync(cacheKey, async () => {
            _logger.LogInformation("उत्पाद विवरण {ProductId} के लिए डेटाबेस से लोड कर रहे हैं", productId);
            var product = await _productRepository.GetProductWithDetailsAsync(productId);
            if (product != null) {
                // पृष्ठभूमि में लोकप्रियता स्कोर अपडेट करें
                _ = Task.Run(async () => {
                    await _productRepository.IncrementViewCountAsync(productId);
                });
            }
            return product;
        }, options);
    }
    public async Task<List<Product>> SearchProductsAsync(string searchTerm, ProductSearchFilters filters) {
        var searchHash = GenerateSearchHash(searchTerm, filters);
        var cacheKey = string.Format(ProductSearchKey, searchHash);
        var options = new CacheOptions {
            SlidingExpiration = TimeSpan.FromMinutes(10),
            AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(30)
        };
        return await _cache.GetOrCreateAsync(cacheKey, async () => {
            _logger.LogInformation("डेटाबेस में '{SearchTerm}' के लिए खोज निष्पादित कर रहे हैं", searchTerm);
            return await _productRepository.SearchProductsAsync(searchTerm, filters);
        }, options);
    }
    public async Task<List<Product>> GetFeaturedProductsAsync() {
        var options = new CacheOptions {
            AbsoluteExpiration = DateTimeOffset.Now.AddHours(4) // हर 4 घंटे रीफ्रेश
        };
        return await _cache.GetOrCreateAsync(FeaturedProductsKey, async () => {
            _logger.LogInformation("फीचर्ड उत्पाद डेटाबेस से लोड कर रहे हैं");
            return await _productRepository.GetFeaturedProductsAsync();
        }, options);
    }
    public async Task InvalidateProductCacheAsync(int productId) {
        var productKey = string.Format(ProductDetailsKey, productId);
        await _cache.RemoveAsync(productKey);
        // श्रेणी कैश अमान्य करें जिनमें यह उत्पाद हो सकता है
        await InvalidateCategoryCachesAsync();
        _logger.LogInformation("उत्पाद {ProductId} के लिए कैश अमान्य किया गया", productId);
    }
    private async Task InvalidateCategoryCachesAsync() {
        // वास्तविक कार्यान्वयन में, आप ट्रैक करेंगे कि किन श्रेणियों को अमान्य करने की आवश्यकता है
        // यह एक सरलीकृत संस्करण है
        for (int i = 1; i <= 10; i++) // 10 मुख्य श्रेणियों को मानते हुए
        {
            var categoryKey = string.Format(ProductsByCategoryKey, i);
            await _cache.RemoveAsync(categoryKey);
        }
    }
    private string GenerateSearchHash(string searchTerm, ProductSearchFilters filters) {
        var json = JsonSerializer.Serialize(new { searchTerm, filters });
        using var sha256 = SHA256.Create();
        var hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(json));
        return Convert.ToBase64String(hash);
    }
}

4. Redis के साथ डिस्ट्रिब्यूटेड कैशिंग

Redis कॉन्फ़िगरेशन और उन्नत पैटर्न

// उन्नत Redis कैश सर्विस
public class RedisCacheService : IDistributedCacheService {
    private readonly IConnectionMultiplexer _redis;
    private readonly IDatabase _database;
    private readonly ILogger<RedisCacheService> _logger;
    private readonly ISerializer _serializer;
    public RedisCacheService(IConnectionMultiplexer redis, ILogger<RedisCacheService> logger, ISerializer serializer) {
        _redis = redis;
        _database = redis.GetDatabase();
        _logger = logger;
        _serializer = serializer;
    }
    public async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory, DistributedCacheEntryOptions options = null) {
        options ??= new DistributedCacheEntryOptions {
            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30)
        };
        try {
            // Redis से प्राप्त करने का प्रयास
            var cachedValue = await GetAsync<T>(key);
            if (cachedValue != null) {
                _logger.LogDebug("Redis कैश हिट फॉर {Key}", key);
                return cachedValue;
            }
        } catch (RedisException ex) {
            _logger.LogWarning(ex, "Redis की के लिए अनुपलब्ध {Key}, फैक्ट्री पर फॉलबैक", key);
            return await factory();
        }
        // कैश मिस - फैक्ट्री निष्पादित करें
        _logger.LogDebug("Redis कैश मिस फॉर {Key}", key);
        var value = await factory();
        if (value != null) {
            await SetAsync(key, value, options);
        }
        return value;
    }
    public async Task<T> GetAsync<T>(string key) {
        try {
            var cachedData = await _database.StringGetAsync(key);
            if (cachedData.HasValue) {
                return _serializer.Deserialize<T>(cachedData);
            }
            return default(T);
        } catch (Exception ex) {
            _logger.LogError(ex, "Redis से की {Key} प्राप्त करने में त्रुटि", key);
            throw;
        }
    }
    public async Task SetAsync<T>(string key, T value, DistributedCacheEntryOptions options = null) {
        try {
            var serializedValue = _serializer.Serialize(value);
            if (options != null) {
                await _database.StringSetAsync(key, serializedValue, options.AbsoluteExpirationRelativeToNow);
            } else {
                await _database.StringSetAsync(key, serializedValue);
            }
            _logger.LogDebug("Redis कैश सेट फॉर की {Key}", key);
        } catch (Exception ex) {
            _logger.LogError(ex, "Redis में की {Key} सेट करने में त्रुटि", key);
            throw;
        }
    }
    public async Task<bool> RemoveAsync(string key) {
        try {
            var result = await _database.KeyDeleteAsync(key);
            _logger.LogDebug("Redis की {Key} हटाई गई: {Result}", key, result);
            return result;
        } catch (Exception ex) {
            _logger.LogError(ex, "Redis से की {Key} हटाने में त्रुटि", key);
            throw;
        }
    }
    public async Task<bool> KeyExistsAsync(string key) {
        try {
            return await _database.KeyExistsAsync(key);
        } catch (Exception ex) {
            _logger.LogError(ex, "Redis में की {Key} के अस्तित्व की जांच में त्रुटि", key);
            return false;
        }
    }
    public async Task<long> GetMemoryUsageAsync(string key) {
        try {
            // Redis MEMORY USAGE कमांड उपयोग करें (Redis 4+ आवश्यक)
            var result = await _database.ExecuteAsync("MEMORY", "USAGE", key);
            return (long)result;
        } catch {
            return -1;
        }
    }
    public async Task<RedisCacheInfo> GetCacheInfoAsync() {
        try {
            var server = _redis.GetServer(_redis.GetEndPoints().First());
            var info = await server.InfoAsync("memory", "stats");
            return new RedisCacheInfo {
                UsedMemory = long.Parse(info[0]["used_memory"]),
                UsedMemoryHuman = info[0]["used_memory_human"],
                KeyCount = await _database.ExecuteAsync("DBSIZE") as long? ?? 0,
                HitRate = await CalculateHitRateAsync(),
                ConnectedClients = int.Parse(info[1]["connected_clients"])
            };
        } catch (Exception ex) {
            _logger.LogError(ex, "Redis कैश जानकारी प्राप्त करने में त्रुटि");
            return null;
        }
    }
    public async Task<IEnumerable<string>> GetKeysByPatternAsync(string pattern) {
        var keys = new List<string>();
        try {
            var server = _redis.GetServer(_redis.GetEndPoints().First());
            await foreach (var key in server.KeysAsync(pattern: pattern)) {
                keys.Add(key);
            }
        } catch (Exception ex) {
            _logger.LogError(ex, "पैटर्न {Pattern} के लिए कुंजियाँ प्राप्त करने में त्रुटि", pattern);
        }
        return keys;
    }
    private async Task<double> CalculateHitRateAsync() {
        try {
            var server = _redis.GetServer(_redis.GetEndPoints().First());
            var info = await server.InfoAsync("stats");
            var hits = long.Parse(info[0]["keyspace_hits"]);
            var misses = long.Parse(info[0]["keyspace_misses"]);
            return hits + misses > 0 ? (double)hits / (hits + misses) : 0;
        } catch {
            return 0;
        }
    }
}
// Redis कैश सूचना मॉडल
public class RedisCacheInfo {
    public long UsedMemory { get; set; }
    public string UsedMemoryHuman { get; set; }
    public long KeyCount { get; set; }
    public double HitRate { get; set; }
    public int ConnectedClients { get; set; }
}
// Redis के लिए JSON सीरियलाइज़र
public class JsonSerializer : ISerializer {
    private readonly JsonSerializerOptions _options;
    public JsonSerializer() {
        _options = new JsonSerializerOptions {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
            WriteIndented = false
        };
    }
    public T Deserialize<T>(string data) {
        return JsonSerializer.Deserialize<T>(data, _options);
    }
    public string Serialize<T>(T value) {
        return JsonSerializer.Serialize(value, _options);
    }
}
public interface ISerializer {
    T Deserialize<T>(string data);
    string Serialize<T>(T value);
}

हाई-ट्रैफिक एप्लिकेशन के लिए रियल-वर्ल्ड Redis कार्यान्वयन

// Redis के साथ सेशन मैनेजमेंट
public class RedisSessionService {
    private readonly IDistributedCacheService _cache;
    private readonly ILogger<RedisSessionService> _logger;
    private const string SessionKeyPrefix = "session:";
    private const string UserSessionsKey = "user_sessions:";
    public RedisSessionService(IDistributedCacheService cache, ILogger<RedisSessionService> logger) {
        _cache = cache;
        _logger = logger;
    }
    public async Task<Session> CreateSessionAsync(int userId, SessionData data) {
        var sessionId = GenerateSessionId();
        var sessionKey = GetSessionKey(sessionId);
        var userSessionsKey = GetUserSessionsKey(userId);
        var session = new Session {
            Id = sessionId,
            UserId = userId,
            CreatedAt = DateTime.UtcNow,
            LastAccessed = DateTime.UtcNow,
            Data = data,
            ExpiresAt = DateTime.UtcNow.AddDays(30)
        };
        var options = new DistributedCacheEntryOptions {
            AbsoluteExpiration = session.ExpiresAt
        };
        // सेशन स्टोर करें
        await _cache.SetAsync(sessionKey, session, options);
        // उपयोगकर्ता के सेशन्स सेट में जोड़ें
        await _cache.SetAddAsync(userSessionsKey, sessionId);
        _logger.LogInformation("सेशन {SessionId} बनाया गया उपयोगकर्ता {UserId} के लिए", sessionId, userId);
        return session;
    }
    public async Task<Session> GetSessionAsync(string sessionId) {
        var sessionKey = GetSessionKey(sessionId);
        var session = await _cache.GetAsync<Session>(sessionKey);
        if (session != null) {
            // अंतिम एक्सेस समय अपडेट करें
            session.LastAccessed = DateTime.UtcNow;
            await _cache.SetAsync(sessionKey, session);
            _logger.LogDebug("सेशन {SessionId} प्राप्त किया गया", sessionId);
        }
        return session;
    }
    public async Task<bool> ValidateSessionAsync(string sessionId) {
        var sessionKey = GetSessionKey(sessionId);
        return await _cache.KeyExistsAsync(sessionKey);
    }
    public async Task InvalidateSessionAsync(string sessionId) {
        var session = await GetSessionAsync(sessionId);
        if (session != null) {
            var sessionKey = GetSessionKey(sessionId);
            var userSessionsKey = GetUserSessionsKey(session.UserId);
            // सेशन हटाएं
            await _cache.RemoveAsync(sessionKey);
            // उपयोगकर्ता के सेशन्स से हटाएं
            await _cache.SetRemoveAsync(userSessionsKey, sessionId);
            _logger.LogInformation("सेशन {SessionId} अमान्य किया गया", sessionId);
        }
    }
    public async Task InvalidateUserSessionsAsync(int userId) {
        var userSessionsKey = GetUserSessionsKey(userId);
        var sessionIds = await _cache.SetMembersAsync<string>(userSessionsKey);
        foreach (var sessionId in sessionIds) {
            var sessionKey = GetSessionKey(sessionId);
            await _cache.RemoveAsync(sessionKey);
        }
        // उपयोगकर्ता सेशन्स सेट हटाएं
        await _cache.RemoveAsync(userSessionsKey);
        _logger.LogInformation("उपयोगकर्ता {UserId} के सभी सेशन्स अमान्य किए गए", userId);
    }
    public async Task<List<Session>> GetUserSessionsAsync(int userId) {
        var userSessionsKey = GetUserSessionsKey(userId);
        var sessionIds = await _cache.SetMembersAsync<string>(userSessionsKey);
        var sessions = new List<Session>();
        foreach (var sessionId in sessionIds) {
            var session = await GetSessionAsync(sessionId);
            if (session != null) {
                sessions.Add(session);
            }
        }
        return sessions.OrderByDescending(s => s.LastAccessed).ToList();
    }
    public async Task CleanupExpiredSessionsAsync() {
        // Redis TTL के आधार पर कुंजियों को स्वचालित रूप से समाप्त कर देगा
        // यह मेथड अतिरिक्त सफाई के लिए है यदि आवश्यक हो
        _logger.LogInformation("Redis TTL द्वारा सेशन सफाई पूरी हुई");
    }
    private string GenerateSessionId() {
        return Guid.NewGuid().ToString("N");
    }
    private string GetSessionKey(string sessionId) {
        return $"{SessionKeyPrefix}{sessionId}";
    }
    private string GetUserSessionsKey(int userId) {
        return $"{UserSessionsKey}{userId}";
    }
}
// सेशन मॉडल्स
public class Session {
    public string Id { get; set; }
    public int UserId { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime LastAccessed { get; set; }
    public DateTime ExpiresAt { get; set; }
    public SessionData Data { get; set; }
}
public class SessionData {
    public string UserAgent { get; set; }
    public string IPAddress { get; set; }
    public string Location { get; set; }
    public Dictionary<string, object> CustomData { get; set; } = new();
}

5. रिस्पांस कैशिंग रणनीतियाँ

व्यापक रिस्पांस कैशिंग कार्यान्वयन

// उन्नत रिस्पांस कैशिंग सर्विस
public class ResponseCachingService {
    private readonly IResponseCache _responseCache;
    private readonly ILogger<ResponseCachingService> _logger;
    public ResponseCachingService(IResponseCache responseCache, ILogger<ResponseCachingService> logger) {
        _responseCache = responseCache;
        _logger = logger;
    }
    public async Task CacheResponseAsync(string cacheKey, object response, TimeSpan timeToLive) {
        try {
            if (response == null) return;
            var cachedResponse = new CachedResponse {
                Content = response,
                Created = DateTime.UtcNow,
                Expires = DateTime.UtcNow.Add(timeToLive)
            };
            await _responseCache.SetAsync(cacheKey, cachedResponse, timeToLive);
            _logger.LogDebug("रिस्पांस कैश्ड फॉर की {CacheKey}, TTL: {TimeToLive}", cacheKey, timeToLive);
        } catch (Exception ex) {
            _logger.LogError(ex, "की {CacheKey} के लिए रिस्पांस कैशिंग में त्रुटि", cacheKey);
        }
    }
    public async Task<CachedResponse> GetCachedResponseAsync(string cacheKey) {
        try {
            var cachedResponse = await _responseCache.GetAsync<CachedResponse>(cacheKey);
            if (cachedResponse != null) {
                _logger.LogDebug("रिस्पांस की {CacheKey} के लिए कैश हिट", cacheKey);
                // चेक करें यदि समाप्त हो गया
                if (cachedResponse.Expires < DateTime.UtcNow) {
                    await _responseCache.RemoveAsync(cacheKey);
                    _logger.LogDebug("की {CacheKey} के लिए समाप्त रिस्पांस हटाया गया", cacheKey);
                    return null;
                }
                return cachedResponse;
            }
            _logger.LogDebug("रिस्पांस की {CacheKey} के लिए कैश मिस", cacheKey);
            return null;
        } catch (Exception ex) {
            _logger.LogError(ex, "की {CacheKey} के लिए कैश्ड रिस्पांस प्राप्त करने में त्रुटि", cacheKey);
            return null;
        }
    }
    public string GenerateCacheKey(string path, string queryString, string userId = null) {
        var keyBuilder = new StringBuilder();
        keyBuilder.Append(path.ToLowerInvariant());
        if (!string.IsNullOrEmpty(queryString)) {
            keyBuilder.Append('?');
            keyBuilder.Append(queryString.ToLowerInvariant());
        }
        if (!string.IsNullOrEmpty(userId)) {
            keyBuilder.Append("|user:");
            keyBuilder.Append(userId);
        }
        return keyBuilder.ToString();
    }
    public async Task InvalidateByPatternAsync(string pattern) {
        try {
            await _responseCache.RemoveByPatternAsync(pattern);
            _logger.LogInformation("पैटर्न से मेल खाने वाले रिस्पांस अमान्य किए गए: {Pattern}", pattern);
        } catch (Exception ex) {
            _logger.LogError(ex, "पैटर्न {Pattern} के लिए रिस्पांस अमान्य करने में त्रुटि", pattern);
        }
    }
}
// कैश्ड रिस्पांस मॉडल
public class CachedResponse {
    public object Content { get; set; }
    public DateTime Created { get; set; }
    public DateTime Expires { get; set; }
    public string ETag { get; set; }
    public DateTime? LastModified { get; set; }
}
// रिस्पांस कैश कार्यान्वयन
public interface IResponseCache {
    Task SetAsync<T>(string key, T value, TimeSpan timeToLive);
    Task<T> GetAsync<T>(string key);
    Task RemoveAsync(string key);
    Task RemoveByPatternAsync(string pattern);
}
// रिस्पांस कैशिंग के लिए एक्शन फिल्टर
public class ResponseCachingAttribute : Attribute, IAsyncActionFilter {
    private readonly int _duration;
    private readonly bool _perUser;
    private readonly string[] _varyBy;
    public ResponseCachingAttribute(int duration, bool perUser = false, params string[] varyBy) {
        _duration = duration;
        _perUser = perUser;
        _varyBy = varyBy;
    }
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) {
        var cacheService = context.HttpContext.RequestServices.GetService<ResponseCachingService>();
        var httpContext = context.HttpContext;
        // कैश की जनरेट करें
        var cacheKey = GenerateCacheKey(httpContext, _perUser, _varyBy);
        // कैश से प्राप्त करने का प्रयास
        var cachedResponse = await cacheService.GetCachedResponseAsync(cacheKey);
        if (cachedResponse != null) {
            // कैश्ड रिस्पांस वापस करें
            context.Result = new ObjectResult(cachedResponse.Content) {
                StatusCode = 200
            };
            // कैश हेडर्स सेट करें
            if (!string.IsNullOrEmpty(cachedResponse.ETag)) {
                httpContext.Response.Headers.ETag = cachedResponse.ETag;
            }
            if (cachedResponse.LastModified.HasValue) {
                httpContext.Response.Headers.LastModified = cachedResponse.LastModified.Value.ToString("R");
            }
            return;
        }
        // एक्शन निष्पादित करें
        var executedContext = await next();
        if (executedContext.Result is ObjectResult objectResult && objectResult.Value != null) {
            // रिस्पांस कैश करें
            var timeToLive = TimeSpan.FromSeconds(_duration);
            await cacheService.CacheResponseAsync(cacheKey, objectResult.Value, timeToLive);
            // रिस्पांस कैश हेडर्स सेट करें
            httpContext.Response.Headers.CacheControl = $"public, max-age={_duration}";
            httpContext.Response.Headers.Expires = DateTime.UtcNow.AddSeconds(_duration).ToString("R");
        }
    }
    private string GenerateCacheKey(HttpContext httpContext, bool perUser, string[] varyBy) {
        var keyBuilder = new StringBuilder();
        // पथ और क्वेरी स्ट्रिंग
        keyBuilder.Append(httpContext.Request.Path);
        keyBuilder.Append('?');
        keyBuilder.Append(httpContext.Request.QueryString);
        // उपयोगकर्ता-विशिष्ट कैशिंग
        if (perUser && httpContext.User.Identity.IsAuthenticated) {
            keyBuilder.Append("|user:");
            keyBuilder.Append(httpContext.User.GetUserId());
        }
        // हेडर्स द्वारा वेरी करें
        foreach (var header in varyBy) {
            if (httpContext.Request.Headers.TryGetValue(header, out var headerValue)) {
                keyBuilder.Append($"|{header}:{headerValue}");
            }
        }
        return keyBuilder.ToString();
    }
}

रियल-वर्ल्ड रिस्पांस कैशिंग कार्यान्वयन

// व्यापक कैशिंग के साथ उत्पाद कंट्रोलर
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase {
    private readonly IProductService _productService;
    private readonly IResponseCache _responseCache;
    private readonly ILogger<ProductsController> _logger;
    public ProductsController(IProductService productService, IResponseCache responseCache, ILogger<ProductsController> logger) {
        _productService = productService;
        _responseCache = responseCache;
        _logger = logger;
    }
    [HttpGet]
    [ResponseCaching(300)] // 5 मिनट के लिए कैश
    public async Task<ActionResult<ApiResponse<List<Product>>>> GetProducts(
        [FromQuery] ProductQuery query) {
        try {
            var products = await _productService.GetProductsAsync(query);
            return Ok(new ApiResponse<List<Product>>(products));
        } catch (Exception ex) {
            _logger.LogError(ex, "उत्पाद प्राप्त करने में त्रुटि");
            return StatusCode(500, new ApiResponse<string>("आंतरिक सर्वर त्रुटि"));
        }
    }
    [HttpGet("{id}")]
    [ResponseCaching(600, varyBy: new[] { "Accept-Language" })] // 10 मिनट के लिए कैश, भाषा के अनुसार वेरी
    public async Task<ActionResult<ApiResponse<Product>>> GetProduct(int id) {
        try {
            var product = await _productService.GetProductAsync(id);
            if (product == null) return NotFound(new ApiResponse<string>("उत्पाद नहीं मिला"));
            return Ok(new ApiResponse<Product>(product));
        } catch (Exception ex) {
            _logger.LogError(ex, "उत्पाद {ProductId} प्राप्त करने में त्रुटि", id);
            return StatusCode(500, new ApiResponse<string>("आंतरिक सर्वर त्रुटि"));
        }
    }
    [HttpGet("featured")]
    [ResponseCaching(900)] // 15 मिनट के लिए कैश
    public async Task<ActionResult<ApiResponse<List<Product>>>> GetFeaturedProducts() {
        try {
            var products = await _productService.GetFeaturedProductsAsync();
            return Ok(new ApiResponse<List<Product>>(products));
        } catch (Exception ex) {
            _logger.LogError(ex, "फीचर्ड उत्पाद प्राप्त करने में त्रुटि");
            return StatusCode(500, new ApiResponse<string>("आंतरिक सर्वर त्रुटि"));
        }
    }
    [HttpPost]
    public async Task<ActionResult<ApiResponse<Product>>> CreateProduct(ProductCreateRequest request) {
        try {
            var product = await _productService.CreateProductAsync(request);
            // संबंधित कैश अमान्य करें
            await InvalidateProductCachesAsync();
            return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, new ApiResponse<Product>(product));
        } catch (Exception ex) {
            _logger.LogError(ex, "उत्पाद बनाने में त्रुटि");
            return StatusCode(500, new ApiResponse<string>("आंतरिक सर्वर त्रुटि"));
        }
    }
    [HttpPut("{id}")]
    public async Task<ActionResult<ApiResponse<Product>>> UpdateProduct(int id, ProductUpdateRequest request) {
        try {
            var product = await _productService.UpdateProductAsync(id, request);
            if (product == null) return NotFound(new ApiResponse<string>("उत्पाद नहीं मिला"));
            // संबंधित कैश अमान्य करें
            await InvalidateProductCachesAsync(id);
            return Ok(new ApiResponse<Product>(product));
        } catch (Exception ex) {
            _logger.LogError(ex, "उत्पाद {ProductId} अपडेट करने में त्रुटि", id);
            return StatusCode(500, new ApiResponse<string>("आंतरिक सर्वर त्रुटि"));
        }
    }
    [HttpDelete("{id}")]
    public async Task<ActionResult<ApiResponse<bool>>> DeleteProduct(int id) {
        try {
            var result = await _productService.DeleteProductAsync(id);
            if (!result) return NotFound(new ApiResponse<string>("उत्पाद नहीं मिला"));
            // संबंधित कैश अमान्य करें
            await InvalidateProductCachesAsync(id);
            return Ok(new ApiResponse<bool>(true));
        } catch (Exception ex) {
            _logger.LogError(ex, "उत्पाद {ProductId} हटाने में त्रुटि", id);
            return StatusCode(500, new ApiResponse<string>("आंतरिक सर्वर त्रुटि"));
        }
    }
    private async Task InvalidateProductCachesAsync(int? productId = null) {
        try {
            // उत्पाद सूचियाँ अमान्य करें
            await _responseCache.RemoveByPatternAsync("api/products*");
            // विशिष्ट उत्पाद अमान्य करें यदि प्रदान किया गया
            if (productId.HasValue) {
                await _responseCache.RemoveAsync($"api/products/{productId}");
            }
            // फीचर्ड उत्पाद अमान्य करें
            await _responseCache.RemoveAsync("api/products/featured");
            _logger.LogInformation("उत्पाद {ProductId} के लिए उत्पाद कैश अमान्य किए गए", productId);
        } catch (Exception ex) {
            _logger.LogError(ex, "उत्पाद कैश अमान्य करने में त्रुटि");
        }
    }
}

नोट: यह संपूर्ण 150,000+ शब्द गाइड से एक व्यापक अंश है। पूरा लेख कैश अमान्यता पैटर्न, प्रदर्शन निगरानी, उन्नत कैशिंग पैटर्न, सुरक्षा, टेस्टिंग रणनीतियों, और प्रोडक्शन डिप्लॉयमेंट पर विस्तृत अनुभागों के साथ जारी रहेगा जिसमें पूर्ण कोड उदाहरण और वास्तविक दुनिया के परिदृश्य शामिल हैं।

पूरा गाइड ASP.NET Core कैशिंग के हर पहलू की विस्तृत कवरेज प्रदान करेगा, जिसमें शामिल हैं:

  • इवेंट-आधारित पैटर्न के साथ उन्नत कैश अमान्यता रणनीतियाँ
  • व्यापक प्रदर्शन निगरानी और एनालिटिक्स
  • कैश वार्मिंग और प्रीलोडिंग तकनीकें
  • CDN इंटीग्रेशन के साथ भौगोलिक कैशिंग
  • कैश कम्प्रेशन और ऑप्टिमाइज़ेशन
  • सुरक्षा विचार और कैश पॉइज़निंग रोकथाम
  • लोड टेस्टिंग और प्रदर्शन बेंचमार्किंग
  • प्रोडक्शन डिप्लॉयमेंट और DevOps इंटीग्रेशन
  • हाई-ट्रैफिक एप्लिकेशन से वास्तविक दुनिया के केस स्टडीज़

प्रत्येक अनुभाग में पूर्ण, प्रोडक्शन-तैयार कोड उदाहरण, सर्वोत्तम अभ्यास, सामान्य नुकसान, और वैकल्पिक दृष्टिकोण शामिल होंगे ताकि डेवलपर्स अत्यधिक प्रदर्शनकारी और स्केलेबल वेब एप्लिकेशन बनाने के लिए कैशिंग में महारत हासिल कर सकें।

  1. HTML DOM इनपुट मंथ form प्रॉपर्टी HTML DOM इनपुट मंथ form प्रॉपर्टी

    परिचय HTML DOM इनपुट मंथ form प्रॉपर्टी उस फॉर्म का रेफरेंस लौटाती है जिसमें मंथ इनपुट फील्ड समाहित है। सिंटैक्स object.form उदाहरण मंथ इनपुट फील्ड वाले फॉर्म की पहचान करना: <!DOCTYPE html> <html> <head> <style> body { text-align: center; background-color: #363946; color:

  1. Java उदाहरण के साथ OpenCV में Otsu थ्रेशोल्ड तकनीक की व्याख्या Java उदाहरण के साथ OpenCV में Otsu थ्रेशोल्ड तकनीक की व्याख्या

    थ्रेशोल्डिंग एक इमेज के सेगमेंटेशन के लिए एक सरल तकनीक है। इसका उपयोग अक्सर बाइनरी इमेजेज बनाने के लिए किया जाता है। इसमें दिए गए थ्रेशोल्ड मान से अधिक पिक्सल्स को एक मानक मान से बदल दिया जाता है। सरल थ्रेशोल्डिंग में, थ्रेशोल्ड मान पूरी इमेज में स्थिर रहता है। एडेप्टिव थ्रेशोल्डिंग में, थ्रेशोल्ड

  1. C में फ्लोटिंग पॉइंट संख्या में सेट बिट्स गिनना C में फ्लोटिंग पॉइंट संख्या में सेट बिट्स गिनना

    इस समस्या में एक फ्लोटिंग पॉइंट मान दिया गया है। हमें इसके बाइनरी प्रतिनिधित्व में सेट बिट्स की संख्या ढूंढनी है। उदाहरण के लिए, यदि एक फ्लोटिंग पॉइंट संख्या 0.15625 है तो इसमें छह सेट बिट्स हैं। एक सामान्य C कंपाइलर सिंगल प्रिसिजन फ्लोटिंग पॉइंट प्रतिनिधित्व का उपयोग करता है। तो यह इस तरह दिखेगा।