Java中使用Jedis操作Redis

来源:互联网 发布:数据分析师好考吗 编辑:程序博客网 时间:2024/05/21 06:56

前言:

    在前面的redis文章已经对单机版和集群版的redis进行了搭建,这里介绍一下java中使用jedis操作Redis。

jedis的使用

添加maven依赖

    <dependency>        <groupId>junit</groupId>        <artifactId>junit</artifactId>        <version>4.11</version>    </dependency>     <!-- Redis客户端 -->      <dependency>        <groupId>redis.clients</groupId>          <artifactId>jedis</artifactId>          <version>2.7.2</version>      </dependency>

测试类

大家可以使用Redis Desktop Manager作为数据查看工具:
https://redisdesktop.com/

/** *  * @author lpl * */public class RedisTest {    private Jedis jedis;    private JedisCluster jedis;    @Before//初始化方法    public void setup(){       // 连接redis服务器,192.168.17.185:6379  单机版链接方式        //jedis = new Jedis("192.168.251.129","6379");        // 创建一个JedisCluster对象        Set<HostAndPort> nodes = new HashSet<>();        nodes.add(new HostAndPort("192.168.251.129", 7001));        nodes.add(new HostAndPort("192.168.251.129", 7002));        nodes.add(new HostAndPort("192.168.251.129", 7003));        nodes.add(new HostAndPort("192.168.251.129", 7004));        nodes.add(new HostAndPort("192.168.251.129", 7005));        nodes.add(new HostAndPort("192.168.251.129", 7006));        // 在nodes中指定每个节点的地址        // jedisCluster在系统中是单例的。        jedis = new JedisCluster(nodes);    }    //字符串测试    @Test    public void testString(){        //测试链接        //System.out.println(jedis);        //添加数据        jedis.set("name", "dalei");        System.out.println(jedis.get("name"));        //拼接        jedis.append("name", "is a boy");//拼接        System.out.println("拼接后:"+jedis.get("name"));        //删除键name        jedis.del("name");        //对key中的数字值进行加一操作        jedis.incr("age");        //        System.out.println(jedis.get("name")+"-"+jedis.get("age"));    }    //map测试    @Test    public void testMap(){        //存储数据        Map<String,String> map = new HashMap<String,String>();        map.put("name", "dalei");        map.put("age", "23");        map.put("sex", "男");        jedis.hmset("user", map);        //获得数据        //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数        List<String> hmget = jedis.hmget("user", "name","age","sex");        System.out.println(hmget);        //删除map中的某个键值        jedis.hdel("user", "sex");        System.out.println(jedis.hmget("user", "sex")); // 因为删除了,所以返回的是null        System.out.println(jedis.hlen("user")); // 返回key为user的键中存放的值的个数2        System.out.println(jedis.exists("user"));// 是否存在key为user的记录 返回true        System.out.println(jedis.hkeys("user"));// 返回map对象中的所有key        System.out.println(jedis.hvals("user"));// 返回map对象中的所有value        //遍历map中的值        Iterator<String> iter = jedis.hkeys("user").iterator();        while (iter.hasNext()) {            String key = iter.next();            System.out.println(key + ":" + jedis.hmget("user", key));        }    }    /**      * jedis操作List      */        @Test        public void testList() {        // 开始前,先移除所有的内容        jedis.del("java framework");        System.out.println(jedis.lrange("java framework", 0, -1));        // 先向key java framework中存放三条数据        //Lpush将一个值插入到已存在的列表头部        jedis.lpush("java framework", "spring");        jedis.lpush("java framework", "struts");        jedis.lpush("java framework", "hibernate");        // 再取出所有数据jedis.lrange是按范围取出,        // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有        System.out.println(jedis.lrange("java framework", 0, -1));        jedis.del("java framework");        //rpush在列表中插入一条记录        jedis.rpush("java framework", "spring");        jedis.rpush("java framework", "struts");        jedis.rpush("java framework", "hibernate");        System.out.println(jedis.lrange("java framework", 0, -1));    }    /**       * jedis操作Set       */        @Test        public void testSet(){            //添加            jedis.sadd("student","liuling");            jedis.sadd("student","xinxin");            jedis.sadd("student","ling");            jedis.sadd("student","zhangxinxin");          jedis.sadd("student","who");            //移除noname            jedis.srem("student","who");            System.out.println(jedis.smembers("student"));//获取所有加入的value            System.out.println(jedis.sismember("student", "who"));//判断 who 是否是user集合的元素            System.out.println(jedis.srandmember("student"));            System.out.println(jedis.scard("student"));//返回集合的元素个数        }     //jedis 排序      @Test        public void test() throws InterruptedException {            //注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)            jedis.del("a");//先清除数据,再加入数据进行测试            jedis.rpush("a", "1");            jedis.lpush("a","6");            jedis.lpush("a","3");            jedis.lpush("a","9");            System.out.println(jedis.lrange("a",0,-1));// [9, 3, 6, 1]            System.out.println(jedis.sort("a")); //[1, 3, 6, 9]  //输入排序后结果            System.out.println(jedis.lrange("a",0,-1));        }  }

遇到的错误

报错1:集群no reachable node in cluster的错误
解决:1.确定每个redis配置文件中的bind是你客户端的ip (我的设置为0.0.0.0,任何ip都可以访问)2.开放端口(关闭虚拟机的防火墙)

报错2:JedisClusterMaxRedirectionsException: Too many Cluster redirections
原因:查看http://blog.csdn.net/l2000h_ing/article/details/52806933
解决:删除每个redis中的node.conf和nump. dump.rdb
重新运行:./redis-trib.rb create –replicas 1 192.168.251.129:7001 192.168.
251.129:7002 192.168.251.129:7003 192.168.251.129:7004 192.168.251.129:7005 192.168.251.129:7006

报错3:redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value
原因:因为redis数据库中已经存在了相同的key, 而且key对应的值类型并不是HashMap;再调用hmset时,就会抛出此错误。
解决:将原来的数据清除掉就可以了

参考资料:

1.http://www.cnblogs.com/liuling/p/2014-4-19-04.html
2.http://blog.csdn.net/qq_34021712/article/details/70274204

原创粉丝点击