Redis Jedis 接口笔记

By AverageJoeWang
 标签:

Redis支持的客户端操作语言非常丰富,就Java来说,最常用的还是客户端Jedis。Jedis使用简单,基本和Redis命令行语法相似。
本笔记主要是介绍Java中如何操作Redis。因为在Java中真正操作Redis并不是很多,所以本节只做一些了解性的介绍。

本笔记以3.2.11版本redis作为例子和jedis-2.9.0.jar包。

操作之前的准备Jedis需要添加两个JAR包:

Jedis-2.9.0.jar

  • 如果是使用了MAVEN,就需要在pom.xml中加上依赖:
<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
            <type>jar</type>
            <scope>compile</scope>
</dependency>

五大数据类型

set

public static void setTest(){
    Jedis jedis = new Jedis("redis://localhost:6379/8");
    String setKey1 = "setKey1";
    String setKey2 = "setKey2";
    for (int i = 0; i < 5; i++){
        //往集合添加元素
        jedis.sadd(setKey1, String.valueOf(i));
        jedis.sadd(setKey2, String.valueOf(i*i));
    }
    //求每个集合的所有元素
    System.out.println("setKey1:" + jedis.smembers(setKey1) + " setKey2:" + jedis.smembers(setKey2));
    //交集
    System.out.println("sunion:" + jedis.sunion(setKey1, setKey2));
    //求集合1有而集合2没有的部分
    System.out.println("sdiff:" + jedis.sdiff(setKey1, setKey2));
    //移动2的 9 到1
    jedis.smove(setKey2, setKey1, "9");
    //判断是否存在成员
    System.out.println("sismember:" + jedis.sismember(setKey2, "9"));
    //统计集合元素数量
    System.out.println("scard:" + jedis.scard(setKey1));
    //删除set
    jedis.srem(setKey1, "4");
    System.out.println("smembers" + jedis.smembers(setKey1));
    //随机取出2个元素
    System.out.println("srandmember:" + jedis.srandmember(setKey1, 2));

}
  • 结果
setKey1:[0, 1, 2, 3, 4] setKey2:[0, 1, 4, 9, 16]
sunion:[0, 1, 2, 3, 4, 9, 16]
sdiff:[2, 3]
sismember:false
scard:6
smembers[0, 1, 2, 3, 9]
srandmember:[2, 3]

hashmap

public static void hashmapTest(){
    Jedis jedis = new Jedis("redis://localhost:6379/8");

    //清空数据库:flush db
    jedis.flushDB();

    //增:hset hash1 k1 v1  k2 v3
    jedis.hset("hash1", "k1", "v1");
    jedis.hset("hash1", "k2", "v2");

    //批量添加:hmset hash1 k3 v3 k4 v4 k5 v5
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("k3", "v3");
    map.put("k4", "v4");
    map.put("k5", "v5");
    jedis.hmset("hash1", map);

    //查:hget hash1 k2
    System.out.println(jedis.hget("hash1", "k2"));
    //批量查询:hmget hash1 k1 k2 k3
    System.out.println(jedis.hmget("hash1", "k1", "k2", "k3"));

    //删除元素:hdel hash1 k4
    jedis.hdel("hash1", "k4");
    //获取全部
    System.out.println(jedis.hgetAll("hash1"));
}
  • 结果
v2
[v1, v2, v3]
{k3=v3, k1=v1, k5=v5, k2=v2}

zset

public static void zsetTest(){
    Jedis jedis = new Jedis("redis://localhost:6379/8");
    jedis.flushDB();

    //增:zadd zset1 60 v1 70 v2 80 v3 90 v4 100 v5
    jedis.zadd("zset1", 60, "v1");
    jedis.zadd("zset1", 70, "v2");
    Map<String, Double> map = new HashMap<>();
    map.put("v3", 80.00);
    jedis.zadd("zset1", map);

    //查:zrange zset1 0 -1
    System.out.println(jedis.zrange("zset1", 0, -1));
    //查:zrange zset1 0 -1  with scores
    System.out.println(jedis.zrangeWithScores("zset1", 0, -1));

    //删除元素:zrem zset1 v2
    jedis.zrem("zset1", "v2");
    System.out.println(jedis.zrangeWithScores("zset1", 0, -1));
}
  • 结果
[v1, v2, v3]
[[[118, 49],60.0], [[118, 50],70.0], [[118, 51],80.0]]
[[[118, 49],60.0], [[118, 51],80.0]]

list

public static void listTest() {
    Jedis jedis = new Jedis("redis://localhost:6379/8");
    jedis.flushDB();

    //增:lpush list1 v1
    //   rpush list1 v3
    jedis.lpush("list1", "v1");
    jedis.lpush("list1", "v2");
    jedis.rpush("list1", "v3");

    //查:lrange list1
    // llen list1 :集合list1的大小
    System.out.println(jedis.lrange("list1", 0, jedis.llen("list1")));

    //删除元素:lrem list1 1 v2
    // 从left往right删除2个值等于v1的元素,返回的值为实际删除的数量
    jedis.lrem("list1", 1, "v2");
    System.out.println(jedis.lrange("list1", 0, jedis.llen("list1")));
}
[v2, v1, v3]
[v1, v3]

string

public static void stringTest() {
    Jedis jedis = new Jedis("redis://localhost:6379/8");
    jedis.flushDB();

    //set k1 AA k2 BB k3 CC
    jedis.set("k1", "AA");
    jedis.set("k2", "BB");
    jedis.set("k3", "CC");
    jedis.set("k4", "DD");
    jedis.set("k5", "EE");

    //查:get k2
    System.out.println(jedis.get("k2"));
    //查全部:keys *
    System.out.println(jedis.keys("*"));
    //删:del k2
    jedis.del("k1");
    System.out.println(jedis.keys("*"));
}
  • 结果
BB
[k3, k4, k5, k1, k2]
[k3, k4, k5, k2]

连接池

JedisPool连接池是在需要用到redis操作的时候需要从JedisPool中获取操作jedis资源,用完jedis资源也需要还给JedisPool,并且需要在finally中去关闭,在默认的jedispool连接池是有8个jedis资源供使用。

  • 设置java连接池
private static volatile JedisPool jedisPool = null;

public static JedisPool getJedisPoolInstance(){
    if(null == jedisPool){
        synchronized(RedisAPI.class){
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            //控制一个pool可分配多少个jedis实例
            jedisPoolConfig.setMaxTotal(1000);
            //控制一个pool最多有多少个状态为idle(空闲)的jedis实例
            jedisPoolConfig.setMaxIdle(32);
            //表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;
            jedisPoolConfig.setMaxWaitMillis(100*1000);
            //获得一个jedis实例的时候是否检查连接可用性(ping())
            jedisPoolConfig.setTestOnBorrow(true);

            jedisPool =  new JedisPool("redis://localhost:6379/8");
        }
    }
    return jedisPool;
}
  • 测试
public static void main(String[] args){
        JedisPool jedisPool = getJedisPoolInstance();

        Jedis jedis = null;
        try{
            jedis = jedisPool.getResource();
            jedis.set("aa", "bb");
            System.out.println(jedis.get("aa"));
        }catch(Exception e) {
            e.printStackTrace();
        }finally{
            if (jedis != null)
                jedisPool.returnBrokenResource(jedis);
        }
    }