标签:hashcode aos 前缀 string style key 使用 rod 假设
1 单点的redis利用jedis客户端连接
如何连接
1 //1 利用jedis连接对象操作redis 2 @Test 3 public void test01(){ 4 //构造一个具有连接信息的jedis对象 5 //确定虚拟机linux系统的端口是开放的? 防火墙 6 Jedis jedis=new Jedis("192.168.60.131", 6379); 7 jedis.set("name", "hanlaoshi"); 8 jedis.expire("name", 60); 9 }
模拟缓存逻辑在系统中执行步骤
1 //2 利用打桩语句,模拟缓存的使用和数据库的调用 2 @Test 3 public void test02(){ 4 //查询商品为例,id=1的一个商品 5 String id="1"; 6 System.out.println("用户访问http://www.jt.com/product/"+id); 7 //1 利用用户请求参数,生成当前业务逻辑的唯一key值 exists 8 //企业中的key值一般都是前缀,后缀 拼接id完成的 9 String key="product_"+id; 10 Jedis jedis=new Jedis("192.168.60.131", 6379); 11 if(jedis.exists(key)){//有的话返回true,没有返回false 12 //如果有数据,需要从redis中获取value,打印返回 13 String value=jedis.get(key); 14 System.out.println("从缓存获取value:"+value); 15 }else{//缓存没有数据 16 System.out.println("缓存无数据,数据从数据库获取"); 17 //假设从数据库获取的数据 18 String value="id=1&productName=haha"; 19 System.out.println("数据获取,value:"+value); 20 //返回之前,存在redis,供后续使用 21 jedis.set(key, value); 22 System.out.println("数据跟随响应返回"); 23 } 24 }
hash取余的数据分片计算逻辑
key值是一个取值范围非常大的内存值;
hash取余公式 (key.hashCode()&Integer.MAX_VALUE)%N
N是数据分片节点的数量(3) [0,1,2] 取值结果=0的存储到6379=1的存储到6380,=2存储到6381
1 1 @Test 2 2 public void test04(){ 3 3 Jedis jedis1=new Jedis("192.168.60.131", 6379); 4 4 Jedis jedis2=new Jedis("192.168.60.131", 6380); 5 5 Jedis jedis3=new Jedis("192.168.60.131", 6381); 6 6 for(int i=0;i<5000;i++){ 7 7 String key="product_"+i; 8 8 String value="value_"+i; 9 9 //计算取余结果,同一个key总会得到一个相同的取余结果 10 10 int result=(key.hashCode()&Integer.MAX_VALUE)%3; 11 11 if(result==0){jedis1.set(key, value);} 12 12 if(result==1){jedis2.set(key, value);} 13 13 if(result==2){jedis3.set(key, value);} 14 14 } 15 15 }
标签:hashcode aos 前缀 string style key 使用 rod 假设
原文地址:https://www.cnblogs.com/nanlinghan/p/9939076.html