Docker Lập trình C# Cơ bản Java

Giới thiệu Redis, cài đặt và cấu hình

Redis (REmote DIctionary Server), nó cho phép tạo ra một Server có chức năng dùng bộ nhớ để lưu trữ dữ liệu (giống như Memcached), bên cạnh đó nó có cơ chế định kỳ lưu trữ dữ liệu bộ nhớ vào đĩa để phục hồi lại nếu có lỗi (tắt đột ngột ...). Redis có ưu điểm là tốc độ, an toàn (có cơ chế xác thực), nên nó được dùng làm cache cho các ứng dụng web, để lưu trữ dữ liệu cho các ứng dụng cần sự truy vấn trả về nhanh chóng ...

Dữ liệu lưu trữ ở dạng cặp key/value, với giá trị lưu trữ là các chuỗi, danh sách, tập hợp. Mặc định Server Redis lắng nghe ở cổng 6379 có nhiều thư viện hỗ trợ kết nối cho các ngôn ngữ như PHP, C#, Java ...

Để cài đặt trên CentOS gõ lệnh

yum install redis

Để cài đặt trên Ubuntu

apt-get install redis-server

Các lệnh để quản lý Server Redis gồm có kích hoạt tự động chạy, khởi chạy, khởi động lại có thể sử dụng như

systemctl enable redis
systemctl start redis
systemctl restart redis

File cấu hình ở đường dẫn /etc/redis.conf, trong đó cấu hình cơ bản gồm có điều chỉnh bind và port (mặc định chọn port 6379), nếu chỉ để dịch vụ local kết nối thì để

bind 127.0.0.1
port 6379

Nếu cho kết nối qua mạng để

bind 0.0.0.0
port 6379

Nếu sử dụng unix socket (dịch vụ kết nối trên một máy), thì tạo cấu hình nó tạo file sock theo đường dẫn chỉ định

port 0
unixsocket /tmp/redis.sock
unixsocketperm 777

Mỗi khi thay đổi cấu hình cần khởi động lại redis theo lệnh phía trên, ngoài ra còn có thể thiết lập bảo mật bằng cách đặt password

requirepass yourpass

Trong phần này để nhanh chóng có Server Redis sẽ hướng dẫn dùng Docker để chạy Server Redis, ứng dụng nó làm cache lưu trữ Session của PHP, cũng như thực hiện kết nối đến nó từ PHP, Java, C# với NET CORE 3

Image redis trên docker

Trên docker có Image chính thức redis, có thể tải về phiên bản phù hợp muốn sử dụng, ví dụ lấy về phiên bản cuối dùng lệnh docker

docker pull redis

Một cách nhanh chóng để có ngay Server Redis trên một container đặt tên là myredis, từ ngoài truy cập được qua cổng 6379 thì thực hiện lệnh docker tạo/chạy container sau:

docker run  --name myredis -p 6379:6379  -d redis

Từ đây đã có Server Redis, chỉ việc kết nối và sử dụng tùy theo ngôn ngữ lập trình của bạn!

Cấu hình riêng chạy Server Redis

Image Redis không có trong nó file cấu hình, nó sử dụng các cấu hình mặc định. Tuy nhiên nhiều trường hợp muốn thiết lập các cấu hình thì cần biên tập file cấu hình rồi yêu cầu chạy với file cấu hình đó.

Ví dụ file cấu hình tên redis.conf lưu ở thư mục hiện tại tức đường dẫn $(pwd)/redis.conf (hoặc đường dẫn tuyệt đối trên máy bạn), thì chỉ việc ánh xạ file đó vào container và yêu cầu redis chạy với cấu hình đó.

docker run -p 6379:6379  -v $(pwd)/redis.conf:/redis.conf --name myredis redis redis-server /redis.conf

Hãy lấy file cấu hình redis.conf mặc định về, và chỉnh sửa các thiết lập tùy nhu cầu

Mở file redis.conf, các cấu hình có thể xem xét tùy nhu cầu như:

Đặt password xác thực

Tìm đến dòng có chỉ thị requirepass, nếu muốn đặt pass thì bỏ comment, ví dụ đặt password xác thực là mypassword

Thiết lập lắng nghe kết nối

Mặc định Redis thiết lập chỉ cho phép các kết nối đến nó từ địa chỉ IP cùng máy (localhost), nếu muốn chấp nhận kết nối từ mọi IP thì comment dòng bind 127.0.0.1 thành

# bind 127.0.0.1

Sửa #bind 127.0.0.1 ::1 thành

bind 0.0.0.0 ::1
requirepass mypassword

Từ đây, các truy vấn đọc, lưu dữ liệu vào Server Redis cần có password này để xác thực

Cấu hình lưu dữ liệu trên đĩa

Tìm đến chỉ thị appendonly, nếu nó bằng yes thì định kỳ sẽ đổ dữ liệu từ bộ nhớ ra đĩa, nếu no sẽ hủy chức năng này. Chọn no nếu cần tốc độ, và dữ liệu không quan trọng - ví dụ như chỉ để cache trang web.

Ngoài ra nó còn có chỉ thị save, sẽ tiến hành lưu dữ liệu tùy sự kiện. Trong file cấu hình mặc định thì nó có sẵn ba dòng

save 900 1
save 300 10
save 60 10000

Ba dòng này có hai tham số cuối là thời-gian-giây số-thay-đổi, khi hai sự kiện đó xảy ra thì tiến hành lưu ra đĩa. Ví dụ save 300 10 nếu sau 300 giây, có 10 sự thay đổi dữ liệu (cập nhật, thêm, xóa) thì tiến hành lưu đĩa

Nếu không cần tính năng này, thì comment lại các dòng đó

Lưu ý, nếu các tính năng lưu bộ nhớ ra đĩa được chọn thì dữ liệu lưu ở đường dẫn /data, bạn có thể ánh xạ vào thư mực này để lưu dữ liệu cố định trên máy host.

Sử dụng redis-cli

redis-cli là công cụ dòng lệnh có sẵn trong Redis, để kết nối và thực hiện các lệnh Redis (giống mysql trong MySQL Server)

Giả sử để kết nối đến Redis Server ở địa chỉ IP (domain) thì gõ lệnh

redis-cli -h IP

Nếu vào dòng lệnh container đang chạy Redis Server và kết nối đến Redis trong container này thì không cần thiết phải chỉ ra -h IP hoặc muốn thì chỉ ra -h localhost hoặc -h 127.0.0.1

Nếu muốn chỉ ra cổng kết kết thì dùng tham số -p cổng

redis-cli -h localhost -p 6391

Sau khi kết nối, thì nó ở dòng lệnh của Redis để thực hiện trực tiếp một số tác vụ mà không cần phụ thuộc ngôn ngữ lập trình nào, một số lệnh có thể tham khảo phần sau:

Một số lệnh Redis

Lệnh AUTH

Để nhập password xác thực, nếu Redis cấu hình cần xác thực

Lệnh SETGET

Lệnh SET để lưu một giá trị vào một key nào đó, lệnh GET thì để đọc giá trị lưu với key đó

Lệnh DBSIZE

Lệnh DBSIZE để kiểm tra xem có bao nhiêu key dữ liệu đang lưu trữ

Lệnh KEYS

Lệnh này hiện thị tất cả các key

Lệnh DELETE

Lệnh DELETE để xóa một key

DELETE mykey

Lệnh FUSHALL

Xóa tất cả các key trong Redis Server

Sử dụng Redis với PHP

Để PHP có khả năng truy cập Redis Server nó cần cài đặt PHP Extension Redis - PHP Extension Redis

Có thể dùng lệnh pecl để cài

pecl install redis

Sau đó trong php.ini thêm cấu hình nạp extension này

extension=redis

Sử dụng Redis để lưu phiên làm việc Session PHP

Các Session PHP mặc định lưu trên đĩa, có thể thiết lập lưu trong Redis để tăng tốc PHP. Mở php.in thêm vào cấu hình sau:

session.save_handler = redis
session.save_path    = "tcp://192.168.1.5:6379?auth=mypassword"
#session.save_path    = "/tmp/redis.sock"

Nếu không có đặt password thì bỏ tham số ?auth=mypassword đi, thay 192.168.1.5:6379 bằng địa chỉ IP và cổng chính xác của Redis

Sử dụng với code PHP

Khi cài đặt Extension PHP, thì nó cung cấp sẵn các lớp để thực hiện kết nối đến Redis, ví dụ

<?php

    // Khởi tạo lớp
    $redis = new Redis();

    // Thiết lập kết nối
    $redis->connect('192.168.1.5', 6379);

    // dùng sock
    // $redis->connect('/tmp/redis.sock');


    // Nhập password nếu cần
    $redis->auth("mypassword");

    // Kiểm tra xem Server Redis hoạt động không
    if ($redis->ping() !== true)
    {
        echo "Redis Server not running ...";
        die;
    }


    // Lưu một giá trị vào key = hello
    $redis->set("hello", "Xin chào Redis");

    // Đọc một giá trị lưu trong key
    $vl = $redis->get("hello");

    // Xóa đi một key
    $redis->delete("mykey");

    // Lấy về mảng tất cả các key
    $keys = $redis->keys("*");

    // Lấy về mảng các key theo mẫu
    $keys = $redis->keys("product*");

    // Xóa tất cả các key
    $redis->flushAll();

Sử dụng Redis với C#

Có thể sử dụng thư viện Client StackExchange.Redis, tích hợp bằng lệnh:

dotnet add package StackExchange.Redis --version 2.0.601

Ví dụ, sử dụng kết nối với C#, đọc ghi dữ liệu vào Redis

using System;
using StackExchange.Redis;

namespace redis
{
    class Program
    {
        static void Main(string[] args)
        {
            // Tạo kết nối
            ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.1.5:6379,password=mypassword");

            // Lấy DB
            IDatabase db = redis.GetDatabase(1);

            // Ping thử
            if (db.Ping().TotalSeconds > 5 ) {
                throw new TimeoutException("Server Redis không hoạt động");
            }

            // Lưu dữ liệu
            db.StringSet("hello", "Xin chào Redis C#");

            // Đọc lại dữ liệu
            var vl  = db.StringGet("hello");
            Console.WriteLine(vl);

            // Xóa một key
            db.KeyDelete("mykey");

            // Lấy tất cả các key
            IServer server =  redis.GetServer("192.168.1.5:6379");
            var keys = server.Keys(pattern: "*");

            foreach (var k in keys) {
                Console.WriteLine(k);
            }

            // Xóa tất cả các key
            server.FlushAllDatabases();

        }
    }
}

Sử dụng Redis với Java

Đối với Java có thể sử dụng thư viện client, Jedis, hãy tải file jar cho phiên bản muốn dùng, ví dụ nếu chọn 3.1.0 thì tải về được file jar jedis-3.1.0.jar, file này sẽ nạp vào dự án Java của bạn!

Ở hướng dẫn này, sẽ tích hợp và sử dụng jedis-3.1.0.jar trong một dự án Java cơ bản, sử dụng với Visual Studio Code, hãy tham khảo Tạo dự án Java với VSC để tạo ra một dự án đặt tên là redis

Trong thư mục dụ án, tạo ra một thư mục lib, copy file jar thư viện vào đó 1 (xem hình trên)

Mở file .classpath thêm vào dòng nạp thư viện 2

<classpathentry exported="true" kind="lib"  path="lib/jedis-3.1.0.jar"/>

Kiểm tra mục JAVA DEPENDENCIES có xuất hiện các thành phần của jedis là thành công

Ví dụ sử dụng:

package app;

// nạp thư viện  vào code
import redis.clients.jedis.Jedis;

public class App {
    public static void main(String[] args) throws Exception {
        // Tạo kết nối
        Jedis jedis = new Jedis("192.168.1.5", 6379);
        jedis.auth("mypassword");

        //Kiểm tra
        if (!jedis.ping().equals("PONG"))
        {
            System.out.println("Redis Server không trả lời");
        }


        // Lưu một giá trị vào key = hello
        jedis.set("hello", "Xin chào Redis");

        // Lưu một giá trị vào key = hello
        String s = jedis.get("hello");
        System.out.println(s);


        // Xóa một key
        jedis.del("mykey");


        // Lấy tất các key
        var keys = jedis.keys("*");

        // Xóa tất cả các key
        jedis.flushAll();

        jedis.close();
    }
}

Đăng ký nhận bài viết mới