使用jedis连接客户端redis
单节点的redis使用jedis客户端
1.连接redis
@test
public void test1(){
Jedis jedis = new Jedis("cloud01","6379");//cloud01为jedis的ip地址
jedis.set("name","nihao");
jedis.expire("name",60);
}
2.模拟缓存逻辑在系统中的执行步骤
@test
public void test2(){
//假设查询id
String id = "1";
Jedis jedis = new Jedis("cloud01","6379");//cloud01为jedis的ip地址
if(jedis.exists(id)){//redis中是否存在所查询的key
system.out.println("从缓存获取值:"+jedis.get(id));
}else{//如果缓存中没有则向数据库中查询,并把值存入缓存中
String value = "id=1&value=3";从数据库获取值
system.out.println("从数据库获取值:"+value);
jedis.set(id,value);//存入缓存中
}
}
3 自定义数据分片
三个redis节点形成一个集成,分布式的,可以利用三个节点切分存储一个整体海量数据,需要定义切分过程的计算逻辑–>数据分片计算
自定义的逻辑:
假设key值从0-99一共100条; 自定义平均下分数据分片
@Test
public void test03(){
//利用for循环,模拟没此循环都生成新的key-value,存
Jedis jedis1=new Jedis("cloud01", 6379);
Jedis jedis2=new Jedis("cloud01", 6380);
Jedis jedis3=new Jedis("cloud01", 6381);
for(int i=0;i<100;i++){
String key=i+"";
String value="value_"+i;
if(i<33){
//存到6379
jedis1.set(key, value);
}else if(i<66){
//6380
jedis2.set(key, value);
}else{
jedis3.set(key, value);
}}
int i=50;
String key=i+"";
if(i<33){
//存到6379
System.out.println(jedis1.get(key));
}else if(i<66){
//6380
System.out.println(jedis2.get(key));
}else{
System.out.println(jedis3.get(key));}}
原则:存储数据,修改数据,新增数据,删除数据都是对key值相关做计算;必须分片计算逻辑完全一致,否则可能导致数据操作失败;
缺陷:1 数据是在不断增加的,只考虑100条数据,当数据增长时,6381严重的压力;
2 当我们无法通过一个固定的逻辑判断切分时(i),计算将如何进行?数据来源,数据的情况不同,都会造成计算逻辑的变动;无法面对非结构化海量数据(情况不定);迫切需要自定义数据分片逻辑,更新,满足更多的需求;
4 hash取余的数据分片计算逻辑
key值是一个取值范围非常大的内存值;
hash取余公式(key.hashCode()&Integer.MAX_VALUE)%N
N是数据分片节点的数量(3) [0,1,2] 取值结果=0的存储到6379,=1的存储到6380,=2存储到6381
@Test
public void test04(){
Jedis jedis1=new Jedis("cloud01", 6379);
Jedis jedis2=new Jedis("cloud02", 6380);
Jedis jedis3=new Jedis("cloud03", 6381);
for(int i=0;i<5000;i++){
String key="product_"+i;
String value="value_"+i;
//计算取余结果,同一个key总会得到一个相同的取余结果
int result=(key.hashCode()&Integer.MAX_VALUE)%3;
if(result==0){jedis1.set(key, value);}
if(result==1){jedis2.set(key, value);}
if(result==2){jedis3.set(key, value);}
}
}
5 自定义,hash取余等分片计算都可以实现数据的切分存储,jedis也实现了内部的分片计算(hash一致性); jedis将hash一致性封装到一个jedis分片对象,和调用jedis对象没有任何区别
//封装hash一致性分片算法的分片对象
@Test
public void test05(){
//收集集群节点信息6379-6381
List<JedisShardInfo> infoList=new ArrayList<JedisShardInfo>();
JedisShardInfo info1=new
JedisShardInfo("cloud01", 6379);
JedisShardInfo info2=new
JedisShardInfo("cloud01", 6380);
JedisShardInfo info3=new
JedisShardInfo("cloud01", 6381);
//添加到list对象
infoList.add(info1);
infoList.add(info2);
infoList.add(info3);
//利用list完成分片对象的创建
ShardedJedis sJedis=new ShardedJedis(infoList);
//测试存放
/*String key="name";
String value="hanlaoshi";*/
/*sJedis.set(key, value);*/
//测试取出
System.out.println(sJedis.get("name"));
//关闭连接
sJedis.close();
}