Java连接redis之Jedis使用

测试联通

创建 Maven 工程,引入依赖

xml
<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.1.0</version>
</dependency>
java
package com.lun.shang;
import redis.clients.jedis.Jedis;
public class TestPing {
	public static void main(String[] args) {
		Jedis jedis = new Jedis("127.0.0.1",6379);
		// 输出 PONG,redis 连通成功
		System.out.println(jedis.ping());
	}
}

Jedis_ 常用 API

java
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.Jedis;

public class TestAPI {
public static void main(String[] args) {

	Jedis jedis = <span class="hljs-keyword">new</span> Jedis(<span class="hljs-string">"127.0.0.1"</span>, <span class="hljs-number">6379</span>);
	<span class="hljs-comment">// key</span>
	Set&lt;String&gt; keys = jedis.keys(<span class="hljs-string">"*"</span>);
	<span class="hljs-keyword">for</span> (Iterator iterator = keys.iterator(); iterator.hasNext();) {
		String key = (String) iterator.next();
		System.out.println(key);
	}
	System.out.println(<span class="hljs-string">"jedis.exists====&gt;"</span> + jedis.exists(<span class="hljs-string">"k2"</span>));
	System.out.println(jedis.ttl(<span class="hljs-string">"k1"</span>));
	
	<span class="hljs-comment">// String</span>
	<span class="hljs-comment">// jedis.append("k1","myreids");</span>
	System.out.println(jedis.get(<span class="hljs-string">"k1"</span>));
	jedis.set(<span class="hljs-string">"k4"</span>, <span class="hljs-string">"k4_redis"</span>);
	System.out.println(<span class="hljs-string">"----------------------------------------"</span>);
	jedis.mset(<span class="hljs-string">"str1"</span>, <span class="hljs-string">"v1"</span>, <span class="hljs-string">"str2"</span>, <span class="hljs-string">"v2"</span>, <span class="hljs-string">"str3"</span>, <span class="hljs-string">"v3"</span>);
	System.out.println(jedis.mget(<span class="hljs-string">"str1"</span>, <span class="hljs-string">"str2"</span>, <span class="hljs-string">"str3"</span>));
	
	
	<span class="hljs-comment">// list</span>
	System.out.println(<span class="hljs-string">"----------------------------------------"</span>);
	<span class="hljs-comment">// jedis.lpush("mylist","v1","v2","v3","v4","v5");</span>
	List&lt;String&gt; list = jedis.lrange(<span class="hljs-string">"mylist"</span>, <span class="hljs-number">0</span>, -<span class="hljs-number">1</span>);
	<span class="hljs-keyword">for</span> (String element : list) {
		System.out.println(element);
	}
	
	<span class="hljs-comment">// set</span>
	jedis.sadd(<span class="hljs-string">"orders"</span>, <span class="hljs-string">"jd001"</span>);
	jedis.sadd(<span class="hljs-string">"orders"</span>, <span class="hljs-string">"jd002"</span>);
	jedis.sadd(<span class="hljs-string">"orders"</span>, <span class="hljs-string">"jd003"</span>);
	Set&lt;String&gt; set1 = jedis.smembers(<span class="hljs-string">"orders"</span>);
	<span class="hljs-keyword">for</span> (Iterator iterator = set1.iterator(); iterator.hasNext();) {
		String string = (String) iterator.next();
		System.out.println(string);
	}
	jedis.srem(<span class="hljs-string">"orders"</span>, <span class="hljs-string">"jd002"</span>);
	System.out.println(jedis.smembers(<span class="hljs-string">"orders"</span>).size());
	
	<span class="hljs-comment">// hash</span>
	jedis.hset(<span class="hljs-string">"hash1"</span>, <span class="hljs-string">"userName"</span>, <span class="hljs-string">"lisi"</span>);
	System.out.println(jedis.hget(<span class="hljs-string">"hash1"</span>, <span class="hljs-string">"userName"</span>));
	Map&lt;String, String&gt; map = <span class="hljs-keyword">new</span> HashMap&lt;String, String&gt;();
	map.put(<span class="hljs-string">"telphone"</span>, <span class="hljs-string">"13811814763"</span>);
	map.put(<span class="hljs-string">"address"</span>, <span class="hljs-string">"atguigu"</span>);
	map.put(<span class="hljs-string">"email"</span>, <span class="hljs-string">"abc@163.com"</span>);
	jedis.hmset(<span class="hljs-string">"hash2"</span>, map);
	List&lt;String&gt; result = jedis.hmget(<span class="hljs-string">"hash2"</span>, <span class="hljs-string">"telphone"</span>, <span class="hljs-string">"email"</span>);
	<span class="hljs-keyword">for</span> (String element : result) {
		System.out.println(element);
	}
	
	<span class="hljs-comment">// zset</span>
	jedis.zadd(<span class="hljs-string">"zset01"</span>, <span class="hljs-number">60d</span>, <span class="hljs-string">"v1"</span>);
	jedis.zadd(<span class="hljs-string">"zset01"</span>, <span class="hljs-number">70d</span>, <span class="hljs-string">"v2"</span>);
	jedis.zadd(<span class="hljs-string">"zset01"</span>, <span class="hljs-number">80d</span>, <span class="hljs-string">"v3"</span>);
	jedis.zadd(<span class="hljs-string">"zset01"</span>, <span class="hljs-number">90d</span>, <span class="hljs-string">"v4"</span>);

	Set&lt;String&gt; s1 = jedis.zrange(<span class="hljs-string">"zset01"</span>, <span class="hljs-number">0</span>, -<span class="hljs-number">1</span>);
	<span class="hljs-keyword">for</span> (Iterator iterator = s1.iterator(); iterator.hasNext();) {
		String string = (String) iterator.next();
		System.out.println(string);
	}

}

}

事务

java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class TestTX {
public boolean transMethod() throws InterruptedException {
Jedis jedis = new Jedis("127.0.0.1", 6379);
int balance;// 可用余额
int debt;// 欠额
int amtToSubtract = 10;// 实刷额度

	jedis.watch(<span class="hljs-string">"balance"</span>);
	<span class="hljs-comment">// jedis.set("balance","5");//此句不该出现,讲课方便。模拟其他程序已经修改了该条目</span>
	Thread.sleep(<span class="hljs-number">7000</span>);
	balance = Integer.parseInt(jedis.get(<span class="hljs-string">"balance"</span>));
	<span class="hljs-keyword">if</span> (balance &lt; amtToSubtract) {
		jedis.unwatch();
		System.out.println(<span class="hljs-string">"modify"</span>);
		<span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
	} <span class="hljs-keyword">else</span> {
		System.out.println(<span class="hljs-string">"***********transaction"</span>);
		Transaction transaction = jedis.multi();
		transaction.decrBy(<span class="hljs-string">"balance"</span>, amtToSubtract);
		transaction.incrBy(<span class="hljs-string">"debt"</span>, amtToSubtract);
		transaction.exec();
		balance = Integer.parseInt(jedis.get(<span class="hljs-string">"balance"</span>));
		debt = Integer.parseInt(jedis.get(<span class="hljs-string">"debt"</span>));

		System.out.println(<span class="hljs-string">"*******"</span> + balance);
		System.out.println(<span class="hljs-string">"*******"</span> + debt);
		<span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
	}
}

<span class="hljs-comment">/**
 * 通俗点讲,watch命令就是标记一个键,如果标记了一个键, 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中 重新再尝试一次。
 * 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减; 足够的话,就启动事务进行更新操作,
 * 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错, 程序中通常可以捕获这类错误再重新执行一次,直到成功。
 * 
 * <span class="hljs-doctag">@throws</span> InterruptedException
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> InterruptedException </span>{
	TestTX test = <span class="hljs-keyword">new</span> TestTX();
	<span class="hljs-keyword">boolean</span> retValue = test.transMethod();
	System.out.println(<span class="hljs-string">"main retValue-------: "</span> + retValue);
}

}

主从复制

java
import redis.clients.jedis.Jedis;
public class TestMS {
	public static void main(String[] args) {
		Jedis jedis_M = new Jedis("127.0.0.1", 6379);
		Jedis jedis_S = new Jedis("127.0.0.1", 6380);
	jedis_S.slaveof(<span class="hljs-string">"127.0.0.1"</span>, <span class="hljs-number">6379</span>);

	jedis_M.set(<span class="hljs-string">"class"</span>, <span class="hljs-string">"1122V2"</span>);

	String result = jedis_S.get(<span class="hljs-string">"class"</span>);<span class="hljs-comment">//可能有延迟,需再次启动才能使用</span>
	System.out.println(result);
}

}

JedisPool

  • 获取 Jedis 实例需要从 JedisPool 中获取
  • 用完 Jedis 实例需要返还给 JedisPool
  • 如果 Jedis 在使用过程中出错,则也需要还给 JedisPool
java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPoolUtil {
private static volatile JedisPool jedisPool = null;

<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-title">JedisPoolUtil</span><span class="hljs-params">()</span> </span>{
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> JedisPool <span class="hljs-title">getJedisPoolInstance</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> == jedisPool) {
        <span class="hljs-keyword">synchronized</span> (JedisPoolUtil.class) {
            <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> == jedisPool) {
                JedisPoolConfig poolConfig = <span class="hljs-keyword">new</span> JedisPoolConfig();
                poolConfig.setMaxActive(<span class="hljs-number">1000</span>);
                poolConfig.setMaxIdle(<span class="hljs-number">32</span>);
                poolConfig.setMaxWait(<span class="hljs-number">100</span> * <span class="hljs-number">1000</span>);
                poolConfig.setTestOnBorrow(<span class="hljs-keyword">true</span>);

                jedisPool = <span class="hljs-keyword">new</span> JedisPool(poolConfig, <span class="hljs-string">"127.0.0.1"</span>, <span class="hljs-number">6379</span>);
            }
        }
    }
    <span class="hljs-keyword">return</span> jedisPool;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">release</span><span class="hljs-params">(JedisPool jedisPool, Jedis jedis)</span> </span>{
    <span class="hljs-keyword">if</span> (<span class="hljs-keyword">null</span> != jedis) {
        jedisPool.returnResourceObject(jedis);
    }
}

}


java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class TestPool {
public static void main(String[] args) {
JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
JedisPool jedisPool2 = JedisPoolUtil.getJedisPoolInstance();

    System.out.println(jedisPool == jedisPool2);

    Jedis jedis = <span class="hljs-keyword">null</span>;
    <span class="hljs-keyword">try</span> {
        jedis = jedisPool.getResource();
        jedis.set(<span class="hljs-string">"aa"</span>, <span class="hljs-string">"bb"</span>);
    } <span class="hljs-keyword">catch</span> (Exception e) {
        e.printStackTrace();
    } <span class="hljs-keyword">finally</span> {
        JedisPoolUtil.release(jedisPool, 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
  • 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 队列;

RedisTemplate

Jedis 是 Redis 官方推荐的面向 Java 的操作 Redis 的客户端,而 RedisTemplate 是 SpringDataRedis 中对 JedisApi 的高度封装。
SpringDataRedis 相对于 Jedis 来说可以方便地更换 Redis 的 Java 客户端,比 Jedis 多了自动管理连接池的特性,方便与其他 Spring 框架搭配使用

java
	@Autowired
    private RedisTemplate<String,String> template;

redis 的基本操作

操作 Jedis StringRedisTemplate
String
设置 set("k","v") template.opsForValue().set("k","v")
获取 get("k") template.opsForValue().get("k")
增 1 incr("k") template.boundValueOps("k").increment(1)
减 1 decr("k") template.boundValueOps("k").increment(-1)
设置时间 setex("k",seconds,"v") template.opsForValue().set("k","v",20, TimeUnit.SECONDS)
不存在 就设置 setnx("k","v") template.opsForValue().setIfAbsent("k", "v")
获取过期时间 ttl("k") template.getExpire("k")
删除 del("k") template.delete("k")
Hash
设置 jedis.hset("pig","name","peiqi"; template.opsForHash().put("pig","name","peiqi")
获取 jedis.hget("pig","name") template.opsForHash().get("pig", "name") 获取所有 template.opsForHash().values("pig")
删除 jedis.hdel("pig","name") template.opsForHash().delete("pig","name")
判断是否存在 jedis.hexists("pig","name") template.opsForHash().hasKey("pig","name")
List 左 / 右不做区分
添加 rpush("k","v") template.opsForList().rightPush("k","v")
移出 rpop("list") template.opsForList().rightPop("k")
长度 llen("k") template.opsForList().size("k")
获取 lrange("list",0,-1) //-1 全部 template.opsForList().range("list", 0, -1)
Set
添加 sadd("k","v") template.opsForSet().add("k","v")
值移除 srem("k","v") template.opsForSet().remove("k","v")
直接移 spop("k") template.opsForSet().pop("k")
长度 scard("k") template.opsForSet().size("k")
交集 sinter("k1","k2") template.opsForSet().intersect("k", "k2")
并集 sunion("k1","k2") template.opsForSet().union("k", "k2")
差集 sdiff("k1","k2") template.opsForSet().difference("k", "k2")
Zset
增加 zadd("k",1,"a") template.opsForZSet().add("k","aa",12)
排名结果 zrevrange("k", 0, -1) template.opsForZSet().reverseRange("k", 0, -1)
排名分数 zrevrangeByScoreWithScores("k", 12, 10); template.opsForZSet().reverseRangeByScore("k", 1, 100)
修改分数 zincrby("k",20,"a") template.opsForZSet().incrementScore("k","aa",19)
数量 zcard("k") template.opsForZSet().zCard("k")
获取排名 zrank("k","a") template.opsForZSet().rank("k","aa")

__EOF__

  • 本文作者: 至安
  • 本文链接: https://www.cnblogs.com/birdy-silhouette/p/14722133.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。