Memcached là gì? Từ A-Z những điều bạn cần biết

Khi nói đến cải thiện hiệu suất ứng dụng và tối ưu hóa quy trình làm việc, Memcached đã từ lâu trở thành một công cụ không thể thiếu. Trong hành trình khám phá Memcached là gì, chúng ta sẽ đắm chìm vào thế giới của hệ thống cache phân tán, từ cách hoạt động đến việc cài đặt, quản lý và bảo mật. Đón chào sự tiến bộ trong hiệu suất ứng dụng của bạn với hướng dẫn toàn diện về Memcached trong bài viết này nhé!

Memcached là gì?

  • Memcached là một hệ thống lưu trữ bộ nhớ đệm hiệu suất cao miễn phí và mã nguồn mở. Nó thường được sử dụng để lưu trữ dữ liệu cơ sở dữ liệu, lệnh gọi API hoặc khối kết xuất trang trong RAM để tăng hiệu suất ứng dụng.
  • Nó có thể lưu trữ dữ liệu nhỏ như một con số hoặc lớn như một trang HTML đã hoàn thành.
  • Hệ thống được thiết kế để có thể truy cập thông qua TCP nên có thể hoạt động trên một máy chủ riêng biệt và cũng có thể được phân phối giữa một số máy chủ, tổng hợp một bảng băm lớn để lưu trữ dữ liệu.
  • Khi hết dung lượng, dữ liệu cũ sẽ bị ghi đè. Vì vậy, nó phải được coi là bộ đệm tạm thời (không liên tục), nghĩa là dữ liệu của bạn có thể không còn ở đó.

Cài đặt và thiết lập

Nếu bạn đang sử dụng macOS, việc cài đặt Memcached bằng Homebrew rất dễ dàng:

$ brew install memcached

Sau đó, bạn có thể khởi động bằng lệnh này:

$ /usr/local/opt/memcached/bin/memcached

Nếu đang sử dụng Linux, bạn có thể sử dụng trình quản lý gói của bản phân phối để cài đặt dễ dàng. 

Tham khảo một số hướng dẫn của chúng tôi: Cài đặt Memcached trên Ubuntu 20.04, Ubuntu 22.04, CentOS 7,...

Kết nối và tương tác

Cổng mặc định là 11211. Thử kết nối bằng Telnet:

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Tuyệt vời! Máy chủ đã hoạt động. Bây giờ thoát Telnet (sử dụng lệnh quit) và cài đặt Ruby gem để tương tác với máy chủ thoải mái hơn:

gem install dalli

Chạy bảng điều khiển Ruby (irb) và kết nối với máy chủ bằng cổng mặc định:

require 'dalli'
cache = Dalli::Client.new('localhost')
=> #<Dalli::Client:0x007f999d867e80 @servers=["localhost"], @options={}, @ring=nil>

Lưu trữ cơ bản

Tương tác với Memcached xoay quanh các cặp khóa-giá trị. Lệnh set cho phép bạn lưu trữ giá trị bằng cách liên kết chúng với các khóa duy nhất. Ngược lại, lệnh get truy xuất giá trị bằng cách sử dụng các khóa tương ứng. 

cache.set 'greet', 'hello'
cache.get 'greet'
=> "hello"

Ngoài ra, dữ liệu có thể được giới hạn thời gian tồn tại bằng giây, đảm bảo việc dữ liệu sẽ bị xóa sau một thời gian.

cache.set 'greet', 'hello', 5
cache.get 'greet'
=> "hello"
sleep 5
cache.get 'greet'
=> nil

Có thể nhận nhiều giá trị trong một truy vấn duy nhất bằng cách sử dụng get_multi, dẫn đến một hàm băm:

cache.set 'greet1', 'hello'
cache.set 'greet2', 'good morning'
cache.get_multi 'greet1', 'greet2'
=> {"greet1"=>"hello", "greet2"=>"good morning"}

Bạn có thể giải phóng bộ nhớ bằng cách xóa những lời chào trên:

cache.delete 'greet1'
cache.delete 'greet2'
cache.get_multi 'greet1', 'greet2'
=> {}

Nếu bạn muốn xóa tất cả các phím, thao tác xóa:

cache.flush
=> [true]

Thêm dữ liệu

Lệnh set ghi đè giá trị nếu khóa đã tồn tại:

cache.set 'greet', 'hello'
cache.get 'greet'
=> "hello"
cache.set 'greet', 'good morning'
cache.get 'greet'
=> "good morning"

Để tránh điều này, có thể sử dụng lệnh add thay thế, lệnh này sẽ tạo giá trị nếu khóa không tồn tại:

# It doesn't overwrite an existing key (defined in the previous code block)
cache.add 'greet', 'good evening'
cache.get 'greet'
=> "good morning"# It creates the value for new keys
cache.add 'greet2', 'good evening'
=> "good evening"

Thay thế dữ liệu

Lệnh replace cập nhật dữ liệu cho một khóa đã tồn tại:

cache.replace 'greet', 'hi there!'
cache.get 'greet'
=> "hi there!"

Nhưng nó sẽ không có tác dụng nếu khóa không tồn tại:

cache.replace 'non existing greet', 'hi there!'
=> nil

Nối thêm, tiền tố dữ liệu

Để nối thêm hoặc tiền tố dữ liệu, Memcached yêu cầu nó phải được thiết lập trước đó là dạng raw.

cache.set 'greet', 'hello', 0, raw: true

Phương pháp này cho phép bạn thêm hoặc chèn dữ liệu vào các điểm cụ thể trong giá trị đã lưu trữ.

cache.append 'greet', '!'
cache.get 'greet'
=> "hello!"

Và chuẩn bị:

cache.prepend 'greet', 'hey! '
cache.get 'greet'
=> "hey! hello!"

Tăng và giảm dữ liệu

Một trường hợp sử dụng hữu ích khác của Memcached là khi bạn muốn sử dụng một biến đếm, cho phép tăng hoặc giảm giá trị của nó. Memcached cung cấp các hoạt động incr (tăng) và decr (giảm) giá trị của một khóa cụ thể.

cache.set 'counter', 1, 0, raw: true
cache.incr 'counter'
=> 2
cache.incr 'counter', 2
=> 4
cache.decr 'counter'
=> 3
cache.decr 'counter', 3
=> 0

Kiểm tra và đặt

Hãy tưởng tượng có một giá trị có thể được cập nhật bởi bất kỳ khách hàng đồng thời nào (cố gắng cập nhật nó cùng một lúc). Đó có phải là một vấn đề không? Đó là một điều kiện tương tranh có thể được kiểm soát bằng thao tác cas, kiểm tra xem giá trị có bị khách hàng khác thay đổi hay không trước khi cập nhật.

Nó hoạt động giống như một thao tác tập hợp, nhưng nó yêu cầu một khối:

cache.set 'config', 'foo'
cache.cas('config') { 'bar' }
cache.get 'config'
=> "bar"

Vì vậy, đây là một hoạt động nguyên tử.

Kết luận

Chúng ta đã biết Memcached là gì và cách sử dụng nó trực tiếp. Memcached có vẻ đơn giản, nhưng nó có thể giúp một ứng dụng web lớn hoạt động nhanh hơn như nhiều công ty quan trọng đang làm, chẳng hạn như YouTube, Reddit, Facebook, Twitter và Wikipedia.

Mọi người cùng tìm kiếm: memcached là gì