使用jedis连接客户端redis,以及存在问题分析(一)

本文介绍了如何使用jedis连接单节点redis,包括连接redis、模拟缓存逻辑、自定义数据分片以及hash取余的分片计算逻辑。在数据分片中,强调了自定义逻辑的重要性,同时分析了仅使用hash取余的局限性,如数据增长带来的压力和应对非结构化数据的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单节点的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();
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值