继上一篇使用jedis连接redis-cluster进行list列表数据结构api演示
之后的第三章节。本章内容讲解使用jedis连接redis-cluster进行hash数据结构api演示。
package com.coderman.jedis.clusterdemo;
import com.alibaba.fastjson.JSON;
import org.junit.Test;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
* @Author fanchunshuai
* @Date 2019/12/27 18
* @Description:
* redis hash操作 api
*/
public class HashDataAPITest extends ClusterTest {
@Test
public void testAddHashUser(){
String userKey = "user:1000";
Map<String,String> userMap = new HashMap<>();
userMap.put("uname","fanchunshuai");
userMap.put("uid","1203");
userMap.put("deptid","890");
userMap.put("sid","3094");
userMap.put("ucname","樊春帅");
userMap.forEach((k,v)->{
cluster.hset(userKey.getBytes(),k.getBytes(),v.getBytes());
});
userMap.forEach((k,v)->{
//一个一个获取
String value = new String(cluster.hget(userKey.getBytes(),k.getBytes()));
System.out.println("value = "+value);
//第二种方式
String value2 = cluster.hget(userKey,k);
System.out.println("value2 = "+value2);
});
Map<String,String> userMap2 = cluster.hgetAll(userKey);
System.out.println(JSON.toJSONString(userMap2));
}
@Test
public void testUpadateHashUser(){
String userKey = "user:1000";
Map<String,String> userMap = new HashMap<>();
userMap.put("uname","fanchunshuai");
userMap.put("uid","1203");
userMap.put("deptid","890");
userMap.put("sid","3094");
userMap.put("ucname","樊春帅");
userMap.forEach((k,v)->{
//一个一个获取
String value = new String(cluster.hget(userKey.getBytes(),k.getBytes()));
System.out.println("value = "+value);
//第二种方式
String value2 = cluster.hget(userKey,k);
System.out.println("value2 = "+value2);
});
Map<String,String> userMap2 = cluster.hgetAll(userKey);
System.out.println(JSON.toJSONString(userMap2));
//修改其中hash 中uname的值
cluster.hset(userKey,"uname","fanchunshuai002");
Map<String,String> userMap3 = cluster.hgetAll(userKey);
System.out.println(JSON.toJSONString(userMap3));
}
@Test
public void testAddHashFeedStream(){
Random random = new Random();
//构造10000条微博动态
for (int i = 0;i < 10000;i++){
//假设有一条微博动态feed,id = 1000
String userKey = "feed:"+i;
Map<String,String> map = cluster.hgetAll(userKey);
if(map == null || map.isEmpty()){
continue;
}
Map<String,String> feedMap = new HashMap<>();
//评论数
feedMap.put("comment",random.nextInt(100)+"");
//点赞数
feedMap.put("praise",random.nextInt(10000)+"");
//发布时间
feedMap.put("ctime",(System.currentTimeMillis() - random.nextInt(10000))+"");
feedMap.forEach((k,v)->{
cluster.hset(userKey.getBytes(),k.getBytes(),v.getBytes());
});
}
//查询10000条微博动态
for (int i = 0;i < 10000;i++) {
//假设有一条微博动态feed,id = 1000
String userKey = "feed:" + i;
Map<String,String> feedMap = cluster.hgetAll(userKey);
System.out.println(JSON.toJSONString(feedMap));
//点赞数加1
cluster.hincrBy(userKey,"praise",1L);
Map<String,String> feedMap2 = cluster.hgetAll(userKey);
System.out.println(JSON.toJSONString(feedMap2));
Integer prasie = Integer.parseInt(feedMap2.get("praise"));
//点赞数大于5000设置uid
if(prasie.intValue() > 5000){
cluster.hset(userKey,"uid",random.nextInt(100000000)+"");
Map<String,String> feedMap3 = cluster.hgetAll(userKey);
System.out.println(JSON.toJSONString(feedMap3));
}
}
}
/**
* 测试游标遍历
* redis可以通过keys *命令获取所有key,或者通过匹配模式
* 如keys user:*但是这种方式可能会导致redis存在阻塞,影响服务稳定性,
* 使用下面的hscan可以降低这种风险
* 参考《Redis深度历险:核心原理和应用实践》
*/
@Test
public void testHashScan(){
String userKey = "user:1000";
int cursor = 0;
ScanParams scanParams = new ScanParams();
//设置一次取100条
scanParams.count(100);
ScanResult scanResult = cluster.hscan(userKey,"0",scanParams);
System.out.println(JSON.toJSONString(scanResult.getResult()));
List<String> retList = new ArrayList<>();
//这里演示对一个hash key增加超过10000个元素,然后进行遍历
Map<String,String> userMap = new HashMap<>();
userMap.put("uname","fanchunshuai");
userMap.put("uid","1203");
userMap.put("deptid","890");
userMap.put("sid","3094");
userMap.put("ucname","樊春帅");
for (int i = 0;i < 10000;i++){
userMap.put("uname"+i,"uname"+i);
}
userMap.forEach((k,v)->{
cluster.hset(userKey.getBytes(),k.getBytes(),v.getBytes());
});
//下面是通过hscan命令循环获取
//使用do while循环
String scanRet = "";
do {
ScanResult scanResult2 = cluster.hscan(userKey,"0",scanParams);
scanRet = scanResult2.getStringCursor();
retList.addAll(scanResult2.getResult());
System.out.println("retList = "+retList.size());
} while (!scanRet.equals("0"));
}
}