Sử dụng Memcached với Memcached Java Client

Chào mừng các bạn đã đến với thachleblog, ở bài trước, mình đã giới thiệu sơ lược về Memcached đồng thời hướng dẫn cách cài đặt cùng 1 vài thao tác cơ bản với memcached trên terminal. Ở bài này, mình sẽ viết một demo đơn giản để các bạn làm quen với Java memcached Client. Nào chúng ta cùng bắt đầu nhé.

Các bạn có bao giờ gặp tính năng giới hạn truy cập khi thao tác quá nhanh trên một ứng dụng, hoặc nhận thông báo bạn đã truy cập quá số lần cho phép? Để làm tính năng giới hạn truy cập này thì có nhiều cách, chúng ta có thể lưu số lần truy cập của user vào database hoặc thậm chí là 1 biến static. Nhưng cách đơn giản là chúng ta có thể sử dụng memcached.

Có vài lý do để chúng ta chọn memcached cho tính năng này đó là truy cập trên memecached sẽ nhanh hơn so với sử dụng database đồng thời memcached hỗ trợ các tính năng như là tự động expired sau một khoảng thời gian (tự động mở lại cho user truy cập), tăng giá trị cho value… Thêm một lý do khác để chọn memcached thay vì các loại cache local là vì đối với ứng dụng được deploy trên nhiều instance, sử dụng cache local chúng ta sẽ phải handle thêm các bước đồng bộ dữ liệu cache trên các intance. Làm mệt mà dễ có bug, hehe.

Để kết nối memcached bằng Java chúng ta có thể sử dụng các libs spymemcached, xmemcached hoặc gwhalin memcached client… Ở demo này, mình sẽ sử dụng spymemcached.

Việc đầu tiên là tải về spymemcached. Và tất nhiên là đã có memcached. Đầu tiên, mình cần init connect tới memcached (tương tự như database vậy). Với spymemcached chúng ta có thể thao tác như sau:

  1. MemcachedClient memcachedClient = MemcachedClient(new InetSocketAddress(HOST, PORT));

Ở đây, mình thiết lập cho thời gian expire cache là 60s. Mình cần giới hạn user chỉ được phép truy cập tính năng này tối đa là 5 lần 1 phút. Do đó, mỗi lần user truy cập, mình sẽ kiểm tra thông tin username (thông tin duy nhất để phân biệt user, nên là uid) trong cache.

Nếu là lần đầu tiên thì sẽ cho phép truy cập, đồng thời ghi vào cache với thông tinh key – value là username – 1. Tương tự các lần tiếp theo mình sẽ cho phép truy cập và tăng số lần truy cập lên. Cuối cùng, nếu user đó truy cập quá số lần cho phép trong 60s thì sẽ bị chặn. Sau thời gian 60s, dữ liệu sẽ bị expire và user sẽ có truy cập như lúc đầu.

Code demo:

 

package memcached;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import net.spy.memcached.MemcachedClient;
 
/**
 *
 * @author thachlp
 */
public class UserLimitAccess {
 
    private static final int LIMIT_PER_MINUTE = 5;
    private static final int TIME_EXPIRED = 60;
    private static final String HOST = "127.0.0.1";
    private static final int PORT = 11211;
 
    private static MemcachedClient memcachedClient;
 
    public static void initMemcached() {
        try {
            memcachedClient = new MemcachedClient(new InetSocketAddress(HOST, PORT));
            System.out.println("Connection to server sucessful.");
        } catch (IOException ex) {
            System.out.println("Can not connect to memcache server: " + ex.getMessage());
        }
    }
 
    public static boolean isLimitedAccess(String userName) {
        Object accessCount = memcachedClient.get(userName);
        // the fist time user login
        if (accessCount == null) {
            memcachedClient.add(userName, TIME_EXPIRED, "1");
            return true;
        }
 
        int numberAccess = Integer.parseInt((String)accessCount);
        // user access over the limit access
        if (numberAccess > LIMIT_PER_MINUTE) {
            return false;
        } else {
            memcachedClient.incr(userName, 1);
            return true;
        }
    }
 
    public static void main(String[] args) {
        initMemcached();
        // can access
        if (isLimitedAccess("thachle")) {
            System.out.println("Welcome to thachle blog");
        } else {
            System.out.println("You have accessed over limit per minute, please get back after 1 minute");
 
        }
        System.exit(0);
    }
 
}

Ứng dụng đã test lần đầu và thấy ok ^.^.

Vừa rồi là phần demo của mình về cách sử dụng memcached với Java. Quá đơn giản phải không. Tất nhiên trong các ứng dụng thực tế chúng ta cần thêm các config về pool… để tăng tốc độ cho memecached.

Mọi góp ý về cách trình bày, code hoặc bất cứ thứ gì có thể comment bên dưới, mình sẽ theo dõi nhé. Cảm ơn các bạn đã đọc và hẹn gặp lại các bạn ở các bài viết sau.

Memcached: giới thiệu và cài đặt

Ở bài trước, mình đã giới thiệu về cache với guava. Về cơ bản, guava là local cache, dữ liệu cache sẽ được lưu trữ cùng với bộ nhớ của ứng dụng (JVM), dữ liệu cache sẽ mất khi restart ứng dụng. Khác với guava, memcached là cache server, dữ liệu cache sẽ được lưu trữ ở server, có thể cùng hoặc khác với server deploy ứng dụng. Do đó, dữ liệu cache chỉ mất khi restart memcached hoặc server.

Bài viết hôm nay mình sẽ giới thiệu về memcached, cách cài đặt, một vài thao tác với memcached trên server cho những bạn mới bắt đầu làm quen với memcached. Nào, chúng ta cùng bắt đầu nhé.

Giới thiệu

Memcached là một in-memory cache, lưu trữ dữ liệu dưới dạng key-value. Tất cả các operation sẽ đều có độ phức tạp là O(1).

Thường thì mình sử dụng memcached để cache kết quả các request đọc vào database mà kết quả trả về chậm, hoặc các request với cường độ lớn. Tốc độ API sẽ tăng đáng kể sau khi dùng cache.

Về expired, chúng ta có thể set time expired cho value cache. Tuy nhiên, cơ chế evicted mặc định của  memcached là LRU (Least Recently Used). Lưu ý là do không có cơ chế persistence như Redis, do đó memcached chỉ được sử dụng để cache, không thể sử dụng memcached như là một database.

Các bạn có thể đọc thêm về memcache tại trang chủ. Phần tiếp theo mình sẽ hướng dẫn cài đặt.

Cài đặt

Để cài đặt memcached trên ubuntu, đơn giản nhất, các bạn có thể dùng lệnh:

sudo apt-get install memcached

Cài đặt memcached trên ubuntu

Thông báo memcached đã được cài đặt version mới nhất

Sau khi được cài đặt, server memcached sẽ được start, các bạn có thể kiểm tra thông memcached đang chạy bằng lệnh:

ps -ef | grep mem

Kiểm tra memcached đang chạy

Thông tin server memcached đang chạy

Đến lúc này, chúng ta đã có thể thao tác với memcached. Chúng ta có thể connect đến memcached bằng lệnh telnets:

telnet localhost 11211

Telnet

Telnet để connect với memcached và stats để xem thông tin

Sau khi connect đến memcache, việc đầu tiên mình thương làm là chạy lệnh stats. Lệnh stats khá quan trọng vì sẽ show tất cả thông tin về memcached bao gồm version, total_items, curr_items, get_hits, get_misses … giúp chúng ta kiểm tra tình trạng của memcached.

Vì memcached cung cấp service access thông qua App Engine API, do đó, sau khi connect, chúng ta có thể thực hiện các thao tác như add, set, get, delete… bằng command. Thông thường mình chỉ dùng các command set, get sau khi set up memcached để chắc chắn là memcached hoạt động tốt. Các bạn có thể xem thêm các command của memcached tại đây

Để thao tác với memcached bằng Java, chúng ta cần Java memcached client. Có thể mình sẽ có 1 demo nhỏ về sử dụng memcached bằng Java client ở bài viết sau.

Thông thường, khi server memcached có vấn đề, chúng ta có thể dùng thần chú restart bằng lệnh:

 /etc/init.d/memcached restart

Lệnh restart server memcached khi cần

Kết

Vừa rồi là phần giới thiệu cài đặt và một vài thao tác đơn giản cho các bạn mới làm quen với memcached. Ở bài sau, nếu cần có thể mình sẽ có một demo nhỏ sử dụng memcached với Java client. Mọi ý kiến đóng góp của các bạn vui lòng comment bên dưới, mình sẽ follow.

Cảm ơn và hẹn gặp các bạn ở các bài viết sau.