前言:
在前面的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