Skip to content

Commit 7ef57e3

Browse files
committed
feat: java操作redis各种数据类型
1 parent 8bd3f3e commit 7ef57e3

File tree

1 file changed

+167
-0
lines changed
  • content/post/redis_in_action _08_java_mysql_redis

1 file changed

+167
-0
lines changed

content/post/redis_in_action _08_java_mysql_redis/index.md

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,3 +244,170 @@ false
244244
使用管道耗时:28ms
245245
```
246246
**通过以上例子,可以看到,如果需要大批量的向Redis服务器读写数据,那么建议采用管道的方式提升性能。**
247+
248+
### 2. Java操作各种Redis数据类型
249+
#### 读写列表类对象
250+
```java
251+
public static void main(String[] args) {
252+
listDemo();
253+
}
254+
255+
/**
256+
* List数据结构演示
257+
* 该方法用于演示如何使用Jedis操作List数据结构,包括插入和查询操作
258+
*/
259+
private static void listDemo() {
260+
// 创建Jedis对象,连接本地Redis服务器
261+
Jedis jedis = new Jedis("localhost", 6379);
262+
263+
// 向List的尾部添加元素
264+
jedis.rpush("001", "Peter");
265+
jedis.rpush("001", "15");
266+
jedis.rpush("001", "Male");
267+
268+
// 检查Key是否存在
269+
if (jedis.exists("001")) {
270+
// 如果Key存在,打印List中的每个元素
271+
System.out.println(jedis.lindex("001", 0));
272+
System.out.println(jedis.lindex("001", 1));
273+
System.out.println(jedis.lindex("001", 2));
274+
} else {
275+
// 如果Key不存在,打印提示信息
276+
System.out.println("Key does not exist,get from db");
277+
}
278+
}
279+
// 运行程序,输出结果如下:
280+
Peter
281+
15
282+
Male
283+
```
284+
285+
#### 2.读写哈希表对象
286+
> 如果待缓存对象的属性个数很多,就建议用哈希表对象来缓存:一方面,在哈希表中是用属性名称来定位数据的,而不是属性的顺序;另一方面,哪怕没存若干属性,也不会影响对该对象的读取,顶多就是读取的属性值为空。
287+
288+
```java
289+
/**
290+
* 示例如何使用Jedis操作Hash数据类型
291+
* 该方法连接到本地的Redis服务器,使用HSET命令向两个员工ID(Emp002和Emp003)添加信息,
292+
* 并使用HGET命令获取这些信息
293+
*/
294+
static void hashDemo() {
295+
// 创建Jedis实例,连接到本地Redis服务器
296+
Jedis jedis = new Jedis("localhost", 6379);
297+
298+
// 向Emp002这个Hash中设置name、age和gender字段
299+
jedis.hset("Emp002", "name", "Peter");
300+
jedis.hset("Emp002", "age", "15");
301+
jedis.hset("Emp002", "gender", "Male");
302+
303+
// 获取并打印Emp002的name和age字段
304+
System.out.println(jedis.hget("Emp002", "name"));
305+
System.out.println(jedis.hget("Emp002", "age"));
306+
307+
// 使用Map封装Emp003的信息,然后一次性设置到Redis中
308+
Map<String, String> emp03 = new HashMap<>();
309+
emp03.put("name", "farb");
310+
emp03.put("age", "18");
311+
emp03.put("gender", "Male");
312+
jedis.hset("Emp003", emp03);
313+
314+
// 再次获取并打印Emp002和Emp003的name字段,展示数据一致性
315+
System.out.println(jedis.hget("Emp002", "name"));
316+
System.out.println(jedis.hget("Emp002", "age"));
317+
}
318+
// 运行程序,输出结果如下:
319+
Peter
320+
15
321+
farb
322+
18
323+
```
324+
325+
#### 3.读写集合对象
326+
> 一般项目中,大多使用Redis的字符串,列表和哈希表来缓存数据,而集合对象一般用于去重的场景。
327+
328+
```java
329+
/**
330+
* 使用Jedis操作Redis的Set数据结构的演示方法
331+
* 该方法展示了如何向Set中添加元素,并打印出Set中的所有元素
332+
*/
333+
static void setDemo() {
334+
// 创建Jedis对象,连接本地的Redis服务器
335+
Jedis jedis = new Jedis("localhost", 6379);
336+
// 向Set“bonusId”中添加元素“1”、“2”、“3”、“4”、“1”,注意重复元素会被忽略
337+
jedis.sadd("bonusId", "1", "2", "3", "4", "1");
338+
// 打印Set“bonusId”中的所有元素
339+
System.out.println(jedis.smembers("bonusId"));
340+
}
341+
// 运行程序,输出结果如下:
342+
[1, 2, 3, 4]
343+
```
344+
345+
#### 4.读写有序集合对象
346+
347+
```java
348+
/**
349+
* 示范使用Sorted Set数据结构的操作
350+
* 该方法主要展示了如何在Redis中使用Jedis操作Sorted Set,包括添加成员和获取排序范围
351+
*/
352+
static void sortedSetDemo() {
353+
// 创建Jedis对象,连接本地的Redis服务器
354+
Jedis jedis = new Jedis("localhost", 6379);
355+
// 向Sorted Set "emps"中添加成员"Peter",分数为1.0
356+
jedis.zadd("emps", 1.0, "Peter");
357+
// 向Sorted Set "emps"中添加成员"Jane",分数为3.0
358+
jedis.zadd("emps", 3.0, "Jane");
359+
// 向Sorted Set "emps"中添加成员"Mike",分数为2.0
360+
jedis.zadd("emps", 2.0, "Mike");
361+
// 打印Sorted Set "emps"中所有成员,验证添加操作的结果
362+
System.out.println(jedis.zrange("emps", 0, -1));
363+
364+
// 根据分数范围查询并打印Sorted Set "emps"中的成员及其分数,分数范围为2.0到3.0
365+
System.out.println(jedis.zrangeByScoreWithScores("emps", 2.0, 3.0));
366+
}
367+
// 运行程序,输出结果如下:
368+
[Peter, Mike, Jane]
369+
[[Mike,2.0], [Jane,3.0]]
370+
```
371+
372+
#### 5.操作地理位置数据
373+
374+
```java
375+
/**
376+
* 地理位置演示函数
377+
* 该函数演示了如何使用Jedis操作Redis中的地理位置数据
378+
* 主要包括添加地理位置数据、获取位置信息、查询一定半径内的地理位置以及计算两点间的距离
379+
*/
380+
static void geoDemo() {
381+
// 创建Jedis对象,连接本地的Redis服务器
382+
Jedis jedis = new Jedis("localhost", 6379);
383+
384+
// 向Redis中添加地理位置数据,包括经度、纬度和位置标识
385+
jedis.geoadd("geo", 120.52, 30.40, "pos1");
386+
jedis.geoadd("geo", 120.52, 31.53, "pos2");
387+
jedis.geoadd("geo", 122.12, 30.40, "pos3");
388+
jedis.geoadd("geo", 122.12, 31.53, "pos4");
389+
390+
// 打印所有位置的地理坐标
391+
System.out.println(jedis.geopos("geo", "pos1", "pos2", "pos3", "pos4"));
392+
393+
// 查询以给定经纬度为中心,指定半径内的地理位置
394+
List<GeoRadiusResponse> geoList = jedis.georadius("geo", 120.52, 30.40, 200, GeoUnit.KM);
395+
for (GeoRadiusResponse res : geoList) {
396+
// 打印查询到的地理位置
397+
System.out.println(res.getMemberByString());
398+
}
399+
400+
// 计算两个地理位置之间的距离
401+
Double distance = jedis.geodist("geo", "pos1", "pos2", GeoUnit.KM);
402+
// 打印计算得到的距离
403+
System.out.println(distance);
404+
}
405+
// 运行程序,输出结果如下:
406+
[(120.5200007557869,30.399999526689975), (120.5200007557869,31.530001032013715), (122.11999744176865,30.399999526689975), (122.11999744176865,31.530001032013715)]
407+
pos1
408+
pos2
409+
pos3
410+
pos4
411+
125.6859
412+
413+
```

0 commit comments

Comments
 (0)