Redis Jedis的使用(上)

Jedis 是 Redis 官方首选的 Java 客户端开发包。

因篇幅有限,本章仅提供示例代码,不粘贴测试结果。下篇末提供原代码下载,可自行实验。


连接工具类

public class RedisUtil {

    //Redis服务器IP
    private static String ADDR = "127.0.0.1";

    //Redis的端口号
    private static int PORT = 6379;

    //访问密码
//    private static String AUTH = "heqing";

    //可用连接实例的最大数目,默认值为8;
    //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
    private static int MAX_TOTAL = 1024;

    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
    private static int MAX_IDLE = 200;

    //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
    private static int MAX_WAIT = 10000;

    private static int TIMEOUT = 10000;

    //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
    private static boolean TEST_ON_BORROW = true;

    private static JedisPool jedisPool = null;
    private static ShardedJedisPool shardedJedisPool = null;

    //redis-server.exe redis.windows.conf       //启动redis
    /**
     * 初始化Redis连接池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(MAX_TOTAL);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWaitMillis(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
//            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);   //有密码加入AUTH
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);

            List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>();
            JedisShardInfo infoA = new JedisShardInfo(ADDR, PORT);
//            infoA.setPassword(AUTH);    //有密码加入AUTH
            jdsInfoList.add(infoA);
            shardedJedisPool = new ShardedJedisPool(config, jdsInfoList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取Jedis实例
     * @return
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                return resource;
            } else {
                jedisPool = new JedisPool(new JedisPoolConfig(), ADDR); 
                return jedisPool.getResource();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public synchronized static ShardedJedis getShardedJedis() {
        try {
            if (shardedJedisPool != null) {
                ShardedJedis shardedJedis = shardedJedisPool.getResource();
                return shardedJedis;
            } 
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 释放jedis资源
     * @param jedis
     */
    @SuppressWarnings("deprecation")
    public static void returnResource(final Jedis jedis) {
        if (jedis != null && jedisPool !=null ) {
            jedisPool.returnResource(jedis);
        }
    }

    @SuppressWarnings("deprecation")
    public static void returnResource(final ShardedJedis shardedJedis) {
        if (shardedJedis != null && shardedJedisPool !=null ) {
            shardedJedisPool.returnResource(shardedJedis);
        }
    }

    public static JedisPool getJedisPool() {
        return jedisPool;
    }

    public static ShardedJedisPool getShardedJedisPool() {
        return shardedJedisPool;
    }

    public static void destroyJedisPool() {
        jedisPool.destroy();
    }

    public static void destroyShardedJedisPool() {
        shardedJedisPool.destroy();
    }
}

操作Key

public class TestKey {

    private Jedis jedis; // 获取数据库的连接,非切片客户端连接

    @Before
    public void setup() {
      jedis = RedisUtil.getJedis();
    }

//    @Test
    public void testAdd() {
        System.out.println("=============增=============");
        // 判断key否存在 
        System.out.println("判断name键是否存在:"+jedis.exists("name")); 
        System.out.println("新增name,heqing键值对:"+jedis.set("name", "heqing")); 
        System.out.println("判断name键是否存在:"+jedis.exists("name")); 

        // 设置 qq的过期时间
        System.out.println("判断qq是否存在:"+jedis.set("qq", "975656343"));
        System.out.println("设置 qq的过期时间为3秒:"+jedis.expire("qq", 3));
        try{ 
            Thread.sleep(4000); 
        } 
        catch (InterruptedException e){ 
        } 
        System.out.println("判断qq是否存在:"+jedis.exists("qq"));
        // 查看某个key的剩余生存时间,单位【秒】.永久生存或者不存在的都返回-1
        System.out.println("查看qq的剩余生存时间:"+jedis.ttl("qq"));
        // 移除某个key的生存时间
        System.out.println("移除qq的生存时间:"+jedis.persist("qq"));
    }

//    @Test
    public void testFind() {
        // 输出系统中所有的key
        Set<String> keys = jedis.keys("*");
        Iterator<String> it=keys.iterator() ;   
        while(it.hasNext()) {
          String key = it.next();
          System.out.println(key +" 的类型:"+ jedis.type(key));   
        }  
    }    

    @Test
    public void testKey() {
        // 删除某个key,若key不存在,则忽略该命令。
        System.out.println("系统中删除name: "+jedis.del("name"));
        System.out.println("判断name是否存在:"+jedis.exists("name"));
    }
}

操作字符串(String)

public class TestString {

    private Jedis jedis; // 获取数据库的连接,非切片客户端连接

    @Before
    public void setup() {
      jedis = RedisUtil.getJedis();
    }

    /**
     * jedis.setnx("name","***") 不存在便增加,存在不会修改原来的值
     * jedis.set("name","***")   不存在便增加,存在会修改原来的值
     */
    @Test
    public void testAdd() {
        System.out.println("=============增=============");
        jedis.set("name","heqing");
        jedis.set("age","26");
        System.out.println(jedis.get("name"));
        System.out.println(jedis.get("age"));
        Set<String> keys = jedis.keys("*"); 
        System.out.println("共有"+keys.size()+"个键值");

        System.out.println("=============新增键值对时防止覆盖原先值=============");
        System.out.println("当age存在时,尝试新增age:"+jedis.setnx("age", "27"));
        System.out.println("获取age对应的值:"+jedis.get("age"));
        System.out.println("原先age不存在时,新增age:"+jedis.set("age", "28"));
        System.out.println("获取age对应的值:"+jedis.get("age"));
    }

    /** 
     * set 直接覆盖原来的数据
     * append 在原来的数据后增加 
     * incr 进行加1操作,并返回增加后的值
     */ 
//    @Test
    public void testUpdate() {
        System.out.println("=============改=============");
        System.out.println("直接覆盖name原来的数据:"+jedis.set("name","heqing-update"));
        System.out.println("获取name对应的新值:"+jedis.get("name"));
        System.out.println("在name原来值后面追加:"+jedis.append("name","-append"));
        System.out.println("获取name对应的新值:"+jedis.get("name")); 
        System.out.println("在age进行加1操作:"+jedis.incr("age"));
        System.out.println("获取age对应的新值:"+jedis.get("age"));

        System.out.println("=============获取原值,更新为新值一步完成=============");
        System.out.println("name原值:"+jedis.getSet("name", "heqing-new"));
        System.out.println("name新值:"+jedis.get("name"));
    }

    /** 
     * mset,mget同时新增,修改,查询多个键值对 
     * 等价于:
     * jedis.set("name","ssss"); 
     * jedis.set("jarorwar","xxxx"); 
     */ 
//    @Test
    public void testFind() {
        System.out.println("=============获取子串=============");
        System.out.println("获取name对应值中的子串:"+jedis.getrange("name", 3, 5)); 

        System.out.println("=============增,删,查(多个)=============");
        Set<String> keys = jedis.keys("*"); 
        System.out.println("一次性新增name,age及其对应值:"+jedis.mset("name","heqing","age","26"));  
        System.out.println("一次性获取name,age各自对应的值:"+jedis.mget("name","age"));
        keys = jedis.keys("*"); 
        System.out.println("---->共有"+keys.size()+"个键值");
        System.out.println("一次性删除name,age:"+jedis.del(new String[]{"name","age"}));
        System.out.println("一次性获取name,age各自对应的值:"+jedis.mget("name","age")); 
        keys = jedis.keys("*"); 
        System.out.println("---->共有"+keys.size()+"个键值");
    }

//    @Test
    public void testDelete() {
        System.out.println("=============删=============");  
        System.out.println("删除name键值对:"+jedis.del("name"));  
        System.out.println("获取name键对应的值:"+jedis.get("name"));
        Set<String> keys = jedis.keys("*"); 
        System.out.println("共有"+keys.size()+"个键值");

        System.out.println("=============超过有效期键值对被删除=============");
        // 设置key的有效期,并存储数据 
        System.out.println("新增age,并指定过期时间为2秒"+jedis.setex("age", 2, "27")); 
        System.out.println("获取age对应的值:"+jedis.get("age")); 
        try{ 
            Thread.sleep(3000); 
        } 
        catch (InterruptedException e){ 
            e.printStackTrace();
        } 
        System.out.println("3秒之后,获取age对应的值:"+jedis.get("age"));
    }

}

操作列表(List)

public class TestList {

    private Jedis jedis; // 获取数据库的连接,非切片客户端连接

    @Before
    public void setup() {
      jedis = RedisUtil.getJedis();
    }

    /**
     * Lpush 命令将一个或多个值插入到列表头部(最左边)。
     *        如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误
     * Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。 
     * lrange 是按范围取出第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有  
     **/
    @Test
    public void testAdd() {
        System.out.println("=============增=============");
        jedis.lpush("java","1");  
        jedis.lpush("java","2");  
        jedis.lpush("java","3"); 
        System.out.println("所有元素-java:"+jedis.lrange("java", 0, -1));
        jedis.rpush("j2ee","test1");  
        jedis.rpush("j2ee","test2");  
        jedis.rpush("j2ee","test3"); 
        System.out.println("所有元素-j2ee:"+jedis.lrange("j2ee", 0, -1));
    }

//    @Test
    public void testUpdate() {
        System.out.println("=============改=============");
        System.out.println("j2ee修改前---->"+jedis.lrange("j2ee", 0, -1));
        // 修改列表中指定下标的值 
        jedis.lset("j2ee", 0, "test0"); 
        System.out.println("j2ee修改后---->"+jedis.lrange("j2ee", 0, -1));
    }

//    @Test
    public void testFind() {
        System.out.println("=============查=============");
        System.out.println("所有元素-java:"+jedis.lrange("java", 0, -1));
        // 数组长度 
        System.out.println("java的长度:"+jedis.llen("java"));
    }

    /*
     * list中存字符串时必须指定参数为alpha,如果不使用SortingParams,而是直接使用sort("list"),
     * 会出现"ERR One or more scores can't be converted into double"
     * 
     * 排序之后返回元素的数量可以通过limit修饰符进行限制,修饰符接受offset和count两个参数。
     *   offset:指定要跳过的元素数量,即起始位置。count:指定跳过offset个指定的元素之后,要返回多少个对象。
     * sort命令默认排序对象为数字,当需要对字符串进行排序时,需要显式地在sort命令之后添加alpha修饰符。
     * ace返回键值从小到大排序的结果。      desc:返回键值从大到小排序的结果
     * lrange 子串:  start为元素下标,end也为元素下标;-1代表倒数一个元素,-2代表倒数第二个元素
     * lindex 获取列表指定下标的值 
     */
//    @Test
    public void testOrder() {
        System.out.println("=============排序=============");
        System.out.println("Java原始排序:"+jedis.lrange("java", 0, -1));
        SortingParams sortingParameters = new SortingParams();
        sortingParameters.alpha();
        sortingParameters.limit(1, -1);
        sortingParameters.desc();
        System.out.println("返回排序后的结果:"+jedis.sort("java",sortingParameters)); 
        System.out.println("返回排序后的结果-java:"+jedis.sort("java"));
        System.out.println("子串-第二个开始到结束:"+jedis.lrange("java", 1, -1));
        System.out.println("获取下标为1的元素:"+jedis.lindex("java", 1)+"\n");
    }

    /**
     * lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素 。
     *      count>0:从表头开始向表尾搜索,count<0:从表尾开始向表头搜索,count = 0:移除表中所有与 VALUE 相等的值
     * Ltrim 让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
     *       0 表示列表的第一个元素,以 1 表示列表的第二个元素    -1表示列表的最后一个元素, -2 表示列表的倒数第二个元素
     * lpop 命令删除,并返回保存列表在key的第一个元素  
     **/
//    @Test  
    public void testDelete(){  
        System.out.println("=============删=============");
        System.out.println("所有元素-j2ee:"+jedis.lrange("j2ee", 0, -1));
        // 删除列表指定的值 ,第二个参数为删除的个数(有重复时),后add进去的值先被删,类似于出栈
        System.out.println("成功删除指定元素个数-java:"+jedis.lrem("j2ee", 1, "test0")); 
        System.out.println("删除指定元素之后-java:"+jedis.lrange("j2ee", 0, -1));
        // 删除区间以外的数据 
        System.out.println("删除下标0-1区间之外的元素:"+jedis.ltrim("j2ee", 0, 1));
        System.out.println("删除指定区间之外元素后-java:"+jedis.lrange("j2ee", 0, -1));
        // 列表元素出栈 
        System.out.println("出栈元素:"+jedis.lpop("j2ee")); 
        System.out.println("元素出栈后-java:"+jedis.lrange("j2ee", 0, -1));
        // 删除key 
        System.out.println("删除j2ee键值对:"+jedis.del("j2ee"));  
    }      
}

操作集合(Set)

public class TestSet {

    private Jedis jedis; // 获取数据库的连接,非切片客户端连接

    @Before
    public void setup() {
      jedis = RedisUtil.getJedis();
    }

//    @Test
    public void testAdd() {
        System.out.println("=============增=============");
        System.out.println("向user集合中加入元素name:"+jedis.sadd("user", "name")); 
        System.out.println("向user集合中加入元素age:"+jedis.sadd("user", "age"));
        System.out.println("向user集合中加入元素age:"+jedis.sadd("user", "qq"));
        System.out.println("查看user集合中的所有元素:"+jedis.smembers("user")); 
    }

//    @Test  
    public void testFind() {
        System.out.println("=============查=============");
        System.out.println("判断name是否在集合user中:"+jedis.sismember("user", "name"));
        System.out.println("判断who是否在集合user中:"+jedis.sismember("user", "who"));
        System.out.println("循环查询获取sets中的每个元素:");
        Set<String> set = jedis.smembers("user");   
        Iterator<String> it=set.iterator() ;   
        while(it.hasNext()){   
            Object obj=it.next();   
            System.out.println(obj);   
        }
        System.out.println("随机返回key集合中的一个元素:"+jedis.srandmember("user"));
        System.out.println("集合的元素个数  :"+jedis.scard("user"));
    }

//  @Test  
    public void testSet(){  
        System.out.println("=============删=============");
        System.out.println("删除前:"+jedis.smembers("user")); 
        System.out.println("集合user中删除元素qq:"+jedis.srem("user", "qq"));
        System.out.println("删除qq后:"+jedis.smembers("user"));
        System.out.println("删除user键值对:"+jedis.del("user"));  
        System.out.println("删除后:"+jedis.smembers("user"));
    }  

    @Test
    public void testOperation() {
        System.out.println("=============集合运算=============");
        System.out.println("user1中添加元素name:"+jedis.sadd("user1", "name")); 
        System.out.println("user1中添加元素age:"+jedis.sadd("user1", "age")); 
        System.out.println("user1中添加元素qq:"+jedis.sadd("user1", "qq")); 
        System.out.println("user2中添加元素name:"+jedis.sadd("user2", "name")); 
        System.out.println("user2中添加元素age:"+jedis.sadd("user2", "age")); 
        System.out.println("user2中添加元素e_nail:"+jedis.sadd("user2", "e_nail"));
        System.out.println("查看user1集合中的所有元素:"+jedis.smembers("user1"));
        System.out.println("查看user2集合中的所有元素:"+jedis.smembers("user2"));
        System.out.println("user1和user2交集:"+jedis.sinter("user1", "user2"));
        System.out.println("user1和user2并集:"+jedis.sunion("user1", "user2"));
        System.out.println("user1和user2差集:"+jedis.sdiff("user1", "user2"));
        System.out.println("user2和user1差集:"+jedis.sdiff("user2", "user1"));
    }

}

操作有序集合(sorted set)

private Jedis jedis; // 获取数据库的连接,非切片客户端连接

    @Before
    public void setup() {
      jedis = RedisUtil.getJedis();
    }

//    @Test
    public void testAdd() {
        System.out.println("=============增=============");
        System.out.println("user中添加元素name:"+jedis.zadd("user", 2.0, "name")); 
        System.out.println("user中添加元素age:"+jedis.zadd("user", 8.0, "age")); 
        System.out.println("user中添加元素qq:"+jedis.zadd("user", 5.0, "qq")); 
        System.out.println("user集合中的所有元素:"+jedis.zrange("user", 0, -1));//按照权重值排序  由小到大
    }

//    @Test
    public void testFind() {
        System.out.println("=============查=============");
        System.out.println("user集合中的所有元素:"+jedis.zrange("user", 0, -1));//按照权重值排序  由小到大
        System.out.println("统计zset集合中的元素中个数:"+jedis.zcard("user"));
        System.out.println("统计zset集合中权重某个范围内(1.0——5.0),元素的个数:"+jedis.zcount("user", 1.0, 5.0));
        System.out.println("查看zset集合中user的权重:"+jedis.zscore("user", "qq"));
        System.out.println("查看下标1到2范围内的元素值:"+jedis.zrange("user", 1, 2));
    }

    @Test  
    public void testSortedSet(){ 
        System.out.println("=============删=============");
        System.out.println("user中删除元素age:"+jedis.zrem("user", "age"));
        System.out.println("user集合中的所有元素:"+jedis.zrange("user", 0, -1));
        // 删除key 
        System.out.println("删除user键值对:"+jedis.del("user")); 
    }
}

操作Map

public class TestMap {

    private Jedis jedis; // 获取数据库的连接,非切片客户端连接

    @Before
    public void setup() {
      jedis = RedisUtil.getJedis();
    }

//    @Test
    public void testAddAndUpdate() {
        System.out.println("=============增或改============="); 
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "heqing");
        map.put("age", "27");
        map.put("qq", "975656343");
        jedis.hmset("user",map);
        Iterator<String> iter=jedis.hkeys("user").iterator();  
        while (iter.hasNext()){  
            String key = iter.next();  
            System.out.println("user集合中的键:"+key+",值:"+jedis.hmget("user",key));
        } 
    }

//    @Test
    public void testFind() {
        System.out.println("=============查=============");
        System.out.println("user集合中所有的键:"+jedis.hkeys("user"));//返回map对象中的所有key  
        System.out.println("user集合中所有的值:"+jedis.hvals("user"));//返回map对象中的所有value
        //取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List  
        //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数  
        List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
        System.out.println("user集合中name,age,qq:"+rsmap);
    }

    @Test
    public void testDelete() {  
        System.out.println("=============删=============");  
        System.out.println("删除前的值为:"+jedis.hmget("user", "age"));
        jedis.hdel("user","age");
        System.out.println("删除后的值为:"+jedis.hmget("user", "age")); //因为删除了,所以返回的是null  
        System.out.println("user中键的个数为:"+jedis.hlen("user")); //返回key为user的键中存放的值的个数2 
        System.out.println("是否存在key为user:"+jedis.exists("user"));//是否存在key为user的记录 返回true 
        System.out.println("删除user键值对:"+jedis.del("user")); 
        System.out.println("是否存在key为user:"+jedis.exists("user"));//是否存在key为user的记录 返回true 
    }
}

操作HashMap

public class TestHashMap {

    private Jedis jedis; // 获取数据库的连接,非切片客户端连接

    @Before
    public void setup() {
      jedis = RedisUtil.getJedis();
    }

//    @Test
    public void testAdd() {
        System.out.println("=============增=============");
        System.out.println("user中添加name和heqing键值对:"+jedis.hset("user", "name", "heqing")); 
        System.out.println("user中添加qq和975656343键值对:"+jedis.hset("user", "qq", "975656343"));
        System.out.println("新增age和26的整型键值对:"+jedis.hincrBy("user", "age", 26));
        System.out.println("user中的所有值:"+jedis.hvals("user"));
    }

//    @Test
    public void testUpdate() {
        System.out.println("=============改=============");
        System.out.println("修改前user中的所有值:"+jedis.hvals("user"));
        System.out.println("age整型键值的值增加100:"+jedis.hincrBy("user", "age", 100l));
        System.out.println("修改后user中的所有值:"+jedis.hvals("user"));
    }

//    @Test
    public void testFind() {
        System.out.println("=============查=============");
        System.out.println("判断name是否存在:"+jedis.hexists("user", "name"));
        System.out.println("获取name对应的值:"+jedis.hget("user", "name"));
        System.out.println("批量获取age和qq对应的值:"+jedis.hmget("user", "age", "qq")); 
        System.out.println("获取user中所有的key:"+jedis.hkeys("user"));
        System.out.println("获取user中所有的value:"+jedis.hvals("user"));
    }

    @Test
    public void HashOperate() {
        System.out.println("=============删=============");
        System.out.println("删除前user中的所有值:"+jedis.hvals("user"));
        System.out.println("user中删除qq键值对:"+jedis.hdel("user", "qq"));
        System.out.println("删除后qquser中的所有值:"+jedis.hvals("user"));
        System.out.println("删除user键值对:"+jedis.del("user"));  
        System.out.println("删除后user中的所有值:"+jedis.hvals("user"));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值