-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội
Cũng không đơn giản
Hiện nay có 2 thư viện java client chính hỗ trợ việc đọc ghi dữ liệu đến Redis đó là Jedis và lettuce. Tuy nhiên cả 2 thư viện này đều mới chỉ ở mức cơ bản, nghĩa là mới chỉ hỗ trợ việc đọc ghi byte array. Nhưng để lập trình được ứng dụng thì cái mà lập trình viên cần dùng đó là các đối tượng Java thuần tuý. Vậy nên chúng ta sẽ cần các bước chuyển đổi như sau:
Đọc ghi với Spring Boot
Để đọc ghi redis với Spring Boot, chúng ta sẽ cần import thư việndata-redis
như sau:
- Với gradle:
implementation 'org.springframework.boot:spring-boot-starter-data-redis:2.4.4'
- Với maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.4</version>
</dependency>
Spring sử dụng Bridge design pattern kiểu thế này:
Nghĩa là chúng ta sẽ đọc ghi dữ liệu đến redis thông qua đối tượng Repository
.
Giả sử chúng ta đang cần quản lý một cửa hàng sách, mỗi cuốn sách sẽ có một id duy nhất, với spring trường hợp này thật đơn giản, chỉ cần khai báo lớp BookRepository
thế này:
@Repository
public interface BookRepository extends CrudRepository<Book, Long> {
}
Để lưu một cuốn sách đến redis, chúng ta sẽ gọi:
bookRepository.save(book);
Để đọc thông tin một cuốn sách từ redis, chúng ta sẽ gọi:
Book book = bookRepository.findById(bookId)
Mọi chuyện thật đơn giản đúng không mọi người? Nhưng đó mới chỉ là những trường hợp đơn giản. Bây giờ xuất hiện nghiệp vụ đó là một tác giả không thể có 2 cuốn sách trùng tên. Chúng ta sẽ cần tạo ra một lớp đại diện cho key như thế này:
public class BookNameAndAuthorId {
private String bookName;
private long authorId;
}
Để tạo ra lớp BookIdByNameAndAuthorIdRepository
để truy xuất đến redis, chúng ta sẽ có 2 lựa chọn
Cách 1. Tạo ra lớp BookNameAndAuthorIdBookId
để tận dụng cơ chế tự động cài đặt của Spring, source code của chúng ta sẽ thế này:
public class BookNameAndAuthorIdBookId {
private BookNameAndAuthorId id;
private long bookId;
}
public class BookIdByNameAndAuthorIdRepository
extends CrudRepository<BookNameAndAuthorIdBookId, BookNameAndAuthorId> {
}
Nhưng phương pháp này gặp một nhược điểm rất lớn đó là nó lưu trùng dữ liệu vào redis, nghĩa là trong redis sẽ lưu dạng:
map[BookNameAndAuthorId] = BookNameAndAuthorIdBookId
các bạn có thấy không, nó bị trùng dữ liệu BookNameAndAuthorId
, và điều này sẽ gây lãng phí bộ nhớ, vậy chúng ta sẽ sử dụng cách 2.
Cách 2: Tự viết lớp BookIdByNameAndAuthorIdRepository
, và chúng ta sẽ có source code thế này:
public class BookIdByNameAndAuthorIdRepository {
private final ObjectMapper objectMapper;
private final RedisTemplate redisTemplate;
private final static String MAP_NAME = "SpringBootRedis.BookIdByNameAndAuthorId";
public Optional<Long> findById(BookNameAndAuthorId id) {
try {
String idString = objectMapper.writeValueAsString(id);
return Optional.ofNullable(
(Long)redisTemplate
.opsForHash()
.get(MAP_NAME, idString)
);
}
catch (IOException e) {
throw new IllegalStateException(e);
}
}
public void put(BookNameAndAuthorId id, Long bookId) {
try {
String idString = objectMapper.writeValueAsString(id);
redisTemplate.opsForHash()
.put(MAP_NAME, idString, bookId);
}
catch (IOException e) {
throw new IllegalStateException(e);
}
}
}
Tương đối dài đúng không? Nhưng chúng ta sẽ tiết kiệm được rất nhiều dung lượng bộ nhớ.
Đọc ghi với ezydata-redis
Để đọc ghi redis với EzyData, chúng ta sẽ cần import thư việnezydata-redis
như sau:
- Với gradle:
implementation 'com.tvd12:ezydata-redis:1.1.6'
- Với maven:
<dependency>
<groupId>com.tvd12</groupId>
<artifactId>ezydata-redis</artifactId>
<version>1.1.6</version>
</dependency>
Không giống với Spring, ezydata sử dụng Proxy design pattern để giao tiếp với Redis
Điều đó có nghĩa là bạn sẽ không cần phải sinh ra một đối tượng Repository
để làm cầu nối nhưng Spring. Để lưu một cuốn sách bạn sẽ chỉ cần sử dụng đối tượng như java thông thường:
Map<Long, Book> bookMap = redisProxy.getMap("book");
bookMap.put(book.getId(), book);
Để lấy thông tin một cuốn sách bạn cũng gọi hàm get
như bình thường:
Book book = bookMap.get(bookId);
Đối với trường hợp key phức tạp như BookNameAndAuthorId
, chúng ta cũng chỉ đơn giản tạo lớp:
@EzyCachedKey
public class BookNameAndAuthorId {
private String bookName;
private long authorId;
}
Và sử dụng như thế này:
Map<BookNameAndAuthorId, Long> map = redisProxy.getMap(
"bookIdByNameAndAuthorId",
BookNameAndAuthorId.class,
Long.class
);
map.put(bookNameAndAuthorId, bookId);
Long existedBookId = map.get(bookNameAndAuthorId);
Tổng kết
Để lập trình với redis cũng không phải dễ nếu như chúng ta chỉ sử dụng các thư viện lập trình cơ bản. Nhưng với sự ra đời của các thư viện như Spring Boot hay EzyData mọi thứ đã thật sự dễ dàng. Đặc biệt với EzyData, việc lập trình redis không khác gì với việc chúng ta lập trình với java thông thường.
Tham khảo
-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội