Tối ưu tính lượt view cho website sử dụng Redis

Trong quá trình xây dựng web Toidicafe.vn – Website tổng hợp và đánh giá quán cafe đẹp ở Hà Nội, mình có 1 task là tính lượt view của mỗi quán cafe để dựa vào đó đề xuất các quán nổi bật, được nhiều người quan tâm. Đây là cách mình đã làm, mọi người

Trong quá trình xây dựng web Toidicafe.vn – Website tổng hợp và đánh giá quán cafe đẹp ở Hà Nội, mình có 1 task là tính lượt view của mỗi quán cafe để dựa vào đó đề xuất các quán nổi bật, được nhiều người quan tâm.
Đây là cách mình đã làm, mọi người có cách hay hơn thì chia sẻ nhé!

Xây dựng ý tưởng

Luồng xử lý cơ bản sẽ là ở database mỗi quán cafe sẽ có 1 cột view, mỗi khi người dùng truy cập vào trang chi tiết quán, sẽ update database tăng biến view lên 1.
Truy nhiên, cách này sẽ không được tối ưu, mình sẽ phải connect vào database và đọc ghi liên tục, gây tốn tài nguyên server.

Ý tưởng của mình là dùng Redis để ưu lại lượt view của từng quán cafe và tạo 1 job cập nhật lượt view từ redis vào database.
Redis là gì và công dụng của nó thì các bạn có thể tham khảo ở đây

Code thôi

Mình sử dụng backend là Nodejs, và đây là code mình đã làm:

Tạo function tăng biến view và gọi mỗi lần truy cập và chi tiết quán cafe đó:

async function incViewCountPlace(placeId) {
    const count =  await promisify(cb => client.get(`placeview_${placeId}`, cb));
    client.set(`TDCF_placeview_${placeId}`, count ? parseInt(count) + 1 : 1);
}

Tạo cronjob để cập nhật lượt view từ redis và database:

const job = schedule.scheduleJob('0 0 * * * *', async function(){
            const keys = await promisify(cb => client.keys(`placeview_*`, cb));
            await Promise.all(keys.map(async key => {
                const id = key.split('_')[1];
                const place = await Place.findById(id, 'view').lean();
                const views = place.view || 0;
                const newViews = await promisify(cb => client.get(key, cb));
                const total = views + parseInt(newViews);
                await Place.findByIdAndUpdate(id, {view: total});
            }))
            client.del(keys);
            console.log(`${moment().format('DD/MM/YYYY HH:mm:ss')}: Run save place view job!`);
        });

Chia sẻ

Trên đây là cách mình đã làm để tính lượt view cho website, cách này cũng chưa hẳn tối ưu và nó sẽ tốn Ram hơn 1 chút nhưng mình thấy nó ổn hơn là cách thông thường, mình là sinh viên vừa ra trường kinh nghiệm cũng chưa được nhiều có gì các tiền bối và mọi người góp ý và chia sẻ kinh nghiệm nhé!
Tiện thể Toidicafe.vn là sản phẩm đồ án tốt nghiệm của mình, công dụng của nó là giúp mọi người tìm kiếm được quán cafe dễ dàng hơn theo vị trí, nhu cầu mục đích, các bác vào trải nghiệm để ủng hộ mình nhé.

Cảm ơn đã đọc bài😍

Nguồn: viblo.asia

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,