chỗ đấy mình lấy ví dụ thôi bạn, vì local storage không bị xóa đi khi tab hoặc trình duyệt bị tắt đi nên mình tạo một biến rồi mỗi lần load lại trang thì tăng biến đó thêm 1
Ý này là sao nhỉ bạn?
"Ví dụ: vì dữ liệu được lưu trong Local Storage sẽ không bị mất đi khi trình duyệt bị đóng nên có thể dùng để đếm số lượt truy cập vào trang web."
Additionally, the members generation follows these rules with regard to the members inheritance
Câu này theo như mình hiểu thì có thể nói là:
Việc sinh ra các members(phương thức, thuộc tính) trong data class phải tuân theo các quy luật của kế thừa
Tức là nếu Data class đứng 1 mình thì không sao,
Nhưng nếu data class của chúng ta kế thừa 1 class khác, thì việc sinh tự động các members cũng phải theo các nguyên tắc kế thừa trong OOP
ah ngon ngon a ạ, e có 1 vấn đề thắc mắc nữa là lúc build image xong, chạy lệnh docker-compose up để run container mà lúc đấy n lại báo bị thiếu 1 module, mà module đó trc mình quên ko để ở file requirements.txt , thì có cách nào mình cài thêm thư viện(module) này vào dc ko a nhỉ?
Trong Dart, vì int với double đều là kiểu object mà bạn để ý class int nó không có extends class double hay nói cách khác class int ko phải con của class double nên khi bạn dùng: double as sang int nó sẽ lỗi ngay. Bạn muốn convert double sang int có thể dùng hàm toInt(). Trong Kotlin cũng như vậy luôn bạn nhé. Còn trong Java thì ép thế lại được vì int và double trong Java ko phải là object mà nó là kiểu nguyên thủy.
Vấn đề là nếu e làm tới cuối bài (sau phần setup password cho Redis), từ đây data sẽ không còn được lưu lại trong file dump.rdb ở folder .docker/data/redis nữa.Dẫn tới việc session sẽ không được lưu và sau khi docker-compose down thì sẽ bị mất.
Lí do: mặc định khi chạy Redis mà không có option nào (ý là nếu ta không thêm --requirepass vào command ở docker-compose.yml) thì Redis sẽ đều đặn write data vào file dump.rdb với config như sau:
docker-compose exec redis sh
redis-cli
config get save
->>>in ra:
1)"save"2)"3600 1 300 100 60 10000"
Ý là Redis sẽ đều đặn lưu data (hay cụ thể ở đây là session của user) vào file nếu 1 trong các điều kiện sau xảy ra:
Sau 3600 giây và có 1 sự thay đổi ở data trong Redis
hoặc sau 300 giây và có 100 sự thay đổi
hoặc sau 600 giây và thấy có 10000 thay đổi
Nhưng khi ta khởi động redis-server với bất kì 1 option nào thì config mặc định sẽ không được áp dụng nữa, ở đây do ta thêm --requirepass nên nếu e docker-compose up, sau đó chui vào container redis để check lại thì sẽ thấy in ra config get save với giá trị rỗng, tức không bao giờ ghi ra file nữa. Do đó khi ta docker-compose down đi thì data sẽ mất
Vậy nên nếu e muốn lưu lại session ngay cả khi e docker-compose down, thì ở command của service redis trong docker-compose.yml e sửa lại cho a như sau:
Giờ đây cứ sau 1 khoảng thời gian và có 1 số sự thay đổi thì Redis sẽ cập nhật lại file dump.rdb, ở trên a thiết lập:
Sau 10 giây nếu có 1 sự thay đổi
Hoặc sau 30 giây có 30 sự thay đổi
E nên chọn chọn cho mình 1 con số phù hợp với app của e
Có 1 option khác là --appendonly yes thì data sẽ được lưu khi có bất kì thay đổi nào, trường hợp này data sẽ được lưu ở file .aof
File AOF thì dung lượng thường lớn hơn file .rdb và về lý thuyết thì tốc độ đọc cũng sẽ chậm hơn. Nhưng nếu app của e không quan tâm tới khả năng nhanh chậm trong khoảng mili giây thì vẫn oke. Nhưng nói chung a vẫn khuyên nên lưu ở file .rdb hơn
Đến đây thì ta có thể docker-compose down/up thoải mái, F5 lại trình duyệt vẫn sẽ còn session, nhưng session được lưu chỉ khi ta không tắt trình duyệt. Lí do express-session lưu session trong cookie, khi ta tắt trình duyệt thì cookie sẽ bị mất (hết hạn), nên mặc dù data trong Redis vẫn còn nhưng khi mở lại trình duyệt thì cookie trên trình duyệt và data trong Redis thì ko còn khớp nữa nên session coi như mất.
Do đó e cần sửa lại code ở file modules/session.js, đoạn module.exports như sau:
module.exports =session({
store:newRedisStore({
client
}),
secret:'supersecret',
reave:false,
saveUninitialized:true,
cookie:{// set "tuổi" cho cookie, để khi tắt trình duyệt bật lại thì cookie vẫn còn "trẻ" và chưa "chết"
expires:false,
maxAge:1000*60*60*24*7}})
Sau đó e clear cookie tại trình duyêt. Tiến hành build lại image và chạy lại là oke nhé
Bonus
Nếu e vừa muốn set password vừa muốn giữ toàn bộ cấu hình mặc định của redis để không phải đau đầu vì những điều bên trên, thì e làm như sau (recommend khi chạy ở production):
Vào trang chủ Redis download file cấu hình mặc định, ở đây. Đọc dòng "The self documented redis.conf for Redis 5.0"
Mở file đó lên tìm tới đoạn có requirepass rồi đặt password của e vào
Sau đó ở docker-compose.yml service redis e sửa lại như sau:
redis:image: redis:5-alpine
volumes:- .docker/data/redis:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf # ---> map config vào container để khi Redis khởi động sẽ đọc file này lênrestart: unless-stopped
networks:- cache-network
healthcheck:test:["CMD","redis-cli","ping"]interval: 30s
timeout: 10s
retries:5
a sẽ không cập nhật lại code hay nội dung trong bài để nếu bạn nào có thắc mắc như e có thể đọc comment này và hiểu kĩ hơn về cơ chế lưu data của Redis nhé
THẢO LUẬN
(thatym)
Ví dụ thôi :3
không ai làm vậy cả :v
Bài viết hay quá
)
chỗ đấy mình lấy ví dụ thôi bạn, vì local storage không bị xóa đi khi tab hoặc trình duyệt bị tắt đi nên mình tạo một biến rồi mỗi lần load lại trang thì tăng biến đó thêm 1
Ý này là sao nhỉ bạn? "Ví dụ: vì dữ liệu được lưu trong Local Storage sẽ không bị mất đi khi trình duyệt bị đóng nên có thể dùng để đếm số lượt truy cập vào trang web."
tks a ạ
Additionally, the members generation follows these rules with regard to the members inheritanceCâu này theo như mình hiểu thì có thể nói là: Việc sinh ra các members(phương thức, thuộc tính) trong data class phải tuân theo các quy luật của kế thừa Tức là nếu Data class đứng 1 mình thì không sao, Nhưng nếu data class của chúng ta kế thừa 1 class khác, thì việc sinh tự động các members cũng phải theo các nguyên tắc kế thừa trong OOP
e
docker-compose downsau đó build lại image rồidocker-compose up.hoặc chui trực tiếp vào container để cài, nhưng như thế không hay vì khi e
downđi sẽ bị mấtah ngon ngon a ạ, e có 1 vấn đề thắc mắc nữa là lúc build image xong, chạy lệnh
docker-compose upđể run container mà lúc đấy n lại báo bị thiếu 1 module, mà module đó trc mình quên ko để ở file requirements.txt , thì có cách nào mình cài thêm thư viện(module) này vào dc ko a nhỉ?Mình làm lại rồi. Ok
num a=3.5; print(a.runtimeType); // double num b= a.toInt(); //int print(b.runtimeType);
Tks.
a hiểu, trước đây a cũng từng bị. Do bản alpine có 1 số thư viện Python không hỗ trợ. Do đó ở Docker file e đổi thành:
Đây là bản Debian Stretch, cũng sẽ có khá là đầy đủ các thư viện python, có cả
scipyđó eHay quá bác (like)
Thư viên scipy với mấy thư viện nữa cũng ko dc hỗ trợ.
Vậy mỗi cái đó mình phải build 1 image khác nhau đúng ko a?
@tuananhbfs chỉ trừ hai link đó thôi hả bạn còn lại là ok hết hả
đúng như lỗi đã in ra, với bản phân phối Alpine thì không có tensorflow thoả mãn yêu cầu của e.
Cách đơn giản là e
FROMtrực tiếp từ imagetensorflowđược support official, build và test cẩn thận, check ở trang chủ Tensorflow nhé e.Chọn đúng tag của phiên bản tensorflow e cần là được nhé. Ở đây
Trong Dart, vì int với double đều là kiểu object mà bạn để ý class int nó không có extends class double hay nói cách khác class int ko phải con của class double nên khi bạn dùng:
double as sang intnó sẽ lỗi ngay. Bạn muốn convert double sang int có thể dùng hàmtoInt(). Trong Kotlin cũng như vậy luôn bạn nhé. Còn trong Java thì ép thế lại được vì int và double trong Java ko phải là object mà nó là kiểu nguyên thủy.Tks
(len)
Cuối cùng cũng có người để ý
,
Vấn đề là nếu e làm tới cuối bài (sau phần setup password cho Redis), từ đây data sẽ không còn được lưu lại trong file
dump.rdbở folder.docker/data/redisnữa.Dẫn tới việc session sẽ không được lưu và sau khidocker-compose downthì sẽ bị mất.Lí do: mặc định khi chạy Redis mà không có option nào (ý là nếu ta không thêm
--requirepassvàocommandởdocker-compose.yml) thì Redis sẽ đều đặn write data vào filedump.rdbvới config như sau:Ý là Redis sẽ đều đặn lưu data (hay cụ thể ở đây là session của user) vào file nếu 1 trong các điều kiện sau xảy ra:
Nhưng khi ta khởi động
redis-servervới bất kì 1 option nào thì config mặc định sẽ không được áp dụng nữa, ở đây do ta thêm--requirepassnên nếu edocker-compose up, sau đó chui vào containerredisđể check lại thì sẽ thấy in raconfig get savevới giá trị rỗng, tức không bao giờ ghi ra file nữa. Do đó khi tadocker-compose downđi thì data sẽ mấtVậy nên nếu e muốn lưu lại session ngay cả khi e
docker-compose down, thì ởcommandcủa serviceredistrongdocker-compose.ymle sửa lại cho a như sau:Giờ đây cứ sau 1 khoảng thời gian và có 1 số sự thay đổi thì Redis sẽ cập nhật lại file
dump.rdb, ở trên a thiết lập:Có 1 option khác là
--appendonly yesthì data sẽ được lưu khi có bất kì thay đổi nào, trường hợp này data sẽ được lưu ở file.aofĐến đây thì ta có thể
docker-compose down/upthoải mái, F5 lại trình duyệt vẫn sẽ còn session, nhưng session được lưu chỉ khi ta không tắt trình duyệt. Lí doexpress-sessionlưu session trong cookie, khi ta tắt trình duyệt thì cookie sẽ bị mất (hết hạn), nên mặc dù data trong Redis vẫn còn nhưng khi mở lại trình duyệt thì cookie trên trình duyệt và data trong Redis thì ko còn khớp nữa nên session coi như mất.Do đó e cần sửa lại code ở file
modules/session.js, đoạnmodule.exportsnhư sau:Sau đó e clear cookie tại trình duyêt. Tiến hành build lại image và chạy lại là oke nhé
Bonus
Nếu e vừa muốn set password vừa muốn giữ toàn bộ cấu hình mặc định của redis để không phải đau đầu vì những điều bên trên, thì e làm như sau (recommend khi chạy ở production):
requirepassrồi đặt password của e vàodocker-compose.ymlserviceredise sửa lại như sau: