`

Java Redis实战之Redis + Jedis

阅读更多

目前Redis大概有3中基于Java语言的Client:

  • Jredis
  • Jedis
  • Redis4J

 

一、简单使用Jedis

需要Jedis就从Maven获取吧!
Maven Pom.xml

 

Xml代码  
  1. <dependency>  
  2.     <groupId>redis.clients</groupId>  
  3.     <artifactId>jedis</artifactId>  
  4.     <version>2.1.0</version>  
  5.     <type>jar</type>  
  6.     <scope>compile</scope>  
  7. </dependency>  
[xml] view plaincopy
 
  1. <dependency>  
  2.     <groupId>redis.clients</groupId>  
  3.     <artifactId>jedis</artifactId>  
  4.     <version>2.1.0</version>  
  5.     <type>jar</type>  
  6.     <scope>compile</scope>  
  7. </dependency>  

 

 

 

如果只是简单使用Jedis,以下这么几行代码足够:

 

Java代码  
  1. Jedis jedis = new Jedis("10.11.20.140");  
  2. String keys = "name";  
  3.   
  4. // 删数据  
  5. jedis.del(keys);  
  6. // 存数据  
  7. jedis.set(keys, "snowolf");  
  8. // 取数据  
  9. String value = jedis.get(keys);  
  10.   
  11. System.out.println(value);  
[java] view plaincopy
 
  1. Jedis jedis = new Jedis("10.11.20.140");  
  2. String keys = "name";  
  3.   
  4. // 删数据  
  5. jedis.del(keys);  
  6. // 存数据  
  7. jedis.set(keys, "snowolf");  
  8. // 取数据  
  9. String value = jedis.get(keys);  
  10.   
  11. System.out.println(value);  

 

 

二、池化使用Jedis

Jedis使用commons-pool完成池化实现。

先做个配置文件:

Properties代码  
  1. #最大分配的对象数  
  2. redis.pool.maxActive=1024  
  3. #最大能够保持idel状态的对象数  
  4. redis.pool.maxIdle=200  
  5. #当池内没有返回对象时,最大等待时间  
  6. redis.pool.maxWait=1000  
  7. #当调用borrow Object方法时,是否进行有效性检查  
  8. redis.pool.testOnBorrow=true  
  9. #当调用return Object方法时,是否进行有效性检查  
  10. redis.pool.testOnReturn=true  
  11. #IP  
  12. redis.ip=10.11.20.140  
  13. #Port  
  14. redis.port=6379  

 

 

 在静态代码段中完成初始化:

 

Java代码  
  1. private static JedisPool pool;  
  2. static {  
  3.     ResourceBundle bundle = ResourceBundle.getBundle("redis");  
  4.     if (bundle == null) {  
  5.         throw new IllegalArgumentException(  
  6.                 "[redis.properties] is not found!");  
  7.     }  
  8.     JedisPoolConfig config = new JedisPoolConfig();  
  9.     config.setMaxActive(Integer.valueOf(bundle  
  10.             .getString("redis.pool.maxActive")));  
  11.     config.setMaxIdle(Integer.valueOf(bundle  
  12.             .getString("redis.pool.maxIdle")));  
  13.     config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));  
  14.     config.setTestOnBorrow(Boolean.valueOf(bundle  
  15.             .getString("redis.pool.testOnBorrow")));  
  16.     config.setTestOnReturn(Boolean.valueOf(bundle  
  17.             .getString("redis.pool.testOnReturn")));  
  18.     pool = new JedisPool(config, bundle.getString("redis.ip"),  
  19.             Integer.valueOf(bundle.getString("redis.port")));  
  20. }  
[java] view plaincopy
 
  1. private static JedisPool pool;  
  2. static {  
  3.     ResourceBundle bundle = ResourceBundle.getBundle("redis");  
  4.     if (bundle == null) {  
  5.         throw new IllegalArgumentException(  
  6.                 "[redis.properties] is not found!");  
  7.     }  
  8.     JedisPoolConfig config = new JedisPoolConfig();  
  9.     config.setMaxActive(Integer.valueOf(bundle  
  10.             .getString("redis.pool.maxActive")));  
  11.     config.setMaxIdle(Integer.valueOf(bundle  
  12.             .getString("redis.pool.maxIdle")));  
  13.     config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));  
  14.     config.setTestOnBorrow(Boolean.valueOf(bundle  
  15.             .getString("redis.pool.testOnBorrow")));  
  16.     config.setTestOnReturn(Boolean.valueOf(bundle  
  17.             .getString("redis.pool.testOnReturn")));  
  18.     pool = new JedisPool(config, bundle.getString("redis.ip"),  
  19.             Integer.valueOf(bundle.getString("redis.port")));  
  20. }  

 

 然后,修改前面那段jedis操作Redis

Java代码  
  1. // 从池中获取一个Jedis对象  
  2. Jedis jedis = pool.getResource();  
  3. String keys = "name";  
  4.   
  5. // 删数据  
  6. jedis.del(keys);  
  7. // 存数据  
  8. jedis.set(keys, "snowolf");  
  9. // 取数据  
  10. String value = jedis.get(keys);  
  11.   
  12. System.out.println(value);  
  13.   
  14. // 释放对象池  
  15. pool.returnResource(jedis);  
[java] view plaincopy
 
  1. // 从池中获取一个Jedis对象  
  2. Jedis jedis = pool.getResource();  
  3. String keys = "name";  
  4.   
  5. // 删数据  
  6. jedis.del(keys);  
  7. // 存数据  
  8. jedis.set(keys, "snowolf");  
  9. // 取数据  
  10. String value = jedis.get(keys);  
  11.   
  12. System.out.println(value);  
  13.   
  14. // 释放对象池  
  15. pool.returnResource(jedis);  

 

 改为从对象池中,获取Jedis实例:

 

Java代码  
  1. // 从池中获取一个Jedis对象  
  2. Jedis jedis = pool.getResource();  
[java] view plaincopy
 
  1. // 从池中获取一个Jedis对象  
  2. Jedis jedis = pool.getResource();  

 

 

 

 切记,最后使用后,释放Jedis对象:

 

Java代码  
  1. // 释放对象池  
  2. pool.returnResource(jedis);  
[java] view plaincopy
 
  1. // 释放对象池  
  2. pool.returnResource(jedis);  

 

 

 

三、一致性哈希

 

Memcached完全基于分布式集群,而RedisMaster-Slave,如果想把Reids,做成集群模式,无外乎多做几套Master-Slave,每套Master-Slave完成各自的容灾处理,通过Client工具,完成一致性哈希。

PS:Memcached是在Server端完成ShardingRedis只能依靠各个ClientSharding。可能会在Redis 3.0系列支持ServerSharding

 

保留前面的JedisPoolConfig,新增两个Redis的IP(redis1.ip,redis2.ip),完成两个JedisShardInfo实例,并将其丢进List中:

 

Java代码  
  1. JedisShardInfo jedisShardInfo1 = new JedisShardInfo(  
  2.                 bundle.getString("redis1.ip"), Integer.valueOf(bundle                       .getString("redis.port")));  
  3. JedisShardInfo jedisShardInfo2 = new JedisShardInfo(  
  4.                 bundle.getString("redis2.ip"), Integer.valueOf(bundle                       .getString("redis.port")));  
  5.   
  6. List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();  
  7. list.add(jedisShardInfo1);  
  8. list.add(jedisShardInfo2);  
[java] view plaincopy
 
  1. JedisShardInfo jedisShardInfo1 = new JedisShardInfo(  
  2.                 bundle.getString("redis1.ip"), Integer.valueOf(bundle                       .getString("redis.port")));  
  3. JedisShardInfo jedisShardInfo2 = new JedisShardInfo(  
  4.                 bundle.getString("redis2.ip"), Integer.valueOf(bundle                       .getString("redis.port")));  
  5.   
  6. List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();  
  7. list.add(jedisShardInfo1);  
  8. list.add(jedisShardInfo2);  

 

 初始化ShardedJedisPool代替JedisPool:

 

Java代码  
  1. ShardedJedisPool pool = new ShardedJedisPool(config, list);  
[java] view plaincopy
 
  1. ShardedJedisPool pool = new ShardedJedisPool(config, list);  

 

 改由ShardedJedis,获取Jedis对象:

 

Java代码  
  1. // 从池中获取一个Jedis对象  
  2. ShardedJedis jedis = pool.getResource();  
  3. String keys = "name";  
  4. String value = "snowolf";  
  5. // 删数据  
  6. jedis.del(keys);  
  7. // 存数据  
  8. jedis.set(keys, value);  
  9. // 取数据  
  10. String v = jedis.get(keys);  
  11.   
  12. System.out.println(v);  
  13.   
  14. // 释放对象池  
  15. pool.returnResource(jedis);  
[java] view plaincopy
 
  1. // 从池中获取一个Jedis对象  
  2. ShardedJedis jedis = pool.getResource();  
  3. String keys = "name";  
  4. String value = "snowolf";  
  5. // 删数据  
  6. jedis.del(keys);  
  7. // 存数据  
  8. jedis.set(keys, value);  
  9. // 取数据  
  10. String v = jedis.get(keys);  
  11.   
  12. System.out.println(v);  
  13.   
  14. // 释放对象池  
  15. pool.returnResource(jedis);  

 

 

 使用commons-pool连接池

  1. /* 
  2.  * JedisPoolTest.java 
  3.  */  
  4. package com.x.java2000_wl;  
  5.   
  6. import java.util.ResourceBundle;  
  7.   
  8. import org.junit.Assert;  
  9. import org.junit.BeforeClass;  
  10. import org.junit.Test;  
  11.   
  12. import redis.clients.jedis.Jedis;  
  13. import redis.clients.jedis.JedisPool;  
  14. import redis.clients.jedis.JedisPoolConfig;  
  15.   
  16. /** 
  17.  * jedis Pool 操作 
  18.  * @author http://blog.csdn.net/java2000_wl 
  19.  * @version <b>1.0</b> 
  20.  */  
  21. public class JedisPoolTest {  
  22.   
  23.     private static JedisPool jedisPool;  
  24.       
  25.     /** 
  26.      * initPoolConfig 
  27.      * <br>------------------------------<br> 
  28.      * @return 
  29.      */  
  30.     private static JedisPoolConfig initPoolConfig() {  
  31.         JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();  
  32.         // 控制一个pool最多有多少个状态为idle的jedis实例  
  33.         jedisPoolConfig.setMaxActive(1000);   
  34.         // 最大能够保持空闲状态的对象数  
  35.         jedisPoolConfig.setMaxIdle(300);  
  36.         // 超时时间  
  37.         jedisPoolConfig.setMaxWait(1000);  
  38.         // 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;  
  39.         jedisPoolConfig.setTestOnBorrow(true);   
  40.         // 在还会给pool时,是否提前进行validate操作  
  41.         jedisPoolConfig.setTestOnReturn(true);  
  42.         return jedisPoolConfig;  
  43.     }  
  44.       
  45.     /** 
  46.      * 初始化jedis连接池 
  47.      * <br>------------------------------<br> 
  48.      */  
  49.     @BeforeClass  
  50.     public static void before() {  
  51.         JedisPoolConfig jedisPoolConfig = initPoolConfig();    
  52.         // 属性文件读取参数信息  
  53.         ResourceBundle bundle = ResourceBundle.getBundle("redis_config");  
  54.         String host = bundle.getString("redis.host");  
  55.         int port = Integer.valueOf(bundle.getString("redis.port"));  
  56.         int timeout = Integer.valueOf(bundle.getString("redis.timeout"));  
  57.         String password = bundle.getString("redis.password");  
  58.         // 构造连接池  
  59.         jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);  
  60.     }  
  61.   
  62.     @Test  
  63.     public void testSet() {  
  64.         Jedis jedis = null;   
  65.         // 从池中获取一个jedis实例  
  66.         try {  
  67.             jedis = jedisPool.getResource();  
  68.             jedis.set("blog_pool""java2000_wl");  
  69.         } catch (Exception e) {  
  70.             // 销毁对象  
  71.             jedisPool.returnBrokenResource(jedis);  
  72.             Assert.fail(e.getMessage());  
  73.         } finally {  
  74.             // 还会到连接池  
  75.             jedisPool.returnResource(jedis);  
  76.         }  
  77.     }         
  78.       
  79.     @Test  
  80.     public void testGet() {  
  81.         Jedis jedis = null;   
  82.         try {  
  83.             // 从池中获取一个jedis实例  
  84.             jedis = jedisPool.getResource();  
  85.             System.out.println(jedis.get("blog_pool"));  
  86.         } catch (Exception e) {  
  87.             // 销毁对象  
  88.             jedisPool.returnBrokenResource(jedis);  
  89.             Assert.fail(e.getMessage());  
  90.         } finally {  
  91.             // 还会到连接池  
  92.             jedisPool.returnResource(jedis);  
  93.         }  
  94.     }  
  95. }  
分享到:
评论

相关推荐

    SpringBoot+Shiro+JWT+Jedis+MybatisPlus+前后端分离+基于url通用权限管理系统

    本系统“SpringBoot+Shiro+JWT+Jedis+MybatisPlus+前后端分离+基于url通用权限管理系统”就是针对这一需求而设计的,它结合了多种技术,提供了高效、安全且灵活的解决方案。 首先,SpringBoot是这个系统的核心,它...

    redis3.2.1+jedis2.8.0+jedis.api.rar一站下载

    Jedis是Java语言开发的Redis客户端,提供了丰富的API来操作Redis服务器,便于Java开发者在项目中集成Redis。 Redis 3.2.1是Redis的一个稳定版本,相比于早期版本,它引入了一些新的特性和改进。其中,重要的更新...

    redis2.8+jedis2.5+jedis英文api

    Jedis是Java开发的Redis客户端,它提供了与Redis服务器交互的API,使得在Java应用中使用Redis变得简单。Jedis 2.5是该压缩包中包含的版本,它支持了当时Redis的大多数命令,包括基本操作和事务处理。 首先,了解...

    redis连接池jar jedis+common

    在Java应用中,为了提高性能和资源利用率,通常会使用连接池管理Jedis实例,这就是“redis连接池jar jedis+common”所指的内容。 一、Redis简介 Redis是一个开源的、基于内存的数据结构存储系统,可以作为数据库、...

    Redis部署笔记(单机+主从+哨兵+集群)

    ● 把Redis的Map封装成RedisMap类(key强制为String),暴露API模仿Java的Map ● 把Redis的Set封装成RedisSet类,暴露API模仿Java的Set ● 把Redis的List封装成RedisList类,暴露API模仿Java的List ● 把Redis的单...

    各种版本的redis+Jedis驱动包

    4. **Jedis**:Jedis是Java语言的Redis客户端库,它提供了丰富的API,使Java开发者能够方便地与Redis进行交互。Jedis支持各种Redis命令,包括数据类型操作、事务处理、发布/订阅、持久化等。在实际项目中,通过Jedis...

    Shiro + JWT + SpringBoot + MySQL + Redis(Jedis)实现无状态鉴权机制

    本项目结合了Apache Shiro、JSON Web Token (JWT)、SpringBoot、MySQL数据库以及Redis缓存技术(通过Jedis客户端)来实现这一机制。下面我们将详细探讨这些组件在实现无状态鉴权中的作用。 **Apache Shiro** Apache...

    Redis实战.pdf+Redis源码

    对于Java开发者,可以学习如何在Java项目中集成Redis,使用Jedis或Lettuce等客户端库进行交互,实现高效的缓存策略和数据交换。 总结,Redis实战不仅涵盖了基本的数据类型和操作,还涉及高级特性如发布订阅、事务、...

    redis3.0+jedis

    而Jedis是Java语言的Redis客户端,提供了丰富的API来与Redis服务器进行交互。 Redis 3.0引入了多项增强和改进,包括: 1. **Cluster Support**: Redis 3.0首次实现了集群功能,允许用户将数据分布在多个节点上,...

    Redis+Jedis+案例实战(高清视频教程).rar

    在本教程“Redis+Jedis+案例实战”中,你将深入学习如何利用Redis和Jedis进行实际项目开发。以下是一些关键知识点的概述: 1. Redis基础知识: - 数据类型:Redis支持五种基本数据类型,包括字符串(String)、...

    redis+jedis+mysql+SSM整合,适合新手菜鸟学习,里面有redis64位

    最近学习redis,一直找不到合适的资料,找了挺久的 ,做了个省市联动的整合,用redis和Mysql来做的,spring配的jedis连接池,完全是给新手看的,我也是个菜鸟,供初学者学习吧,因为所有对象都可以转化为json字符串...

    spring-data + jedis + redis代码

    Jedis是Java的一个开源客户端,专门用于连接和操作Redis服务器。 首先,让我们详细了解一下Spring Data。Spring Data是一个模块化的项目,它的主要目标是通过提供统一的API来减少数据访问层的开发工作。这个框架...

    java_redis简单案例

    在IT行业中,Java和Redis是两个非常重要的技术组件。Java是一种广泛应用的编程语言,而Redis则是一种高性能的键值数据库,常用于...这个案例对于初学者和进阶者都是很好的学习材料,有助于提升Java和Redis的实战技能。

    jedis(java连接redis)

    **Jedis:Java连接Redis的首选库** Jedis是Java开发者用来与Redis内存数据存储进行交互的客户端库。Redis是一个高性能的键值数据库,广泛应用于缓存、消息队列等多种场景。Jedis作为官方推荐的Java客户端,提供了...

    征服 Redis + Jedis + Spring (三)—— 列表操作

    Jedis 是 Java 开发者常用的 Redis 客户端库,而 Spring Data Redis 是 Spring 框架的一部分,它提供了与 Redis 集成的高级抽象。在“征服 Redis + Jedis + Spring (三)—— 列表操作”这一主题中,我们将深入探讨...

    redis+spring jedis方式

    Jedis是Redis官方推荐的Java客户端,它提供了一套完整的Redis命令实现。虽然Spring Data Redis提供了更高级别的抽象,但有时直接使用Jedis可以实现更复杂的操作或优化性能。Jedis支持连接池,以提高并发性能。如果你...

    redis+jedis+api

    Jedis是Java语言编写的Redis客户端,提供了丰富的API来操作Redis服务器,使得在Java应用中使用Redis变得简单。 在Redis 3.2.1版本中,引入了一些重要的改进和优化,包括但不限于以下几点: 1. **lua脚本支持增强**...

    redis实现分布式锁(java/jedis)

    redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现 redis实现分布式锁(java/jedis),其中包含工具方法以及使用demo 本资源是利用java的jedis实现

Global site tag (gtag.js) - Google Analytics