Spring framework caching


যখন আমরা কোনো ডেটা বারবার একই সোর্স (যেমন ডেটাবেজ বা API) থেকে আনতে থাকি, তখন অ্যাপ্লিকেশন ধীর হয়ে যায়। এই সমস্যা সমাধানের জন্যই আসে Caching — মানে কোনো ডেটা একবার লোড করে সাময়িকভাবে মেমরিতে সংরক্ষণ করে রাখা, যাতে পরের বার সেটা পুনরায় ব্যবহার করা যায়।

Spring Framework খুব সহজেই declarative caching সাপোর্ট দেয়, যার মাধ্যমে তুমি কেবল একটি annotation দিয়েই caching চালু করতে পারো! 🚀


১. Caching কীভাবে কাজ করে?

Caching মূলত “key-value” পদ্ধতিতে কাজ করে।
তুমি যখন কোনো মেথডে @Cacheable ব্যবহার করো, তখন প্রথমবার কলের সময় মেথডটি execute হয় এবং ফলাফল cache-এ সংরক্ষিত হয়।
পরের বার একই parameter দিয়ে কল করলে মেথড execute না হয়ে cache থেকে ডেটা ফেরত দেয়।


২. প্রজেক্টে Cache যোগ করা

Spring Boot প্রজেক্টে caching ব্যবহার করতে হলে প্রথমে নিচের dependency যোগ করো 👇

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

এখন তোমার অ্যাপ্লিকেশনের main ক্লাসে caching enable করতে হবে 👇

@SpringBootApplication
@EnableCaching
public class CachingApplication {
    public static void main(String[] args) {
        SpringApplication.run(CachingApplication.class, args);
    }
}

🧩 ৩. একটি সাধারণ উদাহরণ

ধরা যাক, তুমি কোনো Service ক্লাসে user data fetch করছো।

@Service
public class UserService {

    @Cacheable("users")
    public String getUserById(Long id) {
        System.out.println("Fetching user from database...");
        return "User-" + id;
    }
}

এখন যদি নিচের মতো কল করা হয় 👇

userService.getUserById(1L);  // Database থেকে আনবে
userService.getUserById(1L);  // Cache থেকে আনবে (দ্রুত)

প্রথমবার “Fetching user from database...” প্রিন্ট হবে,
কিন্তু দ্বিতীয়বার cache থেকে ডেটা আসবে — তাই লাইনটি আর প্রিন্ট হবে না। 🎯


🔁 ৪. Cache Update ও Remove করা

✅ Cache আপডেট করা

যদি তুমি চাও cache আপডেট হোক নতুন ডেটা দিয়ে, তাহলে @CachePut ব্যবহার করো।

@CachePut(value = "users", key = "#id")
public String updateUser(Long id, String name) {
    System.out.println("Updating user in database...");
    return name;
}

এটি সবসময় মেথড এক্সিকিউট করবে এবং cache-ও আপডেট করবে।


❌ Cache মুছে ফেলা

Cache পরিষ্কার করতে @CacheEvict ব্যবহার করা হয় 👇

@CacheEvict(value = "users", allEntries = true)
public void clearCache() {
    System.out.println("All cache cleared!");
}

🧱 ৫. Cache Storage কীভাবে কাজ করে?

Spring Boot ডিফল্টভাবে ConcurrentHashMap ব্যবহার করে মেমরি-ভিত্তিক cache রাখে।
তবে তুমি চাইলে অন্য cache provider ব্যবহার করতে পারো, যেমন:

Cache Provider Dependency
Ehcache spring-boot-starter-cache + ehcache
Caffeine com.github.ben-manes.caffeine:caffeine
Redis spring-boot-starter-data-redis
Hazelcast com.hazelcast:hazelcast-spring

উদাহরণস্বরূপ, যদি তুমি Caffeine Cache ব্যবহার করতে চাও 👇

pom.xml

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

application.yml

spring:
  cache:
    type: caffeine
    cache-names: users
    caffeine:
      spec: maximumSize=100,expireAfterWrite=5m

🧮 ৬. Cache Key কাস্টমাইজ করা

তুমি চাইলে নিজের মতো করে cache key নির্ধারণ করতে পারো।

@Cacheable(value = "users", key = "#user.id + '-' + #user.name")
public String getUser(User user) {
    return "Data for " + user.getName();
}

🧪 ৭. Cache Condition

কখনো তুমি চাইতে পারো, cache কেবল নির্দিষ্ট শর্তে কাজ করুক 👇

@Cacheable(value = "users", condition = "#id > 10")
public String getUserById(Long id) {
    return "User-" + id;
}

এখানে id যদি 10-এর বেশি হয়, তবেই cache কাজ করবে।


🧠 সারসংক্ষেপ

Annotation কাজ
@EnableCaching Caching সক্রিয় করে
@Cacheable Cache থেকে রেজাল্ট দেয় অথবা নতুন করে সংরক্ষণ করে
@CachePut Cache আপডেট করে
@CacheEvict Cache মুছে ফেলে
@Caching একাধিক caching rule একত্রে প্রয়োগ করে

🎯 উপসংহার

Spring Caching খুব সহজে অ্যাপ্লিকেশনের পারফরম্যান্স বাড়াতে পারে।
তুমি চাইলেই কয়েকটি annotation দিয়েই ডেটাবেজের অপ্রয়োজনীয় লোড কমিয়ে অ্যাপকে অনেক দ্রুত করতে পারো।
আর প্রয়োজন অনুযায়ী Redis, Caffeine, বা Ehcache ব্যবহার করে cache management আরও শক্তিশালী করা যায়।


চাওলে আমি এর পরবর্তী অংশে “Redis cache configuration with Spring Boot” নিয়ে আরেকটা ব্লগ লিখে দিতে পারি —
তুমি কি সেটা পরের টপিক হিসেবে চাও?