设为首页 收藏本站
查看: 1376|回复: 0

[经验分享] Redis Java客户端Jredis

[复制链接]

尚未签到

发表于 2015-11-12 11:56:39 | 显示全部楼层 |阅读模式
JRedis 是一个高性能的 Java 客户端,用来连接到Redis分布式哈希键-值数据库。提供同步和异步的连接。

  项目地址:https://github.com/alphazero/jredis
   DSC0000.jpg


  由于jreds的jar包不在公网的maven仓库中,所以需要下载源码使用如下命令,将jar添加到本地maven仓库中。
  cd jredis-master\core
  mvn -Dmaven.test.skip=true install
  在工程pom.xml中添加依赖:
  <dependency>
<groupId>org.jredis</groupId>
<artifactId>jredis-core-all</artifactId>
<version>a.0-SNAPSHOT</version>
</dependency>1.简单实例
  package cn.slimsmart.redis.demo.jredis;
import java.util.Date;
import org.jredis.JRedis;
import org.jredis.RedisException;
import org.jredis.ri.alphazero.JRedisClient;
import org.jredis.ri.alphazero.support.DefaultCodec;
public class JredisTest {
public static void main(String[] args) throws Exception {
JRedis jredis = new JRedisClient(&quot;192.168.36.189&quot;, 6379);
//jredis.auth(password);
try {
jredis.ping();
//是否通
//清空数据库
jredis.flushdb();
} catch (RedisException e) {
e.printStackTrace();
}
jredis.set(&quot;key&quot;, &quot;abc&quot;);
if(jredis.exists(&quot;key&quot;)){  
System.out.println(new String(jredis.get(&quot;key&quot;)));
}  
//保存单个对象
User user = new User();
user.setBirthDate(new Date());
user.setName(&quot;jack&quot;);
jredis.set(&quot;user&quot;, user);
System.out.println(DefaultCodec.decode(jredis.get(&quot;user&quot;)));
//集合
jredis.sadd(&quot;userList&quot;, user);
user = new User();
user.setBirthDate(new Date());
user.setName(&quot;lucy&quot;);
jredis.sadd(&quot;userList&quot;, user);
System.out.println(DefaultCodec.decode(jredis.smembers(&quot;userList&quot;)));
//关闭
jredis.quit();
}
}
除此之外,jredis连接redis服务器端还可以使用如下方式:
  ConnectionSpec connectionSpec = DefaultConnectionSpec.newSpec(&quot;192.168.36.189&quot;, 6379, 0,null);
connectionSpec.setReconnectCnt(100);  
//connectionSpec.setConnectionFlag(Connection.Flag.RELIABLE, Boolean.TRUE);
//connectionSpec.setHeartbeat(2);  
connectionSpec.setMaxConnectWait(3000);
//JRedis jredis = new JRedisClient(connectionSpec);
JRedis jredis = new JRedisPipelineService(connectionSpec);
jredis.ping();
jredis.set(&quot;key&quot;, &quot;abc&quot;);
System.out.println(new String(jredis.get(&quot;key&quot;)));
jredis.quit();
  2.连接池
  
  package cn.slimsmart.redis.demo.jredis;
import java.util.Date;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.jredis.JRedis;
import org.jredis.connector.ConnectionSpec;
import org.jredis.ri.alphazero.connection.DefaultConnectionSpec;
import org.jredis.ri.alphazero.support.DefaultCodec;
import org.springframework.data.redis.connection.jredis.JredisPool;
public class JredisPoolTest {
public static void main(String[] args) throws Exception {
//链接配置
ConnectionSpec connectionSpec = DefaultConnectionSpec.newSpec(&quot;192.168.36.189&quot;, 6379, 0,null);
connectionSpec.setReconnectCnt(100);  
//connectionSpec.setConnectionFlag(Connection.Flag.RELIABLE, Boolean.TRUE);
//connectionSpec.setHeartbeat(5);  
connectionSpec.setMaxConnectWait(3000);
//连接池配置
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(10);
poolConfig.setMinIdle(2);
poolConfig.setMaxIdle(10);
poolConfig.setMaxWaitMillis(3000);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
poolConfig.setTestWhileIdle(true);
poolConfig.setTimeBetweenEvictionRunsMillis(3000);
JredisPool jredisPool = new JredisPool(connectionSpec,poolConfig);
//获取链接
JRedis jredis = jredisPool.getResource();
jredis.set(&quot;key&quot;, &quot;abc&quot;);
if(jredis.exists(&quot;key&quot;)){  
System.out.println(new String(jredis.get(&quot;key&quot;)));
}  
//保存单个对象
User user = new User();
user.setBirthDate(new Date());
user.setName(&quot;jack&quot;);
jredis.set(&quot;user&quot;, user);
System.out.println(DefaultCodec.decode(jredis.get(&quot;user&quot;)));
//回收
jredisPool.returnResource(jredis);
}
}

3.Fail tolerance



要保证一个client连接到slave服务上读取数据,如果slave down 了之后,可以在不影响应用的情况下,自动切换到另外一个可用的slave。因为jredis不支持设置多个slave服务器,所以写了一个小工具类,目的是为了探测如果的当前正在使用的slave没有heartbeat之后,立马可以切换到一个可用的slave;这样可以保证one of slave down掉之后,不用missing-load也可及时切换到另外一个slave上读数据。
  package cn.slimsmart.redis.demo.jredis;
import java.util.HashMap;
import org.jredis.JRedis;
import org.jredis.connector.ConnectionSpec;
import org.jredis.ri.alphazero.JRedisClient;
import org.jredis.ri.alphazero.connection.DefaultConnectionSpec;
import org.jredis.ri.alphazero.support.DefaultCodec;
public class RedisFailTolerance {
private static JRedis jredis = null;
private static ConnectionSpec defaultConnectionSpec = null;
private static int current = 1;
private static HashMap<String, ConnectionSpec> serverPools = new HashMap<String, ConnectionSpec>();
static {
ConnectionSpec connectionSpec1 = DefaultConnectionSpec.newSpec(&quot;192.168.36.189&quot;, 6379, 0, null);
ConnectionSpec connectionSpec2 = DefaultConnectionSpec.newSpec(&quot;192.168.36.54&quot;, 6379, 0, null);
serverPools.put(&quot;1&quot;, connectionSpec1);
serverPools.put(&quot;2&quot;, connectionSpec2);
}
private String next() {
if (current > serverPools.size()) {
current = 1;
}
int nextIndex = current;
current++;
return nextIndex + &quot;&quot;;
}
private ConnectionSpec getConnectionSpec() {
if (defaultConnectionSpec != null) {
return defaultConnectionSpec;
}
jredis = null;
/**
* we are working multiple servers try different servers,util we fetch
* the first available server pool
*/
HashMap<String, ConnectionSpec> tryServers = new HashMap<String, ConnectionSpec>(serverPools);
if (serverPools.size() == 1) {
return (ConnectionSpec) serverPools.get(&quot;1&quot;);
}
while (!tryServers.isEmpty()) {
ConnectionSpec connectionSpec = tryServers.get(this.next());
if (isConnect(connectionSpec)) {
return connectionSpec;
}
tryServers.remove(connectionSpec);
if (tryServers.isEmpty()) {
break;
}
}
return null;
}
/**
* try whether the server is available
*
* @param connectionSpec
* @return true or false
*/
private boolean isConnect(ConnectionSpec connectionSpec) {
if (connectionSpec == null) {
return false;
}
JRedis jredis = new JRedisClient(connectionSpec.getAddress().getHostAddress(), connectionSpec.getPort());
try {
jredis.ping();
jredis.quit();
} catch (Exception e) {
return false;
}
return true;
}
public void initialize() {
defaultConnectionSpec = this.getConnectionSpec();
if (jredis == null) {
synchronized (this) {
jredis = new JRedisClient(defaultConnectionSpec);
}
}
}
public String getS(String key) {
this.initialize();
String value = null;
try {
value = DefaultCodec.toStr(jredis.get(key));
} catch (Exception e) {
e.printStackTrace();
defaultConnectionSpec = null;
this.initialize();
}
return value;
}
public static void main(String args[]) {
RedisFailTolerance redis = new RedisFailTolerance();
System.out.println(redis.getS(&quot;key&quot;));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(redis.getS(&quot;key&quot;));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(redis.getS(&quot;key&quot;));
}
}
参考:http://dmouse.iyunv.com/blog/813026


  4.与spring集成,参考:http://blog.iyunv.com/zhu_tianwei/article/details/44900219

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138297-1-1.html 上篇帖子: 基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有测试代码(何志雄) 下篇帖子: redis linux安装 [adlist.o] Error jemalloc/jemalloc.h: No such file or directory
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表