উদাহরণ সহ Spring AOP এর মাধ্যমে Caching

pring AOP এবং Caching - স্প্রিং এওপি (Spring AOP) - Java Technologies

292

Spring AOP (Aspect-Oriented Programming) একটি শক্তিশালী কৌশল যা ক্রস-কাটিং কনসার্ন (cross-cutting concerns) যেমন লগিং, সিকিউরিটি, এবং ক্যাশিং পরিচালনা করতে ব্যবহৃত হয়। Caching হল একটি ক্রস-কাটিং কনসার্ন যা ডেটার পুনঃপ্রসেসিং কমাতে এবং অ্যাপ্লিকেশনটির পারফরম্যান্স বাড়াতে সহায়তা করে। Spring AOP ব্যবহার করে ক্যাশিং কার্যক্রম সম্পাদন করা সম্ভব, যেখানে আপনি মেথডের ফলাফল ক্যাশে সংরক্ষণ করতে পারেন এবং পরবর্তী সময়ে সেই ফলাফল সরাসরি ক্যাশ থেকে পুনরুদ্ধার করতে পারেন।

এই টিউটোরিয়ালে, আমরা দেখব কিভাবে Spring AOP এর মাধ্যমে ক্যাশিং কার্যকরী করা যায়।


Spring AOP এবং Caching

Spring AOP এর মাধ্যমে ক্যাশিং সাধারণত method-level caching এর মাধ্যমে করা হয়, যেখানে একটি মেথডের রিটার্ন ভ্যালু ক্যাশে সংরক্ষিত হয় এবং পরবর্তীতে সেই মেথড আবার কল করার সময় ক্যাশ থেকে ফলাফল সরাসরি ফেরত আসে। Spring Framework এর @Cacheable এবং @CacheEvict অ্যানোটেশনগুলি ক্যাশিংয়ের জন্য ব্যবহৃত হয়। AOP এর মাধ্যমে, আমরা এই অ্যানোটেশনগুলির সাহায্যে ক্যাশিং লজিক অ্যাপ্লাই করতে পারি।


ক্যাশিং কনফিগারেশন

Spring AOP এর মাধ্যমে ক্যাশিং কার্যকরী করতে হলে, প্রথমে স্প্রিং ক্যাশিং কনফিগারেশন করতে হবে। এর জন্য Spring Cache API ব্যবহার করতে হয়, যা বিভিন্ন ক্যাশ প্রোভাইডার (যেমন, EhCache, Redis, SimpleMapCache ইত্যাদি) সাপোর্ট করে।

1. Spring Cache Configurations

@Configuration
@EnableCaching  // ক্যাশিং সক্ষম করা
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("employees"); // Simple in-memory cache manager
    }
}

এখানে:

  • @EnableCaching অ্যানোটেশনটি ক্যাশিং সক্ষম করে।
  • CacheManager বীনটি ক্যাশ ম্যানেজারের দায়িত্ব পালন করে, এখানে আমরা একটি সাধারণ ইন-মেমরি ক্যাশ ব্যবহার করেছি ConcurrentMapCacheManager

@Cacheable অ্যানোটেশন

@Cacheable অ্যানোটেশনটি স্প্রিং ক্যাশিংয়ের অন্যতম প্রধান অ্যানোটেশন। এটি ব্যবহৃত হয় একটি মেথডের রিটার্ন ভ্যালু ক্যাশে সংরক্ষণ করতে। পরবর্তী সময়ে যদি একই ইনপুট প্যারামিটার সহ ওই মেথড আবার কল করা হয়, তবে ক্যাশ থেকে ফলাফল সরাসরি ফেরত আসে এবং মেথডের কার্যকরী অংশটি কার্যকর হয় না।

উদাহরণ: @Cacheable ব্যবহার

ধরা যাক, একটি EmployeeService ক্লাস রয়েছে, যেখানে একটি মেথড কর্মচারীর ডেটা রিটার্ন করে। আমরা চাই, কর্মচারীর ডেটা একবার ক্যাশে চলে গেলে, পরবর্তীতে সেই ডেটা ক্যাশ থেকে ফেরত আসুক।

@Service
public class EmployeeService {

    @Cacheable("employees")
    public Employee getEmployeeById(Long id) {
        simulateSlowService();  // সিমুলেটেড স্লো সার্ভিস (যেমন ডেটাবেস কল)
        return new Employee(id, "John Doe", "Engineering");
    }

    // স্লো সার্ভিস সিমুলেটর
    private void simulateSlowService() {
        try {
            Thread.sleep(3000L);  // ৩ সেকেন্ড ডিলে
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }
}

এখানে:

  • @Cacheable("employees") অ্যানোটেশনটি ব্যবহার করে আমরা employees ক্যাশে কর্মচারীর তথ্য সংরক্ষণ করছি।
  • প্রথমবার যখন getEmployeeById মেথড কল করা হবে, তখন এটি স্লো সার্ভিস সিমুলেট করবে এবং ক্যাশে ডেটা সেভ করবে।
  • পরবর্তী সময় যদি একই ID দিয়ে মেথডটি আবার কল করা হয়, তবে ক্যাশ থেকে ডেটা সরাসরি ফিরে আসবে এবং স্লো সার্ভিস কল হবে না।

Employee ক্লাস

public class Employee {

    private Long id;
    private String name;
    private String department;

    public Employee(Long id, String name, String department) {
        this.id = id;
        this.name = name;
        this.department = department;
    }

    // Getters and setters
}

@CacheEvict অ্যানোটেশন

@CacheEvict অ্যানোটেশনটি ব্যবহৃত হয় ক্যাশ থেকে কোনো ডেটা মুছতে। এটি যখন কোনো মেথডে ব্যবহৃত হয়, তখন সেই মেথডের পরবর্তী এক্সিকিউশনের পর ক্যাশে সংরক্ষিত ডেটা মুছে ফেলা হয়।

উদাহরণ: @CacheEvict ব্যবহার

ধরা যাক, আমরা একটি EmployeeService ক্লাসে ক্যাশে থাকা কর্মচারীর ডেটা মুছে ফেলতে চাই যখন একটি কর্মচারীর ডেটা আপডেট হয়।

@Service
public class EmployeeService {

    @Cacheable("employees")
    public Employee getEmployeeById(Long id) {
        simulateSlowService();
        return new Employee(id, "John Doe", "Engineering");
    }

    @CacheEvict(value = "employees", key = "#id")
    public void updateEmployee(Long id, String name, String department) {
        // কর্মচারীর তথ্য আপডেট
        System.out.println("Updating employee: " + id);
    }

    private void simulateSlowService() {
        try {
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }
}

এখানে:

  • @CacheEvict(value = "employees", key = "#id") ক্যাশে থেকে employees ক্যাশটি মুছে ফেলার জন্য ব্যবহৃত হয় যখন updateEmployee মেথড কল হয়। key = "#id" নির্দেশ করে যে ক্যাশে থাকা নির্দিষ্ট কর্মচারীর আইডি অনুযায়ী ডেটা মুছে ফেলা হবে।

Spring AOP এবং Caching

Spring AOP এর মাধ্যমে ক্যাশিং কার্যকরী করতে হলে, @Cacheable এবং @CacheEvict অ্যানোটেশনগুলির মাধ্যমে অ্যাডভাইস ব্যবহৃত হয়। আপনি স্প্রিং এওপির মাধ্যমে ক্যাশিং অপারেশনকে অত্যন্ত কার্যকরীভাবে পরিচালনা করতে পারেন, যেখানে বিভিন্ন মেথডের আগে বা পরে ক্যাশিং অপারেশন চালানো হয়।

উদাহরণ: AOP এর মাধ্যমে Caching

@Aspect
@Component
public class CachingAspect {

    @Before("execution(* com.example.service.EmployeeService.getEmployeeById(..))")
    public void cacheBefore(JoinPoint joinPoint) {
        System.out.println("Before fetching employee data: " + joinPoint.getSignature().getName());
    }

    @After("execution(* com.example.service.EmployeeService.getEmployeeById(..))")
    public void cacheAfter(JoinPoint joinPoint) {
        System.out.println("After fetching employee data: " + joinPoint.getSignature().getName());
    }
}

এখানে:

  • @Before এবং @After অ্যানোটেশনগুলি ব্যবহার করা হয়েছে, যা ক্যাশিং লজিক সম্পাদন করতে সহায়তা করবে এবং ক্যাশিংয়ের পূর্ববর্তী এবং পরবর্তী অবস্থায় কার্যকরী হবে।

সারাংশ

Spring AOP এর মাধ্যমে ক্যাশিং কার্যকরী করা খুবই শক্তিশালী এবং কার্যকরী উপায় যা ডেটার পুনরাবৃত্তি প্রসেসিং কমাতে এবং অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করতে সাহায্য করে। @Cacheable, @CacheEvict এবং AOP এর ব্যবহারে ক্যাশিং অপারেশন সম্পাদন করা যায়। Spring AOP এর মাধ্যমে ক্যাশিং লজিক বাস্তবায়ন করলে, আপনি আপনার অ্যাপ্লিকেশনের কর্মক্ষমতা অনেক উন্নত করতে পারবেন, বিশেষত যখন একই ডেটা বারবার ব্যবহার করা হয়।

Content added By
Promotion

Are you sure to start over?

Loading...