Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Nắm vững Redis:Các yếu tố cần thiết của CLI, các lệnh chính và các dự án thực tế

Nắm vững Redis:Các yếu tố cần thiết của CLI, các lệnh chính và các dự án thực tế

Bởi Mehul Mohan

Redis là cơ sở dữ liệu trong bộ nhớ phổ biến được sử dụng cho nhiều dự án khác nhau, như bộ nhớ đệm và giới hạn tốc độ.

Trong bài đăng blog này, chúng ta sẽ xem cách bạn có thể sử dụng Redis làm cơ sở dữ liệu trong bộ nhớ, lý do bạn muốn sử dụng Redis và cuối cùng chúng ta sẽ thảo luận về một số tính năng quan trọng của cơ sở dữ liệu. Hãy bắt đầu.

Cơ sở dữ liệu trong bộ nhớ là gì?

Cơ sở dữ liệu truyền thống giữ một phần cơ sở dữ liệu (thường là các chỉ mục "nóng" hoặc thường được truy cập) trong bộ nhớ để truy cập nhanh hơn và phần còn lại của cơ sở dữ liệu trên đĩa.

Mặt khác, Redis tập trung nhiều vào độ trễ cũng như khả năng truy xuất và lưu trữ dữ liệu nhanh chóng. Vì vậy nó hoạt động hoàn toàn trên bộ nhớ (RAM) thay vì thiết bị lưu trữ (SSD/HDD). Tốc độ là quan trọng!

Redis là một cơ sở dữ liệu khóa-giá trị. Nhưng đừng để nó đánh lừa bạn nghĩ rằng đó là một cơ sở dữ liệu đơn giản. Bạn có rất nhiều cách để lưu trữ và truy xuất các khóa và giá trị đó.

Tại sao bạn cần Redis?

Bạn có thể sử dụng Redis theo nhiều cách. Nhưng có hai lý do chính mà tôi có thể nghĩ đến:

  1. Bạn đang tạo một ứng dụng mà bạn muốn đặt lớp mã của mình ở trạng thái không trạng thái. Tại sao? - Bởi vì nếu mã của bạn không có trạng thái, nó có thể mở rộng theo chiều ngang. Do đó, bạn có thể sử dụng Redis làm hệ thống lưu trữ trung tâm và để mã của bạn chỉ xử lý logic.
  2. Bạn đang tạo một ứng dụng trong đó nhiều ứng dụng có thể cần chia sẻ dữ liệu. Ví dụ:điều gì sẽ xảy ra nếu ai đó đang cố gắng tấn công trang web của bạn tại payments.codedamn.com , và một khi bạn phát hiện ra, bạn cũng muốn chặn chúng tại login.codedamn.com ? Redis cho phép nhiều dịch vụ bị ngắt kết nối/kết nối lỏng lẻo của bạn chia sẻ một không gian bộ nhớ chung.

Redis tương đối đơn giản để học vì chỉ có một số lệnh bạn cần biết. Trong một số phần tiếp theo, chúng tôi sẽ đề cập đến một số khái niệm chính về Redis và một số lệnh phổ biến hữu ích.

Redis CLI

Nắm vững Redis:Các yếu tố cần thiết của CLI, các lệnh chính và các dự án thực tế

Redis có CLI là phiên bản REPL của dòng lệnh. Bất cứ điều gì bạn viết sẽ được đánh giá.

Hình ảnh trên hướng dẫn bạn cách thực hiện một PING đơn giản hoặc xin chào thế giới trong Redis trong một trong những bài tập khóa học Redis chết tiệt của tôi (khóa học được liên kết ở cuối nếu bạn muốn xem qua).

Redis REPL này rất hữu ích khi bạn đang làm việc với cơ sở dữ liệu trong một ứng dụng và cần xem nhanh một số khóa hoặc trạng thái của Redis.

Các lệnh Redis phổ biến

Nắm vững Redis:Các yếu tố cần thiết của CLI, các lệnh chính và các dự án thực tế Thử các lệnh phổ biến trên Redis CLI trong khóa học codedamn

Dưới đây là một số lệnh được sử dụng rất phổ biến trong Redis để giúp bạn tìm hiểu thêm về cách hoạt động của nó:

BỘ

SET cho phép bạn đặt khóa thành giá trị trong Redis.

Đây là một ví dụ về cách nó hoạt động:

SET mehul "developer from india"

Điều này đặt khóa mehul đến giá trị developer from india .

NHẬN

GET cho phép bạn lấy các khóa bạn đã đặt.

Đây là cú pháp:

GET mehul

Điều này sẽ trả về chuỗi "nhà phát triển từ Ấn Độ" như chúng tôi đã đặt ở trên.

SETNX

Khóa này sẽ chỉ đặt giá trị nếu khóa không tồn tại. Lệnh này có một số trường hợp sử dụng, bao gồm cả việc không vô tình ghi đè giá trị của khóa có thể đã có.

Đây là cách nó hoạt động:

SET key1 value1
SETNX key1 value2
SETNX key2 value2

Sau khi chạy ví dụ này, key1 của bạn sẽ có giá trị value1key2 dưới dạng value2 . Điều này là do lệnh thứ hai sẽ không có tác dụng như key1 đã có mặt rồi.

MSET

MSET giống như SET nhưng bạn có thể đặt nhiều phím cùng nhau trong một lệnh. Đây là cách nó hoạt động:

MSET key1 "value1" key2 "value2" key3 "value3"

Hiện tại chúng tôi đang sử dụng keyvalue làm tiền tố cho khóa và giá trị. Nhưng trong thực tế, khi bạn viết mã như vậy, bạn rất dễ quên mất đâu là khóa và đâu là giá trị trong một lệnh dài như vậy.

Vì vậy, một điều bạn có thể làm là luôn trích dẫn giá trị của mình bằng cách sử dụng dấu ngoặc kép và để khóa không có dấu ngoặc kép (nếu chúng là tên khóa hợp lệ không có dấu ngoặc kép).

MGET

MGET tương tự như GET, nhưng nó có thể trả về nhiều giá trị cùng một lúc, như sau:

MGET key1 key2 key3 key4

Điều này sẽ trả về bốn giá trị dưới dạng một mảng:value1 , value2 , value3null . Chúng tôi đã nhận được key4 là null vì chúng tôi chưa bao giờ đặt nó.

DEL

Lệnh này sẽ xóa một khóa – đủ đơn giản phải không?

Đây là một ví dụ:

SET key value
GET key # gives you "value"
DEL key 
GET key # null

INCR và DECR

Bạn có thể sử dụng hai lệnh này để tăng hoặc giảm khóa là số. Chúng rất hữu ích và bạn sẽ sử dụng chúng rất nhiều, vì Redis có thể thực hiện hai thao tác trong một – phím GET và phím SET thành key + 1.

Điều này tránh các chuyến đi khứ hồi đến ứng dụng gốc của bạn và giúp thao tác cũng được thực hiện an toàn mà không cần sử dụng giao dịch (sẽ nói thêm về điều này sau)

Đây là cách chúng hoạt động:

SET favNum 10
INCR favNum # 11
INCR favNum # 12
DECR favNum # 11

HẾT HẠN

Lệnh EXPIRE được sử dụng để đặt bộ đếm thời gian hết hạn cho một phím. Về mặt kỹ thuật, đây không phải là bộ đếm thời gian mà là dấu thời gian tắt mà ngoài dấu thời gian đó, khóa sẽ luôn trả về giá trị rỗng trừ khi được đặt lại.

SET bitcoin 100
EXPIRE bitcoin 10
GET bitcoin # 100
# after 10 seconds
GET bitcoin # null

EXPIRE sử dụng nhiều bộ nhớ hơn một chút để lưu trữ toàn bộ khóa đó (vì bây giờ bạn cũng phải lưu trữ khi khóa đó hết hạn). Nhưng có thể bạn sẽ không bao giờ quan tâm đến chi phí đó.

TTL

Lệnh này có thể được sử dụng để tìm hiểu thời gian tồn tại của khóa.

Ví dụ:

SET bitcoin 100
TTL bitcoin # -1
TTL somethingelse # -2
EXPIRE bitcoin 5
# wait 2 seconds
TTL bitcoin # returns 3
# after 1 second
GET bitcoin # null
TTL bitcoin # -2

Vậy chúng ta có thể học được gì từ mã này?

  1. TTL sẽ trả về -1 nếu khóa tồn tại nhưng không hết hạn
  2. TTL sẽ trả về -2 nếu khóa không tồn tại
  3. TTL sẽ quay lại thời gian tồn tại sau vài giây nếu khóa tồn tại và sẽ hết hạn

SETEX

Bạn có thể thực hiện SETHẾT HẠN cùng với SETEX .

Như thế này:

SETEX key 10 value

Ở đây, khóa là "khóa", giá trị là "giá trị" và thời gian tồn tại (TTL) là 10. Khóa này sẽ không được đặt sau 10 giây.

Bây giờ bạn đã có kiến thức cơ bản về các lệnh Redis cơ bản và cách CLI hoạt động, hãy xây dựng một vài dự án và sử dụng những công cụ đó trong cuộc sống thực.

Dự án 1 – Xây dựng hệ thống bộ nhớ đệm API bằng Redis

Nắm vững Redis:Các yếu tố cần thiết của CLI, các lệnh chính và các dự án thực tế Xem trước phòng thí nghiệm xây dựng hệ thống bộ nhớ đệm API trên codedamn

Dự án này liên quan đến việc thiết lập hệ thống bộ nhớ đệm API với Redis, nơi bạn lưu trữ kết quả từ máy chủ bên thứ 3 và sử dụng nó trong một thời gian.

Điều này rất hữu ích để bạn không bị giới hạn bởi bên thứ ba đó. Ngoài ra, bộ nhớ đệm còn cải thiện tốc độ trang web của bạn, vì vậy nếu bạn triển khai chính xác thì mọi người đều có lợi.

Bạn có thể xây dựng dự án này một cách tương tác trên codedamn bên trong trình duyệt bằng Node.js. Nếu quan tâm, bạn có thể dùng thử miễn phí phòng thí nghiệm bộ nhớ đệm API.

Nếu bạn chỉ quan tâm đến giải pháp (và không tự xây dựng nó), thì đây là cách logic cốt lõi sẽ hoạt động trong Node.js:

app.post('/data', async (req, res) => {
 const repo = req.body.repo
 const value = await redis.get(repo)
 if (value) {
 // means we got a cache hit
 res.json({
 status: 'ok',
 stars: value
 })
 return
 }
 const response = await fetch(`https://api.github.com/repos/${repo}`).then((t) => t.json())
 if (response.stargazers_count != undefined) {
 await redis.setex(repo, 60, response.stargazers_count)
 }
 res.json({
 status: 'ok',
 stars: response.stargazers_count
 })
})

Hãy xem điều gì đang xảy ra ở đây:

  • Chúng tôi cố gắng đạt được repo (là định dạng repo đã được thông qua - facebook/react ) từ bộ đệm Redis của chúng tôi. Nếu có mặt thì tuyệt vời! Chúng tôi trả về số sao từ bộ nhớ đệm redis, giúp chúng tôi tiết kiệm được một chuyến khứ hồi tới máy chủ của GitHub.
  • Nếu không tìm thấy nó trong bộ đệm, chúng tôi sẽ gửi yêu cầu tới máy chủ của GitHub và lấy số sao. Chúng tôi kiểm tra xem số sao có phải là không xác định hay không (trong trường hợp kho lưu trữ không tồn tại/ở chế độ riêng tư). Nếu nó có giá trị, chúng tôi setex giá trị có thời gian chờ là 60 giây.
  • Chúng tôi đặt thời gian chờ vì không muốn cung cấp các giá trị cũ theo thời gian. Điều này giúp chúng tôi làm mới số sao của mình ít nhất một lần mỗi phút.

Đây là mã nguồn đầy đủ:

Dự án 2 - API giới hạn tốc độ với Redis

Nắm vững Redis:Các yếu tố cần thiết của CLI, các lệnh chính và các dự án thực tế Xem trước API giới hạn tốc độ với Redis

Dự án này liên quan đến việc giới hạn tốc độ của một điểm cuối nhất định để bảo vệ nó khỏi các tác nhân xấu, sau đó chặn chúng truy cập vào API cụ thể đó.

Điều này rất hữu ích cho việc đăng nhập và các điểm cuối API nhạy cảm, nơi bạn không muốn một người nào tiếp cận điểm cuối của mình với hàng nghìn yêu cầu.

Chúng tôi thực hiện giới hạn tốc độ theo địa chỉ IP trong phòng thí nghiệm này. Nếu muốn dùng thử lớp học lập trình này, bạn có thể dùng thử miễn phí trên codedamn.

Nếu bạn chỉ quan tâm đến giải pháp (và không tự xây dựng nó), thì đây là cách logic cốt lõi sẽ hoạt động trong Node.js:

app.post('/api/route', async (req, res) => {
 // add data here
 const ip = req.headers['x-forwarded-for'] || req.ip
 const reqs = await redis.incr(ip)
 await redis.expire(ip, 2)
 if (reqs > 15) {
 return res.json({
 status: 'rate-limited'
 })
 } else if (reqs > 10) {
 return res.json({
 status: 'about-to-rate-limit'
 })
 } else {
 res.json({
 status: 'ok'
 })
 }
})

Hãy cùng tìm hiểu khối mã này:

  • Chúng tôi cố gắng trích xuất IP từ x-forwarded-for tiêu đề (hoặc bạn có thể sử dụng req.ip vì chúng tôi đang sử dụng express)
  • Chúng tôi INCR trường địa chỉ IP. Nếu khóa của chúng tôi trong Redis chưa bao giờ tồn tại, INCR sẽ tự động đặt nó thành 0 và tăng dần, cuối cùng nó được đặt thành 1.
  • Chúng tôi đặt khóa hết hạn sau 2 giây. Lý tưởng nhất là bạn muốn một giá trị lớn hơn - nhưng đây chính là thách thức chết tiệt đã chỉ định ở trên, vì vậy chúng tôi có nó.
  • Cuối cùng, chúng tôi kiểm tra số lượng yêu cầu, nếu chúng lớn hơn một ngưỡng nhất định, chúng tôi sẽ chặn yêu cầu tiếp cận nội dung chức năng chính.

Đây là giải pháp đầy đủ:

Thông tin thêm về Redis

Redis còn nhiều hơn những gì chúng ta đã học được cho đến nay. Nhưng điều tốt là chúng ta đã học đủ để bắt đầu làm việc với nó rồi!

Trong phần này, chúng ta hãy cùng tìm hiểu thêm một số nguyên tắc cơ bản của Redis.

Redis là luồng đơn

Redis chạy dưới dạng một tiến trình đơn luồng, ngay cả trên hệ thống nhiều lõi hỗ trợ đa luồng. Đây không phải là cơn ác mộng về hiệu suất mà là một biện pháp an toàn chống lại việc đọc/ghi không nhất quán trong môi trường đa luồng.

Nếu Redis là đa luồng, để đảm bảo an toàn luồng khi truy cập vào một khóa duy nhất, cuối cùng bạn đã giải quyết một số cơ chế khóa, dù sao thì cơ chế này có thể sẽ hoạt động kém hơn so với truy cập tuần tự/luồng đơn.

Giao dịch Redis

Tất nhiên, bạn không thể làm mọi thứ trong Redis chỉ bằng một lệnh duy nhất. Nhưng bạn chắc chắn có thể yêu cầu nó thực hiện một khối lệnh trong một lần (nghĩa là không ai khác nói chuyện với Redis trong khi nó đang thực thi khối đó). Bạn có thể làm điều đó bằng cách sử dụng MULTI lệnh.

Đây là cách hoạt động:

MULTI
SET hello world
SET yo lo
SET number 1
INCR number
EXPIRE hello 10
EXPIRE yo 5
EXEC

Điều này sẽ thực hiện tất cả các thao tác này trong một lần, nghĩa là nó sẽ không chạy mọi thứ sau MULTI , và sẽ chạy mọi thứ ngay khi nhìn thấy EXEC từ khóa.

Redis bao gồm hỗ trợ cho danh sách và bộ dành cho các trường hợp sử dụng nâng cao hơn. Bạn cũng có thể sử dụng Redis làm dịch vụ phát sóng nơi bạn xuất bản tới một kênh và những người khác đã đăng ký vào kênh nhận được thông báo. Điều này rất hữu ích trong kiến trúc nhiều khách hàng.

Kết luận

Tôi hy vọng bạn thích phần giới thiệu này về Redis. Bài đăng trên blog này là một phần của khóa học tương tác mới của codedamn:Bộ nhớ đệm Redis + Node.js, nơi bạn không chỉ tìm hiểu về những khái niệm này mà còn thực hành chúng trong trình duyệt của mình khi đang di chuyển.

Hãy thử khóa học và cho tôi biết suy nghĩ của bạn. Bạn có thể tìm thấy tôi trên twitter để gửi bất kỳ phản hồi nào :)

Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu