Redis 클 라 이언 트 단순 패키지(봄)
1.단일 노드 Redis 서비스 사용
즉 하나의 Redis server 만 있 거나 M-S 모드 에서 Master 만 읽 기와 쓰기 서 비 스 를 제공 할 때 사용 하 며,설정 에 Master 의 IP 와 Port 를 지정 하면 된다.Spring Factory Bean 방식 으로 JedisPool 인 스 턴 스 를 만 들 었 습 니 다.
1、SingletonClientFactoryBean.java
public class SingletonClientFactoryBean implements FactoryBean,InitializingBean {
private JedisPool jedisPool;
private int maxTotal = 128;
//
private int maxIdle = 2;
//
private int minIdle = 1;
// , , 6
private long maxWait = 6000;//
private String host;
private int port;
private int database = 0;// , 0
private int timeout = 3000;//connectionTimeout,soTimeout, 30
private boolean testOnBorrow = true;
private boolean testOnReturn = true;
private String password;
public void setMaxTotal(int maxTotal) {
this.maxTotal = maxTotal;
}
public void setMaxIdle(int maxIdle) {
this.maxIdle = maxIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public void setMaxWait(long maxWait) {
this.maxWait = maxWait;
}
public void setHost(String host) {
this.host = host;
}
public void setPort(int port) {
this.port = port;
}
public void setDatabase(int database) {
this.database = database;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public void setPassword(String password) {
this.password = password;
}
protected JedisPoolConfig buildConfig() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMinIdle(minIdle);
config.setMaxIdle(maxIdle);
config.setMaxTotal(maxTotal);
config.setTestOnBorrow(testOnBorrow);
config.setTestOnReturn(testOnReturn);
config.setBlockWhenExhausted(true);
config.setMaxWaitMillis(maxWait);
config.setFairness(false);
return config;
}
@Override
public void afterPropertiesSet() throws Exception {
JedisPoolConfig config = buildConfig();
jedisPool = new JedisPool(config,host,port,timeout, password, database,null);
}
@Override
public JedisPool getObject() throws Exception {
return jedisPool;
}
@Override
public Class> getObjectType() {
return JedisPool.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
2,Spring.xml 설정
3.클 라 이언 트 사용
Jedis jedis = redisClient.getResource();
String cacheContent = null;
try {
cacheContent = jedis.get("hello_world");
}finally {
redisClient.close();
}
// redis , ,
if(cacheContent == null) {
//DB operation
}
//..
2.M-S 모드 에서 읽 기와 쓰기 분리
일반적으로 Slave 는 데이터 백업 일 뿐 read 작업 을 제공 하지 않 습 니 다.이러한 고려 는 slave 가 stale 데 이 터 를 제공 하 는 것 을 피하 기 위해 서 입 니 다.그러나 많은 장면 에서 slave 데이터 가 일정한 지연 이 있 더 라 도 우 리 는 호 환 되 거나 정상적으로 처리 할 수 있 습 니 다.이때 우 리 는 slave 를 read 서 비 스 를 제공 하고 M-S 클 러 스 터 에서 read 작업 을 분류 할 수 있 습 니 다.이때 우리 의 Redis 클 러 스 터 는 더욱 높 은 QPS 를 지탱 할 수 있 습 니 다.
본 논문 의 사례 에서'읽 기와 쓰기 분리'모델 만 제 공 했 을 뿐 모든 redis 방법 에 대해 재 작성 과 패 키 징 을 하지 않 았 습 니 다.개발 자 는 나중에 계속 보충 하면 됩 니 다.그 밖 에 slave 노드 가 이상 하면 우 리 는 failover 를 지원 해 야 합 니 다.이 부분의 기능 은 나중에 확장 되 고 있 습 니 다.
1、ReadWriteRedisClient.java
public class ReadWriteRedisClient implements InitializingBean {
//master:port,slave:port,slave:port...
//master first
private String hosts;
private JedisPool master;
private List slaves = new ArrayList<>();
private int maxTotal = 128;
//
private int maxIdle = 2;
//
private int minIdle = 1;
// , , 6
private long maxWait = 6000;//
private int database = 0;// , 0
private int timeout = 3000;//connectionTimeout,soTimeout, 30
private boolean testOnBorrow = true;
private boolean testOnReturn = true;
private String password;
private Random random = new Random();
public void setMaxTotal(int maxTotal) {
this.maxTotal = maxTotal;
}
public void setMaxIdle(int maxIdle) {
this.maxIdle = maxIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public void setMaxWait(long maxWait) {
this.maxWait = maxWait;
}
public void setDatabase(int database) {
this.database = database;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public void setPassword(String password) {
this.password = password;
}
public void setHosts(String hosts) {
this.hosts = hosts;
}
protected JedisPoolConfig buildConfig() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMinIdle(minIdle);
config.setMaxIdle(maxIdle);
config.setMaxTotal(maxTotal);
config.setTestOnBorrow(testOnBorrow);
config.setTestOnReturn(testOnReturn);
config.setBlockWhenExhausted(true);
config.setMaxWaitMillis(maxWait);
config.setFairness(false);
return config;
}
@Override
public void afterPropertiesSet() throws Exception {
JedisPoolConfig config = buildConfig();
String[] hostAndPorts = hosts.split(",");
String masterHP = hostAndPorts[0];
String[] ms = masterHP.split(":");
master = new JedisPool(config,ms[0],Integer.valueOf(ms[1]),timeout, password, database,null);
if(hostAndPorts.length > 1) {
for(int i = 1; i < hostAndPorts.length; i++) {
String[] ss = hostAndPorts[i].split(":");
JedisPool slave = new JedisPool(config,ss[0],Integer.valueOf(ss[1]),timeout, password, database,null);
slaves.add(slave);
}
}
slaves.add(master);
}
public String get(String key) {
Jedis jedis = fetchResource(true);
try {
return jedis.get(key);
} finally {
jedis.close();
}
}
public List mget(String... keys) {
Jedis jedis = fetchResource(true);
try {
return jedis.mget(keys);
} finally {
jedis.close();
}
}
public String setex(String key,int seconds,String value) {
Jedis jedis = fetchResource(false);
try {
return jedis.setex(key,seconds,value);
} finally {
jedis.close();
}
}
public Long setnx(String key,String value) {
Jedis jedis = fetchResource(false);
try {
return jedis.setnx(key,value);
} finally {
jedis.close();
}
}
public String set(String key,String value) {
Jedis jedis = fetchResource(false);
try {
return jedis.set(key,value);
} finally {
jedis.close();
}
}
public Long del(String key) {
Jedis jedis = fetchResource(false);
try {
return jedis.del(key);
} finally {
jedis.close();
}
}
public Long expire(String key,int seconds) {
Jedis jedis = fetchResource(false);
try {
return jedis.expire(key,seconds);
} finally {
jedis.close();
}
}
public Boolean exists(String key) {
Jedis jedis = fetchResource(false);
try {
return jedis.exists(key);
} finally {
jedis.close();
}
}
public Long exists(String... keys) {
Jedis jedis = fetchResource(false);
try {
return jedis.exists(keys);
} finally {
jedis.close();
}
}
private Jedis fetchResource(boolean read) {
if(slaves.isEmpty() || !read) {
return master.getResource();
}
int size = slaves.size();
int i = random.nextInt(size);
return slaves.get(i).getResource();
}
public static void main(String[] args) throws Exception {
String prefix = "_test_";
ReadWriteRedisClient client = new ReadWriteRedisClient();
client.setHosts("127.0.0.1:6379,127.0.0.1:6379");
client.afterPropertiesSet();
client.set(prefix + "10001","test");
System.out.println(client.get(prefix + "10001"));
}
}
2,Spring.xml 설정
3.클 라 이언 트 사용
@Autowired
private JedisPool redisClient;
public void test() {
Jedis jedis = redisClient.getResource();
//..
String cacheContent = null;
try {
cacheContent = readWriteRedisClient.get("hello_world");
} catch (Exception e) {
// redis , ,
}
if(cacheContent == null) {
//redis ,
}
}
3.Cluster 모드 를 바탕 으로 하 는 클 라 이언 트
JedisCluster 인 스 턴 스 의 간단 한 패 키 징 은 내부 에 연결 풀 을 기반 으로 합 니 다.cluster 모드 에서 mget 등 multi-keys 작업 은 더 이상 지원 되 지 않 습 니 다.사실 우 리 는 아무리 포장 해도 multi-keys 문 제 를 합 리 적 으로 해결 할 수 없습니다.여 기 는 K-V 가 클 러 스 터 에서 의 이전,노드 가용성,대량 작업 의 이상 처리 와 관련 됩 니 다.특히 이상 처리 할 때 특정한 key 작업 이 이상(대응 할 수 있 는 redis 노드 이상)하면 다른 성공 적 인 keys,또는 후속 작업 하지 않 은 keys 는 어떻게 처리 해 야 합 니까?이 답안 은 모호 하고 분명 하지 않다.그 밖 에 우리 JAVA 개발 자 들 은 보통 스 레 드 탱크+Future 체 제 를 사용 하여 multi-keys 작업 을 분해 합 니 다.사실은 이것 은 매우 큰 성능 위험 을 가 져 올 수 있 으 므 로 사용 하 는 것 을 권장 하지 않 습 니 다.
저 는 최종 적 으로 redis Cluster 의 api 방식 을 보류 하고 특별한 포장 을 하지 않 으 며 spring 환경 에서 쉽게 사용 할 수 있 도록 하기 로 결 정 했 습 니 다.
1、ClusterClientFactoryBean.java
public class ClusterClientFactoryBean implements FactoryBean,InitializingBean {
private JedisCluster jedisCluster;
private int maxTotal = 128;
//
private int maxIdle = 6;
//
private int minIdle = 1;
// , , 6
private long maxWait = 6000;//
private int timeout = 3000;//connectionTimeout,soTimeout, 3
private boolean testOnBorrow = true;
private boolean testOnReturn = true;
private String addresses;//ip:port;ip:port
public void setMaxTotal(int maxTotal) {
this.maxTotal = maxTotal;
}
public void setMaxIdle(int maxIdle) {
this.maxIdle = maxIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public void setMaxWait(long maxWait) {
this.maxWait = maxWait;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public void setAddresses(String addresses) {
this.addresses = addresses;
}
protected JedisPoolConfig buildConfig() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMinIdle(minIdle);
config.setMaxIdle(maxIdle);
config.setMaxTotal(maxTotal);
config.setTestOnBorrow(testOnBorrow);
config.setTestOnReturn(testOnReturn);
config.setBlockWhenExhausted(true);
config.setMaxWaitMillis(maxWait);
config.setFairness(false);
return config;
}
private Set buildHostAndPorts() {
String[] hostPorts = addresses.split(",");
Set hostAndPorts = new HashSet<>();
for(String item : hostPorts) {
String[] hostPort = item.split(":");
HostAndPort hostAndPort = new HostAndPort(hostPort[0],Integer.valueOf(hostPort[1]));
hostAndPorts.add(hostAndPort);
}
return hostAndPorts;
}
@Override
public void afterPropertiesSet() throws Exception {
JedisPoolConfig config = buildConfig();
Set hostAndPorts = buildHostAndPorts();
jedisCluster = new JedisCluster(hostAndPorts,timeout,config);
}
@Override
public JedisCluster getObject() throws Exception {
return jedisCluster;
}
@Override
public Class> getObjectType() {
return JedisCluster.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
2,Spring.xml 설정
3.클 라 이언 트 사용
@Autowired
private JedisCluster clusterRedisClient;
public void test() {
String cacheContent = null;
try {
cacheContent = clusterRedisClient.get("hello_world");
} catch (Exception e) {
// ,
}
if(cacheContent == null) {
// cache , redis
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.