Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 19d2ef8

Browse files
committed
feat: add redis-list-paginate.md
利用 Redis List 实现页面数据分页
1 parent 9ea9138 commit 19d2ef8

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
### [List 列表](/docs/redis-list-introduction.md)
3939
- 如何利用 Redis List 实现异步消息队列?
40+
- [用 Redis 如何实现页面数据分页的效果?](/docs/redis-list-paginate.md)
4041

4142
### [Set 集合](/docs/redis-set-introduction.md)
4243

‎docs/redis-list-paginate.md‎

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# 利用 Redis 列表实现页面数据分页
2+
3+
## 代码实现
4+
| [Python](#Python-版本) | [Java](#Java-版本) |
5+
|---|---|
6+
7+
### Python 版本
8+
```python
9+
from redis import Redis
10+
11+
12+
class Paginate:
13+
def __init__(self, client: Redis, key: str):
14+
self.client = client
15+
self.key = key
16+
17+
def add(self, item):
18+
"""添加元素到分页列表中"""
19+
self.client.lpush(self.key, item)
20+
21+
def get_page(self, page: int, per_page: int):
22+
"""根据页码取出指定数量的元素"""
23+
start = (page - 1) * per_page
24+
end = page * per_page - 1
25+
return self.client.lrange(self.key, start, end)
26+
27+
def get_size(self):
28+
"""获取列表的元素数量"""
29+
return self.client.llen(self.key)
30+
31+
32+
if __name__ == '__main__':
33+
redis = Redis(decode_responses=True)
34+
topics = Paginate(redis, 'user-topics')
35+
36+
for i in range(24):
37+
topics.add(i)
38+
39+
# 取总数
40+
print(topics.get_size()) # 24
41+
42+
# 以每页5条数据的方式取出第1页数据
43+
print(topics.get_page(1, 5)) # ['23', '22', '21', '20', '19']
44+
45+
# 以每页10条数据的方式取出第1页数据
46+
print(topics.get_page(1, 10)) # ['23', '22', '21', '20', '19', '18', '17', '16', '15', '14']
47+
48+
# 以每页5条数据的方式取出第5页数据
49+
print(topics.get_page(5, 5)) # ['3', '2', '1', '0']
50+
51+
```
52+
53+
### Java 版本
54+
```java
55+
import redis.clients.jedis.Jedis;
56+
57+
import java.util.List;
58+
59+
public class Paginate {
60+
61+
private Jedis client;
62+
private String key;
63+
64+
public Paginate(Jedis client, String key) {
65+
this.client = client;
66+
this.key = key;
67+
}
68+
69+
/**
70+
* 添加元素到分页列表中
71+
*
72+
* @param item 元素
73+
*/
74+
public void add(String item) {
75+
client.lpush(key, item);
76+
}
77+
78+
/**
79+
* 根据页码取出指定数量的元素
80+
*
81+
* @param page 页码
82+
* @param pageSize 数量
83+
* @return 元素列表
84+
*/
85+
public List<String> getPage(int page, int pageSize) {
86+
long start = (page - 1) * pageSize;
87+
long end = page * pageSize - 1;
88+
return client.lrange(key, start, end);
89+
}
90+
91+
/**
92+
* 获取列表的元素数量
93+
*
94+
* @return 总数
95+
*/
96+
public Long getTotalCount() {
97+
return client.llen(key);
98+
}
99+
100+
public static void main(String[] args) {
101+
Jedis client = new Jedis();
102+
Paginate topics = new Paginate(client, "user-topics");
103+
for (int i = 0; i < 24; ++i) {
104+
topics.add(i + "");
105+
}
106+
107+
// 取总数
108+
System.out.println(topics.getTotalCount()); // 24
109+
110+
// 以每页5条数据的方式取出第1页数据
111+
System.out.println(topics.getPage(1, 5)); // [23, 22, 21, 20, 19]
112+
113+
// 以每页10条数据的方式取出第1页数据
114+
System.out.println(topics.getPage(1, 10)); // [23, 22, 21, 20, 19, 18, 17, 16, 15, 14]
115+
116+
// 以每页5条数据的方式取出第5页数据
117+
System.out.println(topics.getPage(5, 5)); // [3, 2, 1, 0]
118+
}
119+
}
120+
```

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /