Java Technologies Spring Boot এবং Caching গাইড ও নোট

274

Spring Boot Caching হল Spring Framework এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডাটাবেস বা অন্য কোনো উৎস থেকে তথ্য পুনরায় একাধিকবার লোড হওয়ার প্রয়োজনীয়তা দূর করে, এবং এটি সিস্টেমের পারফরম্যান্স উন্নত করতে সাহায্য করে। Caching ব্যবহারের মাধ্যমে ডাটাবেস, API বা অন্যান্য উপাদান থেকে অতিরিক্ত ডাটা রিকোয়েস্ট কমানো যায় এবং অ্যাপ্লিকেশনের কার্যকারিতা দ্রুত করা সম্ভব হয়। Spring Boot এর মধ্যে বিভিন্ন ক্যাশিং মেকানিজম রয়েছে, যেমন EHCache, Redis, ConcurrentMap ইত্যাদি, যেগুলোর মাধ্যমে অ্যাপ্লিকেশন ডেটা ক্যাশ করা হয়।


Spring Boot Caching এর মূল ধারণা

Caching সাধারণত ডাটা দ্রুত অ্যাক্সেসের জন্য ব্যবহার করা হয়, যেখানে ডাটাবেস বা অন্যান্য সিস্টেম থেকে বার বার একই তথ্য নেয়া হয় না। একবার যখন ডাটা ক্যাশে রাখা হয়, তখন পরবর্তী বার সেই একই ডাটা ক্যাশ থেকে নেয়া হয়, ফলে সময় এবং সিস্টেম রিসোর্স সাশ্রয় হয়।

Spring Boot এ ক্যাশিং এর প্রধান বৈশিষ্ট্যগুলো হলো:

  • Automatic Cache Management (স্বয়ংক্রিয় ক্যাশ ম্যানেজমেন্ট): Spring Boot ক্যাশিং সরঞ্জামগুলির মাধ্যমে ডাটা ক্যাশ করা যায় এবং ক্যাশের মেয়াদ নিয়ন্ত্রণ করা যায়।
  • Multiple Cache Providers (বিভিন্ন ক্যাশ সরবরাহকারী): Spring Boot বিভিন্ন ক্যাশিং স্ট্রাটেজি সমর্থন করে, যেমন Redis, EhCache, ConcurrentMap ইত্যাদি।
  • Annotations (এনোটেশন): Spring Boot ক্যাশিং চালু করার জন্য বিভিন্ন এনোটেশন ব্যবহার করা হয়, যেমন @Cacheable, @CacheEvict, @CachePut ইত্যাদি।

Spring Boot Caching সেটআপ

Spring Boot Caching ব্যবহারের জন্য প্রথমে spring-boot-starter-cache ডিপেনডেন্সি যোগ করতে হবে, যা Spring Framework এর ক্যাশিং ফিচার সক্রিয় করবে। আপনি যদি মেভেন ব্যবহার করেন, তাহলে pom.xml ফাইলে নিচের ডিপেনডেন্সি যোগ করতে হবে:

pom.xml ডিপেনডেন্সি:

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

এছাড়া, ক্যাশ সরবরাহকারী হিসেবে EhCache অথবা Redis ব্যবহার করতে চাইলে তাদের জন্যও ডিপেনডেন্সি যোগ করতে হবে।

Redis ডিপেনডেন্সি (যদি Redis ব্যবহার করতে চান):

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

EhCache ডিপেনডেন্সি (যদি EhCache ব্যবহার করতে চান):

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

Spring Boot Caching কনফিগারেশন

Spring Boot Caching সক্ষম করার জন্য ক্যাশ কনফিগারেশন ক্লাস তৈরি করতে হবে। নিচে একটি উদাহরণ দেওয়া হলো যেখানে EhCache ব্যবহৃত হচ্ছে।

1. Caching কনফিগারেশন ক্লাস:

package com.example.demo;

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CacheConfig {
    // এখানে ক্যাশ কনফিগারেশন যোগ করতে পারবেন
}

@EnableCaching এনোটেশন ব্যবহার করে Spring Boot ক্যাশিং সক্রিয় করা হয়।


Spring Boot Caching এর এনোটেশন ব্যবহার

Spring Boot Caching এ @Cacheable, @CacheEvict, এবং @CachePut এনোটেশনগুলি ব্যবহার করা হয়।

1. @Cacheable এনোটেশন

এই এনোটেশন ব্যবহার করা হয় যখন আপনি চান একটি মেথডের আউটপুট ক্যাশে সঞ্চয় করা হোক, এবং একই ইনপুটের জন্য পরবর্তী সময়ে পুনরায় মেথডটি চালানো না হয়ে ক্যাশ থেকে আউটপুট ফিরে আসুক।

package com.example.demo;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable("users")
    public String getUserNameById(int id) {
        // সিমুলেটেড দীর্ঘ লোডিং
        try {
            Thread.sleep(3000); // 3 সেকেন্ড
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "User " + id;
    }
}

এখানে, @Cacheable("users") নির্দেশ করে যে getUserNameById মেথডটির আউটপুট ক্যাশে রাখা হবে। পরবর্তী সময়ে একই ইনপুট হলে, ক্যাশ থেকে ডাটা ফিরিয়ে দেয়া হবে।

2. @CacheEvict এনোটেশন

এই এনোটেশনটি ক্যাশ থেকে কোনো নির্দিষ্ট ডাটা মুছে ফেলতে ব্যবহৃত হয়।

package com.example.demo;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CacheEvict(value = "users", allEntries = true)
    public void clearUserCache() {
        // ক্যাশ ক্লিয়ার করার জন্য মেথড
    }
}

@CacheEvict(value = "users", allEntries = true) দ্বারা users ক্যাশের সব এন্ট্রি মুছে ফেলা হবে।

3. @CachePut এনোটেশন

এনোটেশনটি ব্যবহার করা হয় যখন আপনি চান ক্যাশের মধ্যে কোনো নতুন ভ্যালু আপডেট বা যুক্ত করা হোক।

package com.example.demo;

import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CachePut(value = "users", key = "#id")
    public String updateUserName(int id, String name) {
        // ডাটাবেস বা অন্য কোনো উৎস থেকে ডাটা আপডেট
        return name;
    }
}

@CachePut দ্বারা users ক্যাশে নির্দিষ্ট ব্যবহারকারীর জন্য নতুন নাম আপডেট করা হবে।


Spring Boot Caching এর সুবিধা

  • পারফরম্যান্স উন্নয়ন: ক্যাশিং ব্যবহার করার ফলে ডাটাবেস বা অন্যান্য সিস্টেম থেকে বার বার একই ডাটা লোড না হয়ে, ক্যাশ থেকে দ্রুত তথ্য পাওয়া যায়।
  • ডাটা এক্সেসের গতি বৃদ্ধি: ক্যাশিং কার্যকারিতার ফলে সিস্টেমের প্রতিক্রিয়া সময় কমে যায় এবং ব্যবহারকারীদের জন্য অ্যাপ্লিকেশন দ্রুত কাজ করে।
  • সিস্টেমের রিসোর্স সাশ্রয়: ক্যাশিং এর মাধ্যমে ডাটাবেসের উপর চাপ কমানো যায়, যার ফলে সিস্টেমের রিসোর্স বাঁচানো যায়।

সারাংশ

Spring Boot Caching একটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডাটাবেস বা অন্যান্য সিস্টেম থেকে অতিরিক্ত ডাটা রিকোয়েস্ট কমানোর মাধ্যমে পারফরম্যান্স উন্নত করতে সহায়তা করে। Spring Boot এর মধ্যে ক্যাশিং সক্ষম করার জন্য সহজ কনফিগারেশন এবং বিভিন্ন ক্যাশ সরবরাহকারী (যেমন Redis, EhCache) সমর্থন করা হয়। @Cacheable, @CacheEvict, এবং @CachePut এনোটেশন ব্যবহার করে Spring Boot অ্যাপ্লিকেশনগুলিতে ক্যাশিং কার্যকর করা যায়, যা অ্যাপ্লিকেশনের কার্যকারিতা উন্নত করতে সাহায্য করে।

Content added By

Spring Boot তে Caching এর প্রয়োজনীয়তা

293

Caching একটি শক্তিশালী প্রযুক্তি যা ওয়েব অ্যাপ্লিকেশনগুলির পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়। Spring Boot তে Caching ব্যবহারের মাধ্যমে আপনি অ্যাপ্লিকেশনের ডেটা দ্রুত এক্সেস করতে পারেন, যা লোড টাইম কমায় এবং সার্ভার রিসোর্সের অপচয় কমায়। এতে অ্যাপ্লিকেশনের কার্যকারিতা এবং স্কেলেবিলিটি বৃদ্ধি পায়।


Spring Boot তে Caching এর প্রয়োজনীয়তা

1. পারফরম্যান্স উন্নয়ন

ক্যাশিং ডেটাকে স্টোর করে রাখে যাতে পরবর্তী অনুরোধে সেগুলি দ্রুত পাওয়া যায়। এটি ডেটাবেস বা অন্যান্য ডেটা সোর্স থেকে বারবার ডেটা আনতে হয় না, ফলে অ্যাপ্লিকেশনটি দ্রুত রেসপন্ড করে।

  • উদাহরণ: ধরুন, একটি ইউজার ইনফরমেশন বারবার ডেটাবেস থেকে ফেরত আনা হচ্ছে। কিন্তু যদি সেই ইনফরমেশন একবার ক্যাশে রাখা হয়, তাহলে পরবর্তী অনুরোধগুলো ক্যাশ থেকেই পাওয়া যাবে এবং ডেটাবেস কলের প্রয়োজন হবে না।
@Cacheable("users")
public User getUserById(Long userId) {
    // Database call here
    return userRepository.findById(userId).orElse(null);
}

এখানে, @Cacheable অ্যনোটেশনটি নিশ্চিত করবে যে getUserById() মেথডের ফলাফল ক্যাশে সঞ্চিত হবে এবং পরবর্তী অনুরোধে ডেটাবেস কল না করেই তা সরাসরি ক্যাশ থেকে ফেরত আসবে।

2. লোড টাইম কমানো

প্রতিটি ডেটা প্রক্রিয়াকরণ এবং সার্ভারে বিভিন্ন অনুরোধের জন্য নতুনভাবে ডেটা পাওয়ার পরিবর্তে ক্যাশিং ব্যবহার করলে সিস্টেমের লোড টাইম অনেক কমে যায়। এটি ব্যবহারকারীর অভিজ্ঞতা উন্নত করে এবং অ্যাপ্লিকেশনের প্রতিক্রিয়া আরও দ্রুত করে তোলে।

  • উদাহরণ: একটি ওয়েব পেজে একাধিক ডেটাবেস কল করা হচ্ছে। যদি সেই পেজের কিছু অংশের ডেটা পরিবর্তন না হয়, তবে ক্যাশিং ব্যবহার করে ডেটা আগেই লোড করা যায়, যাতে পুনরায় সেই ডেটা লোড না হয়।

3. ডেটাবেস লোড কমানো

ডেটাবেসের ওপর অতিরিক্ত চাপ কমাতে ক্যাশিং গুরুত্বপূর্ণ ভূমিকা পালন করে। ক্যাশিং ডেটাবেসের অনুরোধগুলিকে হালনাগাদ রাখে এবং সিস্টেমকে খুব দ্রুত পরিচালিত করতে সহায়তা করে। এটি অ্যাপ্লিকেশন এবং ডেটাবেসের মধ্যে ভারসাম্য তৈরি করে।

  • উদাহরণ: একটি ব্যবহারকারী বারবার একটি পেইজ এক্সেস করে যেখানে একই ডেটা থাকে। ডেটাবেসে বারবার একই তথ্য অনুসন্ধান না করে, ক্যাশে সেই ডেটা রাখা হলে, ডেটাবেসের অনুরোধ কমে যাবে এবং পারফরম্যান্স উন্নত হবে।

4. রিসোর্স অপ্টিমাইজেশন

ক্যাশিং ব্যবহারের ফলে সার্ভার এবং ডেটাবেসের রিসোর্স অপটিমাইজ হয়, কারণ বারবার ডেটা রিকোয়েস্টের প্রয়োজন হয় না। এটি অ্যাপ্লিকেশনের স্কেলেবিলিটি এবং স্থিতিস্থাপকতা (resilience) বাড়ায়।

  • উদাহরণ: একটি API কলের মাধ্যমে অনেক ডেটা সংগ্রহ করা হচ্ছে, তবে ক্যাশিং সেটি স্টোর করে রাখবে, যাতে একই ডেটা আবার রিকোয়েস্ট করা হলে নতুনভাবে তা ডাউনলোড করার প্রয়োজন না পড়ে।

5. ক্যাশে কন্ট্রোল এবং ডিস্কাউন্টিং

Spring Boot Caching আপনাকে ক্যাশে কন্ট্রোল করতে সাহায্য করে, যেমন ক্যাশে এক্সপায়ারি, রিফ্রেশিং এবং ক্লিনআপ। এর মাধ্যমে আপনার অ্যাপ্লিকেশনের সিস্টেম রিসোর্স অপচয় কমে এবং সঠিক সময়ের মধ্যে ক্যাশে ডেটা আবার রিফ্রেশ হতে পারে।

  • উদাহরণ: কোনো পণ্য বা সেবার মূল্য ক্যাশে রাখা হলে, সেই পণ্য বা সেবার মূল্য পরিবর্তন হলে ক্যাশের ডেটা পুনরায় আপডেট করা যেতে পারে।
@Cacheable(value = "products", key = "#productId", unless = "#result == null")
public Product getProductById(Long productId) {
    return productRepository.findById(productId).orElse(null);
}

এখানে, unless = "#result == null" শর্তটি নিশ্চিত করে যে যদি কোনো প্রোডাক্ট না পাওয়া যায়, তবে ক্যাশে কিছুই সেভ হবে না।


Spring Boot তে Caching কনফিগারেশন

Spring Boot অ্যাপ্লিকেশনে Caching কনফিগার করার জন্য কিছু স্টেপ রয়েছে। এখানে কিভাবে Spring Boot এ Caching সেটআপ করবেন তা দেখানো হলো।

1. Spring Boot Caching ইন্টিগ্রেশন

Spring Boot-এ ক্যাশিং ব্যবহার করতে প্রথমে spring-boot-starter-cache ডিপেনডেন্সি যোগ করতে হবে।

Maven ডিপেনডেন্সি:

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

Gradle ডিপেনডেন্সি:

implementation 'org.springframework.boot:spring-boot-starter-cache'

2. Caching Enable করা

Spring Boot অ্যাপ্লিকেশন ক্লাসে @EnableCaching অ্যনোটেশন যোগ করতে হবে, যাতে Spring Caching সিস্টেম সক্ষম হয়।

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

3. ক্যাশ কনফিগারেশন

Spring Boot-এ ক্যাশিং কনফিগারেশনের জন্য আপনি application.properties বা application.yml ফাইলে কিছু সেটিংস করতে পারেন। উদাহরণস্বরূপ, হ্যাজেলক্যাশ (Hazelcast) বা কফি (Caffeine) ক্যাশ ম্যানেজার ব্যবহার করতে পারেন।

spring.cache.type=caffeine

এটি Caffeine ক্যাশ ম্যানেজার ব্যবহার করবে।

4. ক্যাশ সঞ্চালন

Spring Boot Caching ব্যবহারের জন্য বিভিন্ন কৌশল ব্যবহার করা যেতে পারে যেমন @Cacheable, @CachePut, এবং @CacheEvict:

  • @Cacheable: একটি মেথডের ফলাফল ক্যাশে সঞ্চিত হয়।
  • @CachePut: ক্যাশে ডেটা আপডেট করার জন্য ব্যবহৃত হয়।
  • @CacheEvict: ক্যাশ থেকে ডেটা মুছে ফেলার জন্য ব্যবহৃত হয়।

সারাংশ

Spring Boot তে Caching ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি বৃদ্ধি পায়। ক্যাশিং ডেটার পুনরাবৃত্তি রিডাক্ট করে, ডেটাবেসের লোড কমিয়ে দেয় এবং অ্যাপ্লিকেশনকে দ্রুত প্রতিক্রিয়া দিতে সাহায্য করে। Spring Boot Caching ব্যবহারের জন্য বিভিন্ন ক্যাশ ম্যানেজার এবং কনফিগারেশন ব্যবহারের সুযোগ রয়েছে, যা আপনার অ্যাপ্লিকেশনকে আরও দক্ষ এবং গতিশীল করে তোলে।

Content added By

@EnableCaching এবং @Cacheable এর ব্যবহার

292

Spring Framework এ Caching (ক্যাশিং) হলো একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডাটা রিট্রিভাল প্রক্রিয়াকে দ্রুত এবং কার্যকরী করে তোলে। ক্যাশিংয়ের মাধ্যমে বারবার একই রকম ডেটা রিকোয়েস্ট করার বদলে, পূর্ববর্তী রিকোয়েস্টের ফলাফল ক্যাশে সংরক্ষিত থাকে এবং ভবিষ্যতে ঐ ডেটা দ্রুত পাওয়া যায়। Spring Boot এ ক্যাশিং বাস্তবায়ন করার জন্য @EnableCaching এবং @Cacheable অ্যানোটেশন দুটি ব্যবহৃত হয়।

@EnableCaching

@EnableCaching অ্যানোটেশন Spring Boot অ্যাপ্লিকেশনকে ক্যাশিং সমর্থন করার জন্য কনফিগার করে। এটি Spring কনটেইনারে ক্যাশিং কার্যকলাপ শুরু করার জন্য ব্যবহৃত হয় এবং ক্যাশিং এনেবেল করার জন্য এটি মেইন অ্যাপ্লিকেশন ক্লাসে যোগ করা হয়।

@Cacheable

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


@EnableCaching এর ব্যবহার

@EnableCaching একটি কনফিগারেশন অ্যানোটেশন, যা Spring অ্যাপ্লিকেশন কনটেইনারে ক্যাশিংয়ের সমর্থন সক্রিয় করে। এটি সাধারণত অ্যাপ্লিকেশনের মূল ক্লাসে (যেমন, @SpringBootApplication ক্লাস) ব্যবহার করা হয়।

উদাহরণ:

@SpringBootApplication
@EnableCaching
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

এই কনফিগারেশনটি ক্যাশিং কার্যকলাপকে সক্রিয় করে এবং Spring Boot অ্যাপ্লিকেশনকে ক্যাশিংয়ের জন্য প্রস্তুত করে।


@Cacheable এর ব্যবহার

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

উদাহরণ:

ধরা যাক, একটি সিম্পল সেবা রয়েছে যা ব্যবহারকারীদের তথ্য রিটার্ন করবে। আমরা এখানে @Cacheable ব্যবহার করব যাতে একবার ব্যবহারকারীর তথ্য লোড হলে পরবর্তীতে সেই তথ্য ক্যাশে রাখা হয় এবং পুনরায় লোড করতে না হয়।

@Service
public class UserService {

    @Cacheable("users")  // "users" ক্যাশ নামের মধ্যে ফলাফল সংরক্ষণ হবে
    public User getUserById(Long id) {
        simulateSlowService();  // ধরা যাক এখানে একটি ধীর কাজ হচ্ছে (যেমন ডাটাবেস থেকে রেকর্ড আনা)
        return new User(id, "User Name");
    }

    private void simulateSlowService() {
        try {
            Thread.sleep(3000L);  // 3 সেকেন্ডের বিলম্ব তৈরি করার জন্য
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

এখানে @Cacheable("users") অ্যানোটেশন ব্যবহার করা হয়েছে। এর মানে হল যে getUserById() মেথডটি যখন প্রথমবার কোনো ইউজার আইডি দিয়ে কল করা হবে, তখন এই মেথডটি তিন সেকেন্ড সময় নিবে এবং তারপর রিটার্ন করা ডেটা ক্যাশে সংরক্ষিত হবে। পরবর্তী সময়ে যদি একই ইউজার আইডি দিয়ে কল করা হয়, তবে এটি ক্যাশ থেকে সরাসরি রিটার্ন হবে এবং আবার সেই স্লো সার্ভিস কল করা হবে না।

কনফিগারেশন

Spring Boot অ্যাপ্লিকেশন ডিফল্টভাবে SimpleMapCacheManager ব্যবহার করে ক্যাশিং পরিচালনা করে, যা মেমরি-ভিত্তিক ক্যাশ ব্যবহারের জন্য ব্যবহৃত হয়। তবে, আপনি চাইলে অন্যান্য ক্যাশ ম্যানেজার যেমন EhCache, Redis, Hazelcast ইত্যাদিও ব্যবহার করতে পারেন।

যদি Redis ক্যাশিং ব্যবহার করতে চান, তবে আপনার পম.xml ফাইলে Redis ডিপেনডেন্সি যুক্ত করতে হবে:

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

এছাড়া, application.properties ফাইলে Redis এর কনফিগারেশন করতে হবে:

spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379

এখন, Spring Redis ক্যাশ ব্যবহার করবে এবং ডাটা Redis সিস্টেমে সংরক্ষণ করবে।


@CachePut এবং @CacheEvict

Spring Security আরও দুটি গুরুত্বপূর্ণ ক্যাশ অ্যানোটেশন সরবরাহ করে: @CachePut এবং @CacheEvict

  • @CachePut: এটি ক্যাশের মধ্যে মান আপডেট করার জন্য ব্যবহৃত হয়। এই অ্যানোটেশনটি মেথডে ব্যবহার করা হলে, ক্যাশে নতুন মান আপডেট হয়।

    উদাহরণ:

    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        return userRepository.save(user);
    }
    
  • @CacheEvict: এটি ক্যাশ থেকে মান মুছে ফেলার জন্য ব্যবহৃত হয়। এটি ক্যাশ ক্লিন করার জন্য ব্যবহৃত হয়, উদাহরণস্বরূপ, যখন একটি ইউজার ডিলিট হয়।

    উদাহরণ:

    @CacheEvict(value = "users", key = "#user.id")
    public void deleteUser(User user) {
        userRepository.delete(user);
    }
    

সারাংশ

Spring Boot এ ক্যাশিং ব্যবহারের জন্য @EnableCaching এবং @Cacheable অ্যানোটেশন খুবই গুরুত্বপূর্ণ। @EnableCaching Spring Boot অ্যাপ্লিকেশনকে ক্যাশিংয়ের জন্য প্রস্তুত করে এবং @Cacheable ব্যবহারকারীর রিকোয়েস্ট অনুযায়ী ক্যাশে ডেটা সংরক্ষণ করে, যাতে পরবর্তীতে একই রিকোয়েস্টের জন্য ডেটা পুনরায় রিটার্ন করা হয়। ক্যাশিংয়ের মাধ্যমে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি পায় এবং সিস্টেমে লোড কমে যায়।

Content added By

Redis এবং EhCache এর সাথে Integration

263

ক্যাশিং (Caching) একটি গুরুত্বপূর্ণ টেকনিক যা অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সাহায্য করে। স্প্রিং বুটে Redis এবং EhCache দুটি জনপ্রিয় ক্যাশিং টুল যা ডেটা স্টোরেজের দ্রুত অ্যাক্সেস নিশ্চিত করতে ব্যবহৃত হয়। Redis একটি ইন-মেমরি ডেটাবেস এবং EhCache একটি Java ভিত্তিক ক্যাশিং লাইব্রেরি। এই দুটি প্রযুক্তি স্প্রিং বুটের সঙ্গে ইন্টিগ্রেট করলে আপনার অ্যাপ্লিকেশন দ্রুত পারফরম্যান্স প্রদান করতে সক্ষম হয়।

এই টিউটোরিয়ালে, আমরা দেখব কীভাবে স্প্রিং বুটে Redis এবং EhCache এর সাথে ইন্টিগ্রেশন করা যায়।


Redis এর সাথে স্প্রিং বুট ইন্টিগ্রেশন

Redis একটি ওপেন সোর্স ইন-মেমরি কেস-ভ্যালু ডেটাবেস যা ক্যাশিং এবং ডেটা স্টোরেজের জন্য ব্যবহৃত হয়। স্প্রিং বুট Redis এর সাথে খুব সহজে ইন্টিগ্রেট করা যায়, এবং এটি অ্যাপ্লিকেশনের ডেটা স্টোরেজ অপারেশনের পারফরম্যান্স উন্নত করতে সাহায্য করে।

১. প্রজেক্ট ডিপেনডেন্সি যোগ করা

Redis এর সাথে ইন্টিগ্রেশন করার জন্য আপনাকে spring-boot-starter-data-redis ডিপেনডেন্সি pom.xml ফাইলে যোগ করতে হবে।

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

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.6.0</version>
</dependency>

এখানে spring-boot-starter-data-redis ডিপেনডেন্সি Redis এর জন্য প্রয়োজনীয় ক্লাস এবং কনফিগারেশন দেয় এবং jedis Redis ক্লায়েন্ট লাইব্রেরি হিসেবে ব্যবহৃত হয়।

২. Redis কনফিগারেশন

application.properties ফাইলে Redis কনফিগারেশন যোগ করুন।

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=your_password  # যদি Redis সার্ভারের জন্য পাসওয়ার্ড থাকে

৩. RedisTemplate ব্যবহার করা

স্প্রিং বুট Redis এর সাথে যোগাযোগের জন্য RedisTemplate ব্যবহার করা হয়। এটি Redis ডেটা স্টোরেজের সাথে ইন্টারঅ্যাক্ট করতে সাহায্য করে।

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void setData(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public String getData(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

এখানে, setData মেথড Redis এ একটি কেস-ভ্যালু স্টোর করবে এবং getData মেথড সেই কেস-ভ্যালু থেকে ডেটা রিটার্ন করবে।

৪. Redis এর ব্যবহার

আপনি RedisService ক্লাসের মাধ্যমে Redis ক্যাশে ডেটা স্টোর এবং রিট্রিভ করতে পারবেন।

@RestController
@RequestMapping("/redis")
public class RedisController {

    @Autowired
    private RedisService redisService;

    @PostMapping("/set")
    public String setRedisData(@RequestParam String key, @RequestParam String value) {
        redisService.setData(key, value);
        return "Data saved to Redis";
    }

    @GetMapping("/get")
    public String getRedisData(@RequestParam String key) {
        return redisService.getData(key);
    }
}

এখানে setRedisData এবং getRedisData API ব্যবহার করে Redis এ ডেটা সেট এবং রিট্রিভ করা হচ্ছে।


EhCache এর সাথে স্প্রিং বুট ইন্টিগ্রেশন

EhCache একটি Java ভিত্তিক ক্যাশিং লাইব্রেরি যা সাধারণত ইন্ট্রানাল ক্যাশিং এবং মেমরি ক্যাশে ব্যবহৃত হয়। এটি সিম্পল এবং স্কেলেবল ক্যাশিং সলিউশন প্রদান করে। স্প্রিং বুটের সাথে EhCache খুব সহজেই ইন্টিগ্রেট করা যায়।

১. প্রজেক্ট ডিপেনডেন্সি যোগ করা

EhCache ইন্টিগ্রেট করার জন্য spring-boot-starter-cache এবং ehcache ডিপেনডেন্সি pom.xml ফাইলে যোগ করতে হবে।

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

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.9.6</version>
</dependency>

২. EhCache কনফিগারেশন

application.properties ফাইলে EhCache কনফিগারেশন যোগ করুন।

spring.cache.type=ehcache

৩. EhCache কনফিগারেশন ক্লাস তৈরি করা

এখন আপনাকে একটি ক্যাশ কনফিগারেশন ক্লাস তৈরি করতে হবে, যা EhCache কনফিগার করবে।

import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class EhCacheConfig {

    @Bean
    public CacheManager cacheManager() {
        org.ehcache.CacheManager ehCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
                .withCache("books",
                        CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class,
                                ResourcePoolsBuilder.heap(100)))
                .build(true);
        return new EhCacheCacheManager(ehCacheManager);
    }
}

এখানে, cacheManager মেথডটি EhCache কনফিগারেশন তৈরি করে এবং স্প্রিং কন্টেইনারে ক্যাশ ম্যানেজার রেজিস্টার করে।

৪. EhCache ব্যবহার করা

@Cacheable অ্যানোটেশন ব্যবহার করে ক্যাশিং চালু করা যায়। এই অ্যানোটেশনটি মেথডের ফলাফল ক্যাশে সেভ করতে ব্যবহার হয়।

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class BookService {

    @Cacheable(value = "books", key = "#id")
    public String getBookById(String id) {
        try {
            Thread.sleep(3000);  // Simulate time-consuming operation
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Book " + id;
    }
}

এখানে, getBookById মেথডটি প্রথমবার চালানোর পর ক্যাশে সেভ হবে এবং পরবর্তী কলগুলিতে ক্যাশ থেকে ডেটা রিটার্ন হবে।


সারাংশ

স্প্রিং বুটের সাথে Redis এবং EhCache ক্যাশিং ব্যবস্থার ইন্টিগ্রেশন অ্যাপ্লিকেশনের পারফরম্যান্স অনেক বাড়াতে সহায়তা করে। Redis ব্যবহৃত হয় একাধিক সার্ভারের মধ্যে ডিস্ট্রিবিউটেড ক্যাশিং সমাধান হিসাবে, যেখানে EhCache ব্যবহার করা হয় ইন-মেমরি ক্যাশিং এর জন্য। স্প্রিং বুটের সাহায্যে এই দুটি ক্যাশিং টুল সহজেই ইন্টিগ্রেট করা যায় এবং অ্যাপ্লিকেশনের ডেটা এক্সেস টাইম কমাতে পারে।

Content added By

উদাহরণ সহ Caching Implementation

289

Spring Boot অ্যাপ্লিকেশনে ক্যাশিং (Caching) ব্যবহার করা হলে অ্যাপ্লিকেশন দ্রুততর হতে পারে, বিশেষ করে যখন একাধিক বার একই তথ্য ডেটাবেস বা অন্যান্য সিস্টেম থেকে লোড করা হয়। ক্যাশিং ডেটাকে অস্থায়ীভাবে সঞ্চিত করে রাখে, ফলে সেই তথ্যটি পরবর্তী রিকোয়েস্টে দ্রুত পাওয়া যায়। Spring Boot ক্যাশিং সমর্থন করে এবং বিভিন্ন ক্যাশিং স্টোর (যেমন, EhCache, Redis, বা ইন-মেমরি ক্যাশ) ব্যবহার করে ক্যাশিং পরিচালনা করা যায়।

এখানে Spring Boot এ ক্যাশিং ব্যবহার করার উদাহরণ দেওয়া হয়েছে।


1. প্রয়োজনীয় ডিপেনডেন্সি ইনস্টল করা

Spring Boot ক্যাশিং ব্যবহার করতে হলে প্রথমে spring-boot-starter-cache ডিপেনডেন্সি আপনার pom.xml ফাইলে যোগ করতে হবে।

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Cache -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    <!-- EhCache (optional, if using EhCache) -->
    <dependency>
        <groupId>org.ehcache</groupId>
        <artifactId>ehcache</artifactId>
    </dependency>
</dependencies>

এখানে, spring-boot-starter-cache ডিপেনডেন্সিটি ক্যাশিং ফিচারটি সক্রিয় করবে এবং ehcache ডিপেনডেন্সি শুধু যদি আপনি EhCache ব্যবহার করতে চান।


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

Spring Boot অ্যাপ্লিকেশনে ক্যাশিং সক্ষম করতে @EnableCaching অ্যানোটেশন ব্যবহার করা হয়। এই অ্যানোটেশনটি Spring Boot কে বলে যে অ্যাপ্লিকেশনটি ক্যাশিং ব্যবহার করবে।

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

package com.example.helloworld.config;

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CacheConfig {
}

এখানে, @EnableCaching অ্যানোটেশন Spring Boot কে ক্যাশিং সক্রিয় করতে বলে, এবং CacheConfig ক্লাসটি একটি কনফিগারেশন ক্লাস হিসেবে কাজ করে।


3. ক্যাশিং ব্যবহার করা

Spring Boot এ ক্যাশিং ব্যবহার করতে হলে, @Cacheable অ্যানোটেশন ব্যবহার করা হয়। এটি ক্যাশে ফলাফল রাখতে সাহায্য করে, যাতে একই রিকোয়েস্ট পরবর্তীতে ক্যাশ থেকে রিটার্ন করা যায়, এবং আবার একই ডেটাবেস বা প্রসেসিং করা না লাগে।

3.1 ক্যাশিং ব্যবহার করে Service ক্লাস তৈরি করা

ধরা যাক, আমাদের একটি UserService ক্লাস আছে, যেখানে ইউজার তথ্য ডেটাবেস থেকে ফেচ করা হয়। আমরা এই মেথডে @Cacheable অ্যানোটেশন ব্যবহার করব।

package com.example.helloworld.service;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable("users")
    public String getUserInfo(Long userId) {
        // এখানে ডেটাবেস কল বা দীর্ঘ প্রসেসিং হতে পারে
        simulateSlowService();
        return "User Info for ID " + userId;
    }

    // দীর্ঘ প্রসেসিং সিমুলেট করা
    private void simulateSlowService() {
        try {
            Thread.sleep(3000L); // 3 সেকেন্ড স্লিপ
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

এখানে, @Cacheable("users") অ্যানোটেশনটি বলে যে getUserInfo মেথডের ফলাফল ক্যাশে সেভ হবে, এবং পরবর্তীতে একই userId দিয়ে এই মেথডটি কল করলে ক্যাশ থেকে ফলাফল পাওয়া যাবে। users ক্যাশ নামক একটি ক্যাশ ব্যবহার করা হবে।


4. ক্যাশ ম্যানেজমেন্ট

Spring Boot অ্যাপ্লিকেশন কনফিগারেশনে ক্যাশ স্টোর এবং ক্যাশ প্রোপার্টিজ সেট করা যেতে পারে। যদি আপনি EhCache ব্যবহার করতে চান, তাহলে একটি কনফিগারেশন ফাইল তৈরি করতে হবে।

4.1 EhCache কনফিগারেশন

<!-- src/main/resources/ehcache.xml -->
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.ehcache.org/ehcache.xml http://www.ehcache.org/schema/ehcache-core-2.10.xsd">

    <cache alias="users" 
           maxEntriesLocalHeap="1000"
           eternal="false"
           timeToLiveSeconds="600" />
</ehcache>

এখানে, users ক্যাশে 1000টি এন্ট্রি সঞ্চিত হবে এবং প্রতিটি এন্ট্রি 600 সেকেন্ড (10 মিনিট) পরে এক্সপায়ার হবে।


5. ক্যাশিং ব্যবহার করে Controller তৈরি করা

এখন, আমরা একটি Controller ক্লাস তৈরি করব, যা UserService এর getUserInfo মেথড কল করবে।

5.1 Controller উদাহরণ

package com.example.helloworld.controller;

import com.example.helloworld.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/user/{id}")
    public String getUserInfo(@PathVariable Long id) {
        return userService.getUserInfo(id);
    }
}

এখানে, /user/{id} এ GET রিকোয়েস্ট আসলে, getUserInfo() মেথড কল হবে এবং প্রথমবারে এটি 3 সেকেন্ড সময় নিবে (কারণ সিমুলেটেড স্লো সার্ভিস)। তবে পরবর্তীতে একই id দিয়ে কল করলে, ক্যাশ থেকে সরাসরি ফলাফল পাওয়া যাবে এবং সময় লাগবে না।


6. ক্যাশ থেকে ডেটা মুছে ফেলা

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

6.1 ক্যাশ মুছে ফেলার উদাহরণ

package com.example.helloworld.service;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CacheEvict(value = "users", allEntries = true)
    public void evictAllUsersFromCache() {
        System.out.println("All users removed from cache");
    }
}

এখানে, @CacheEvict অ্যানোটেশন ব্যবহার করে users ক্যাশ থেকে সব এন্ট্রি মুছে ফেলা হচ্ছে। allEntries = true নিশ্চিত করে যে সমস্ত এন্ট্রি ক্যাশ থেকে সরানো হবে।


7. ক্যাশ স্ট্যাটাস চেক করা

Spring Boot অ্যাপ্লিকেশন চলাকালে ক্যাশ স্ট্যাটাস চেক করতে, Spring Boot অ্যাপ্লিকেশন লগ ব্যবহার করতে পারেন অথবা আপনি JMX (Java Management Extensions) ব্যবহার করে ক্যাশ স্ট্যাটাস মনিটর করতে পারবেন।


সারাংশ

Spring Boot এ ক্যাশিং ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনটি দ্রুততর এবং দক্ষ করা যায়। @EnableCaching অ্যানোটেশন ক্যাশিং সক্রিয় করে এবং @Cacheable ব্যবহার করে ডেটা ক্যাশে রাখা হয়। ক্যাশে ডেটা থাকলে পরবর্তী রিকোয়েস্টে দ্রুত ফলাফল পাওয়া যায়। Spring Boot ক্যাশিং সমর্থন করে বিভিন্ন ক্যাশ স্টোর যেমন EhCache, Redis ইত্যাদি। @CacheEvict অ্যানোটেশন ব্যবহার করে ক্যাশ থেকে ডেটা মুছে ফেলা যায়। Spring Boot ক্যাশিং একটি শক্তিশালী বৈশিষ্ট্য যা আপনার অ্যাপ্লিকেশনকে স্কেলেবল এবং দ্রুত করে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...