Redis的Java客户端Jedis

  Jedis所需jar包   commons-pool-1.6.jar  jedis-2.1.0.jar

1.Jedis常用操作(jedis中的api 和 我们在 linux中使用的命令差不多)

  a)测试连通性

 public static void main(String[] args) {
//连接虚拟机中的 redis 服务(如果是在linux 本机中,即为192.168.89.128)
//注意:连接之前需要关闭linux防火墙
Jedis jedis = new Jedis("192.168.89.128",6379); //查看服务是否运行,打出pong表示OK
System.out.println(jedis.ping());
}

  b)1+5  (一个Key  五大数据类型)

 //测试 对 key 和 五大数据类型的 操作API
public class TestAPI {
public static void main(String[] args) { //jedis中的api 和 我们在 linux中使用的命令差不多
Jedis jedis = new Jedis("192.168.89.128",6379); jedis.set("k1", "v1"); //set命令
jedis.set("k2", "v2");
jedis.set("k3", "v3"); System.out.println(jedis.get("k3"));//get命令 Set<String> keysSet = jedis.keys("*"); //类似于 keys *
Iterator<String> iterator = keysSet.iterator();
while(iterator.hasNext()) {
String key = iterator.next();
System.out.println(key);
} System.out.println("k1 键是否存在 :" + jedis.exists("k1"));
System.out.println("k1 键 剩余生存时间:" + jedis.ttl("k1")); } @Test
public void testString() {
Jedis jedis = new Jedis("192.168.89.128",6379);
//jedis.append("k1", "v1v1");
//System.out.println("append后k1的值:" + jedis.get("k1")); System.out.println("k1 的value的长度:" + jedis.strlen("k1")); System.out.println("按指定下标取值:" + jedis.getrange("k1", 0, -1));
//如果不存在 则赋值
jedis.setnx("k1", "v1");
} @Test
public void testList() {
Jedis jedis = new Jedis("192.168.89.128",6379);
jedis.lpush("list1", "1","2","3","4","5"); //List 类型的数据的创建,按照入栈顺序放入 这个双向链表
jedis.lset("list1", 0, "100"); //将 list1 的 第一个 元素 设置为100
System.out.println("list1:" + jedis.lrange("list1", 0, -1));
System.out.println("lpop:" + jedis.lpop("list1")); //弹出
} @Test
public void testSet() {
Jedis jedis = new Jedis("192.168.89.128",6379);
jedis.sadd("set1", "1","2","3","4","5","9");
jedis.sadd("set2", "1","2","3","4","5","6");
System.out.println(jedis.smembers("set1"));
System.out.println(jedis.smembers("set2"));
//差集 在第一个set里面而不在后面任何一个set里面的项
System.out.println(jedis.sdiff("set1","set2"));
} @Test
public void testHash() {
Jedis jedis = new Jedis("192.168.89.128",6379);
jedis.hset("user1", "name", "xzk");
jedis.hset("user1", "age", "22"); Map<String,String> map = new HashMap<String, String>(); //可以一次性为某个键 赋值多个 KV 键值对
map.put("name", "xzk2");
map.put("age", "23");
jedis.hmset("user2", map); //直接存放一个map System.out.println(jedis.hget("user1", "age")); //可以一次性取出多个 KV键值对
List<String> results = jedis.hmget("user2", "name","age");
System.out.println(results);
} @Test
public void testZSet() {
Jedis jedis = new Jedis("192.168.89.128",6379);
/*jedis.zadd("zset01",60,"v1");
jedis.zadd("zset1",70,"v2");
jedis.zadd("zset1",80,"v3");
jedis.zadd("zset1",90,"v4");*/ Map<Double, String> scoreMembers = new HashMap<Double, String>();
scoreMembers.put(60d, "v1"); //key 为 score
scoreMembers.put(70d, "v2");
scoreMembers.put(80d, "v3");
scoreMembers.put(90d, "v4");
jedis.zadd("zset1", scoreMembers ); Set<String> resultSet = jedis.zrange("zset1", 0, -1);
System.out.println(resultSet);
}
}

  c)事务提交

 //关于 jedis 事务的
public class TestTX {
public static void main(String[] args) throws InterruptedException {
boolean retValue = transMethod();
System.out.println("main retValue-------: " + retValue);
} /**
* 通俗点讲,watch命令就是标记一个键,如果标记了一个键,
* 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中
* 重新再尝试一次。
*
* 首先标记了键balance,然后检查 键balance是否发生了修改,修改了取消标记,
* 没有被修改的话,就启动事务进行更新操作,
* 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错,(但是事务失败后,只是不执行事务而已啊,这里不会报错啊)
* 程序中通常可以捕获这类错误再重新执行一次,直到成功。
* @throws InterruptedException
*/
private static boolean transMethod() throws InterruptedException {
int balance = 100;// 可用余额
int debt = 0;// 欠额
int amtToSubtract = 10;// 实刷额 Jedis jedis = new Jedis("192.168.89.128", 6379);
jedis.set("balance", ""+ balance);
jedis.set("debt", "" + debt); //监听balance,如果在此期间键balance被其它人修改, 则提交的事务 不会被执行(不会报错)
jedis.watch("balance"); //模拟故障,在等待的时间要去修改下 balance 这个 key的值
Thread.sleep(8000); //虽然不会报错,但是可以找到这类错误,让其再重新执行一次,直到成功。
//检查 键balance 是否被他人修改,如果修改了,则取消标记,返回错误
if(balance != Integer.parseInt(jedis.get("balance"))) {
jedis.unwatch();
return false;
} //事务的执行
Transaction transaction = jedis.multi();
transaction.decrBy("balance", amtToSubtract);
transaction.incrBy("debt", amtToSubtract);
//transaction.discard(); 取消某个事务的执行
transaction.exec(); //从redis 中拿回 新的balance 和 debt
balance = Integer.parseInt(jedis.get("balance"));
debt = Integer.parseInt(jedis.get("debt")); System.out.println("事务执行后,balance = " + balance + " debt = " + debt);
return true;
}
}

2.JedisPool

  获取Jedis实例需要从JedisPool中获取

  用完Jedis实例需要返回给JedisPool

  如果Jedis在使用过程中出错,则也需要还给JedisPool

  

 public class TestJedisPool {
public static void main(String[] args) {
//通过单例模式创建 redis 连接池
JedisPool jedisPool = JedisPoolUtil.getJedisPool();
Jedis jedis = null; //通过拿到连接
try{
jedis = jedisPool.getResource();
System.out.println(jedis.get("k1"));
} catch(Exception e) {
e.printStackTrace();
}finally {
//最后将创建的 jedis 连接放回 池中
JedisPoolUtil.releaseJedis(jedisPool, jedis);
} }
}

  JedisPool配置总结

 public class JedisPoolUtil {
//被volatile 修饰的/*变量*/不会被本地线程缓存,对该变量的操作都是直接操作共享内存的
// JUC 里面也用到了 volatile 来保证 内存可见性
private static volatile JedisPool jedisPool = null; public static JedisPool getJedisPool() {
if (null == jedisPool) {
synchronized (JedisPoolUtil.class) {
if (null == jedisPool) {
// 创建连接池的配置文件,JedisPool的配置参数大部分是由这个配置文件决定的
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 控制一个pool最多有多少个jedis实例
poolConfig.setMaxActive(1000);
// 控制一个pool最多有多少个状态为idle的jedis实例(最大空闲连接数)(要有这么多空闲的连接,不然不给创建)
poolConfig.setMaxIdle(32);
// 创建实例的最大等待时间(因为是上了锁的,所以可能会等待)
poolConfig.setMaxWait(100 * 1000);
// 在获取连接时 检查有效性,一般为false
poolConfig.setTestOnBorrow(true); // 这个连接池 从 6379 这个端口获取连接
jedisPool = new JedisPool(poolConfig, "192.168.89.128",
6379);
}
}
}
return jedisPool;
} // 将 jedis 释放回 jedisPool
public static void releaseJedis(JedisPool jedisPool, Jedis jedis) {
if (jedis != null) {
jedisPool.returnResourceObject(jedis);
}
}
}
 JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。

 maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。
maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。
 WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;
 WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;
 WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;
maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;
testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的; testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping()); testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义; timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数; numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数; minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义; softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义; lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列; ==================================================================================================================
其中JedisPoolConfig对一些参数的默认设置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1

  

9.Redis的Java客户端Jedis的更多相关文章

  1. 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍

    转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...

  2. Redis(九):Redis的Java客户端Jedis

    Redis的Java客户端Jedis导航目录: 安装JDK 安装Eclipse Jedis所需要的Jar包 Jedis常用操作 JedisPool 安装JDK tar -zxvf jdk-7u67-l ...

  3. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

    jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...

  4. Redis之Java客户端Jedis

    导读 Redis不仅使用命令客户端来操作,而且可以使用程序客户端操作. 现在基本上主流的语言都有客户端支持,比如Java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Java ...

  5. 使用Redis的Java客户端Jedis

    转载自:http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 前一篇文章<Redis命令指南>讲解了通过命令行 ...

  6. [转载] 使用Redis的Java客户端Jedis

    转载自http://aofengblog.blog.163.com/blog/static/631702120147298317919/ 在实际的项目开发中,各种语言是使用Redis的客户端库来与Re ...

  7. Redis的java客户端jedis

    导包:Jedis需要的jar包 >Commons-pool-1.6.jar >Jedis-2.1.0.jar 配置:linux防火墙设置,不会设置就关闭. 停止防火墙 systemctl ...

  8. Redis学习十一:Redis的Java客户端Jedis

    一.安装JDK tar -zxvf jdk-7u67-linux-i586.tar.gz vi /etc/profile 重启一次Centos 编码验证 二.安装eclipse 三.Jedis所需要的 ...

  9. Redis解读(2):Redis的Java客户端

    Redis的Java客户端 Redis不仅使用命令客户端来操作,而且可以使用程序客户端操作,其实配置和实现起来也非常容易. 现在基本上主流的语言都有客户端支持,比如Java.C.C#.C++.php. ...

随机推荐

  1. 测试理论03-svn-缺陷及报告-jira

    回顾--用例设计方法 边界值(三个点,使用步骤) 判定表(适用,四个组成部分,规则,使用) 因果图(适用,四个符号,使用) 正交表(定义,特性,L_n(m^k),因素,水平,使用,工具allpairs ...

  2. Linux -- Proactor(及其与Reactor的比较)

    高并发服务器常由多线程+IO复用服务器(one event loop per thread) 两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分 ...

  3. Maven 打war包

    使用maven将项目达成war包 右击项目的跟项目,选择run as 选择maven  build.... 进入窗口,在 Goals  输入命令   clean package,选择 skip Tes ...

  4. laravel构建联合查询

    参考:http://laravelacademy.org/post/126.html DB门面可以指定不同的数据库连接(通过connection方法) /** * @param $login_uid ...

  5. pcntl_waitpid函数解释

    pcntl_waitpid 等待或返回fork的子进程状态.多进程的主进程创建了子进程,那主进程如何确认子进程的状态呢. 假如主进程需要根据子进程的状态做不同的处理呢, 这里的状态包括子进程被kill ...

  6. 《剑指offer》数学题及其它 (牛客11.05)

    比较多的思维题,涉及位运算.快速幂.二进制.约瑟夫问题.队列.贪心.dp等等. 难度 题目 知识点 ☆ 12.数值的整数次方 细节,快速幂 ☆☆ 47.求1+2+3+···+n 思维发散 ☆☆ 48. ...

  7. 李宗盛spss罚写2019-12-8

    以上过程即整个假设检验的思想:反证法及小概率原理. 因而假设检验有可能犯两类错误. 第一类错误:原假设正确,而错误地拒绝了它,即“拒真”的错误,其发生的概率为第一类错误的概率. 第二类错误:原假设不正 ...

  8. 2019-10-24 李宗盛 spss作业

    3.1数据排序.  在统计分析时最初的变量.  可能不符合统计分析的要求,需要用户对目标数据进行整理,来符合分析方法个案排序.数据——个案排序.排序依据,排序顺序,变量排序 数据——变量排序 变量视图 ...

  9. 【VS开发】【C++开发】const在函数前与函数后的区别

    const在函数前与函数后的区别 一   const基础           如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:           int   b   =   ...

  10. .NET细节知识总结,不断更新

    1.catch (Exception)和catch (Exception e) Exception 类包含许多子类 程序执行的时候要将每一个类都搜索一遍 以找到符合的异常类 这样是蛮消耗资源的 影响效 ...