java 操作Redis list 命令 实例(Jedis) (四)

package com.jjf.redis;

import org.junit.Assert;
import org.junit.Test;
import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.Jedis;

import java.util.List;

/**
 * Created by jjf_lenovo on 2017/3/28.
 */
public class RedisListTest {
    Jedis jedis = null;
    static final String DATASOURCE_URL = "182.254.213.106";
    static final int DATASOURCE_SORT = 6379;
    static final String DATASOURCE_PASS = "123456";
    static final int DATASOURCE_SELECT = 1;
    public RedisListTest(){
        //基本配置
        jedis = new Jedis(DATASOURCE_URL,DATASOURCE_SORT);
        jedis.auth(DATASOURCE_PASS);
        jedis.select(DATASOURCE_SELECT);
    }

    @Test
    public void testLPushAndLPushX(){
        /**
         * 将一个或多个值 value 插入到列表 key 的表头

         如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。

         如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。

         当 key 存在但不是列表类型时,返回一个错误。

         在Redis 2.4版本以前的 LPUSH 命令,都只接
         */
        //jedis.lpushx("list","a","b","c") 会报错,因为lpushx必须key存在
        Long lpush = jedis.lpush("list","a","b","c"); //返回的是列表的长度!!不是操作数
        Assert.assertTrue(lpush==3);
        /**
         * 多个值lpushx会报错 redis.clients.jedis.exceptions.JedisDataException: ERR wrong number of arguments for 'lpushx' command
         * lpushx不支持多个参数,但是jedis里有方法,rpushx也是,反人类。。。
        */
        Long lpushx = jedis.lpushx("list","a");
        Assert.assertTrue(lpushx==4);
        Assert.assertTrue(jedis.del("list")==1);
    }

    @Test
    public void testLLen(){
        //返回列表 key 的长度。
        Assert.assertTrue(jedis.llen("list")==0);
        Assert.assertTrue(jedis.lpush("list","a","b","c")==3);
        Assert.assertTrue(jedis.llen("list")==3);
        Assert.assertTrue(jedis.del("list")==1);
    }

    @Test
    public void testLIndex(){
        //返回列表 key 中,下标为 index 的元素。
        Assert.assertTrue(jedis.lpush("list","a","b","c")==3);
        Assert.assertTrue(jedis.lpush("list","d")==4);
//        System.out.println(jedis.lindex("list",0));
        Assert.assertTrue(jedis.lindex("list",0).equals("d"));
        Assert.assertTrue(jedis.lindex("list",-1).equals("a"));
        Assert.assertTrue(jedis.del("list")==1);
    }

    @Test
    public void testLInsert(){
        //将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
        Assert.assertTrue(jedis.lpush("list","a","b","c")==3);
        Assert.assertTrue(jedis.lpush("list","d")==4);
        //将"insert"插入到"list"值"d"的后面,"c"的前面,下面两句效果一样
        Assert.assertTrue(jedis.linsert("list", BinaryClient.LIST_POSITION.BEFORE,"c","insert")==5);
//        Assert.assertTrue(jedis.linsert("list", BinaryClient.LIST_POSITION.AFTER,"d","insert")==5);
        Assert.assertTrue(jedis.del("list")==1);
    }

    @Test
    public void testLRange(){
        //lrange 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
        Assert.assertTrue(jedis.lpush("list","a","b","c")==3);
        Assert.assertTrue(jedis.lpush("list","d")==4);
        List<String> list = jedis.lrange("list",0,-1);
        Assert.assertTrue(list.size()==4);
        Assert.assertTrue(jedis.del("list")==1);
    }

    @Test
    public void testLrem(){
        /**lrem
         * 根据参数 count 的值,移除列表中与参数 value 相等的元素。

         count 的值可以是以下几种:

         count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
         count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
         count = 0 : 移除表中所有与 value 相等的值。
         */
        Assert.assertTrue(jedis.lpush("list","rem")==1);
        Assert.assertTrue(jedis.llen("list")==1);
        jedis.lrem("list",0,"rem");
        Assert.assertTrue(jedis.llen("list")==0);
    }

    @Test
    public void testLSet(){
        //lset 将列表 key 下标为 index 的元素的值设置为 value
        Assert.assertTrue(jedis.lpush("list","a","b","c")==3);
        Assert.assertTrue(jedis.lpush("list","d")==4);
        Assert.assertTrue(jedis.lindex("list",1).equals("c"));
        Assert.assertTrue(jedis.lset("list",1,"e").equals("OK"));
        Assert.assertTrue(jedis.lindex("list",1).equals("e"));
        Assert.assertTrue(jedis.del("list")==1);
    }

    @Test
    public void testLTrim(){
        //ltrim 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
        Assert.assertTrue(jedis.lpush("list","a","b","c","d","e")==5);
        Assert.assertTrue(jedis.ltrim("list",0,1).equals("OK"));
        Assert.assertTrue(jedis.lrange("list",0,1).size()==2);
        Assert.assertTrue(jedis.del("list")==1);
    }

    @Test
    public void testLPopAndRPop(){
        //lpop 移除并返回列表 key 的头元素。
        //rpop 移除并返回列表 key 的尾元素。
        Assert.assertTrue(jedis.lpush("list","a","b","c","d","e")==5);
        Assert.assertTrue(jedis.lpop("list").equals("e"));
        Assert.assertTrue(jedis.rpop("list").equals("a"));
        Assert.assertTrue(jedis.llen("list")==3);
        Assert.assertTrue(jedis.del("list")==1);
    }

    @Test
    public void testRPopLPush(){
        /**
         * 原子操作
         * 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
         * 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
         */
        Assert.assertTrue(jedis.lpush("pop","a","b","c","d","e")==5);
        Assert.assertTrue(jedis.lpush("push","A","B","C","D","E")==5);
        jedis.rpoplpush("pop","push");
        jedis.rpoplpush("pop","push");
        jedis.rpoplpush("pop","push");
        Assert.assertTrue(jedis.rpoplpush("pop","push").equals("d"));
        Assert.assertTrue(jedis.llen("push")==9);
        Assert.assertTrue(jedis.del("pop","push")==2);
    }

    @Test
    public void testRPushAndRPushX(){
        Assert.assertTrue(jedis.rpush("list","a","b","c","d","e")==5);//跟lpush顺序相反
        Assert.assertTrue(jedis.rpushx("list","12333")==6);
        Assert.assertTrue(jedis.lindex("list",0).equals("a"));//最先插入的最前面
        Assert.assertTrue(jedis.del("list")==1);
    }

    @Test
    public void testBLPopAndBRPop(){
        //它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
        /**
         * 相同的key被多个客户端同时阻塞

         相同的 key 可以被多个客户端同时阻塞。

         不同的客户端被放进一个队列中,按『先阻塞先服务』(first-BLPOP,first-served)的顺序为 key 执行 BLPOP 命令。

         在MULTI/EXEC事务中的BLPOP

         BLPOP 可以用于流水线(pipline,批量地发送多个命令并读入多个回复),但把它用在 MULTI / EXEC 块当中没有意义。因为这要求整个服务器被阻塞以保证块执行时的原子性,该行为阻止了其他客户端执行 LPUSH 或 RPUSH 命令。

         因此,一个被包裹在 MULTI / EXEC 块内的 BLPOP 命令,行为表现得就像 LPOP 一样,对空列表返回 nil ,对非空列表弹出列表元素,不进行任何阻塞操作。
         */
//        jedis.blpop(100,"list");//其实就是lpop的阻塞版本,可以手动添加试试,单位是秒
//
//        jedis.brpop(100,"list");//其实就是rpop的阻塞版本,可以手动添加试试,单位是秒
//
//        jedis.brpoplpush("pop","push",100);//rpoplpush,可以手动添加试试,单位是秒
    }
}

废话不多说,上代码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值