关于redis连接池的实战

关于redis连接池的实战

  • pom层
  • controller层
  • service层
  • Redis配置类
  • hash取余封装类

pom层

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--redis测试客户端jedis依赖--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>

controller层

/*** 测试与redis读写有关的请求功能接口*/
@RestController
public class RedisController {/*** 请求地址:/set* 请求参数:String key,String value TODO 数据如果不是字符串?User对象* 返回数据:成功和失败的“success” “fail”*/@Autowiredprivate RedisService redisService;@RequestMapping(value="/set")public String setData(String key,String value){redisService.setData(key,value);return "success";}
}

service层

@Service
public class RedisService {@Autowiredprivate ShardedJedisPool pool;public void setData(String key, String value) {//获取资源ShardedJedis resource = pool.getResource();try{resource.set(key,value);}catch (Exception e){e.printStackTrace();}finally{if(resource!=null){resource.close();}}}
}

Redis配置类

/*** 初始化一个连接池对象,交给容器管理*/
@Configuration
public class RedisConfig {//TODO 读取properties属性实现数据的追加//请将这个初始化方法中的所有set进的值替换成读取的属性@Value("${redis.jedis.nodes}")private List<String> nodes; //["10.0.0.0:8080","10.0.0.1:8080"]@Beanpublic ShardedJedisPool initPool(){//需要两个对象 config nodesJedisPoolConfig config=new JedisPoolConfig();config.setMaxIdle(10);config.setMinIdle(2);config.setMaxTotal(50);List<JedisShardInfo> nodes=new ArrayList<>();nodes.add(new JedisShardInfo("192.168.184.130",6379));nodes.add(new JedisShardInfo("192.168.184.130",6380));nodes.add(new JedisShardInfo("192.168.184.130",6381));return new ShardedJedisPool(config,nodes);}
}

hash取余封装类

/*** 用来包装分片计算方法 hash取余,* 需要用这个方法 对jedis的所有读写操作,做api的重写* 是我们自定义分片计算方法的分片对象,通过这个类,可以保证调用api不变* 但是数据是分布式存储的。*/
public class MyShardedJedis {//准备分片集群private List<Jedis> nodes;//测试会有3个元素 6379(0) 6380(1) 6381(2)//构造方法传递正在使用的分片集群public MyShardedJedis(List<Jedis> nodes){this.nodes=nodes;}//封装一个方法 getShard 利用分片节点 nodes计算hash取余public Jedis getShard(String key){//利用key值做hash取余计算 得到key在当前集群中对应哪个节点if(key==null){throw new RuntimeException("你的key是空的");}int index=(key.hashCode()&Integer.MAX_VALUE)%nodes.size();//0,1,2return nodes.get(index);}//挨个封装jedis的api 形成分布式计算//set get exists ttlpublic void set(String key,String value){//获取分片,直到key值对应哪个节点Jedis shard = getShard(key);shard.set(key,value);}public String get(String key){Jedis shard = getShard(key);return shard.get(key);}public boolean exists(String key){Jedis shard = getShard(key);return shard.exists(key);}public Long ttl(String key){Jedis shard = getShard(key);return shard.ttl(key);}//TODO
}