您的位置:首页 > 数据库 > Redis

Java中使用Jedis操作Redis

2017-12-14 13:05 423 查看

前言:

在前面的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: