Redis 学习笔记3:Jedis 连接虚拟机下的Redis 服务

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


虚拟机的IP地址是192.168.8.88.

Jedis代码是放在windows上的,启动虚拟机上的Redis服务之后,用Jedis连接。

以下是Jedis 操作Redis的简单示例,直接贴代码. 

搭建Jedis之前,需要引入两个Jar包.

commons-pool-1.5.1.jar
jedis-2.1.0.jar

代码中的密码是在虚拟机Redis客户端设置的,居然见下面的注意事项.

package com.test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public final class RedisUtil {
	
    //Redis服务器IP
	private static String ADDR = "192.168.8.88";
	//Redis的端口号
	private static int PORT = 6379;
	//访问密码
	private static String AUTH = "123456";
	//可用连接实例的最大数目,默认值为8;
	//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
	 private static int MAX_ACTIVE = 1024;
	
	 //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8.
	 private static int MAX_IDLE = 200;
	 //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出
	 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;
	  
	  /**
	   * 初始化Jedis连接池
	   */
	  static {
		  try {
		       JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
			   jedisPoolConfig.setMaxActive(MAX_ACTIVE);
			   jedisPoolConfig.setMaxIdle(MAX_IDLE);
			   jedisPoolConfig.setMaxWait(MAX_WAIT);
			   jedisPoolConfig.setTestOnBorrow(TEST_ON_BORROW);
			   jedisPool=new JedisPool(jedisPoolConfig, ADDR, PORT, TIMEOUT,AUTH);
		} catch (Exception e) {
			 e.printStackTrace();
		}
    }
	  
	 /**
	  * 获取jedis实例
	  */
	   public synchronized static Jedis  getJedis(){
		   try {
			 if(jedisPool!=null){
		    	    Jedis resource =jedisPool.getResource();
		    	    return resource;
		         }else {
		    	   return null;
		         }
		   	} catch (Exception e) {
				 e.printStackTrace();
				 return null;
			}
	 }
	   
	  /**
	   * 释放Jedis资源
	   */
	   public static void returnResource(final Jedis jedis){
		          if(jedis!=null){
		        	  jedisPool.returnResource(jedis);
		          }
	   }
}

接下来编写Junit测试用例

package com.test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.Jedis;

public class TestRedis {
    private Jedis jedis; 
    
    @Before
    public void setup() {
    	//连接redis服务器
        jedis = new Jedis("192.168.8.88", 6379);
        //权限认证
        jedis.auth("123456");  
    }
    
    /**
     * redis存储字符串
     */
    @Test
    public void testString() {
        //-----添加数据----------  
        jedis.set("name","xinxin");//向key-->name中放入了value-->xinxin  
        System.out.println(jedis.get("name"));//执行结果:xinxin  
        
        jedis.append("name", " is my lover"); //拼接
        System.out.println(jedis.get("name")); 
        
        jedis.del("name");  //删除某个键
        System.out.println(jedis.get("name"));
        //设置多个键值对
        jedis.mset("name","liuling","age","23","qq","476777XXX");
        jedis.incr("age"); //进行加1操作
        System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));
        
    }
    
    /**
     * redis操作Map
     */
    @Test
    public void testMap() {
        //-----添加数据----------  
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "xinxin");
        map.put("age", "22");
        map.put("qq", "123456");
        jedis.hmset("user",map);
        //取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List  
        //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数  
        List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
        System.out.println(rsmap);  
  
        //删除map中的某个键值  
        jedis.hdel("user","age");
        System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是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 
  
        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中存放三条数据  
        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");
        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("user2","liuling");  
        jedis.sadd("user2","xinxin");  
        jedis.sadd("user2","ling");  
        jedis.sadd("user2","zhangxinxin");
        jedis.sadd("user2","who");  
        //移除noname  
        jedis.srem("user2","who");  
        System.out.println(jedis.smembers("user2"));//获取所有加入的value  
        System.out.println(jedis.sismember("user2", "who"));//判断 who 是否是user集合的元素  
        System.out.println(jedis.srandmember("user2"));  
        System.out.println(jedis.scard("user2"));//返回集合的元素个数  
    }  
  
    @Test  
    public void test() throws InterruptedException {  
        //jedis 排序  
        //注意,此处的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));  
    }  
    
    @Test
    public void testRedisPool() {
        RedisUtil.getJedis().set("newname", "中文测试");
        System.out.println(RedisUtil.getJedis().get("newname"));
    }
}


注:Jedis操作时遇到的一些问题

1、Redis服务已经启起来了,Jedis操作居然报错.


 DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, 
no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 
1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent.
2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server.
3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 
4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

错误提示已经详细提供了错误的解决办法,我们才用第4种,设置密码的方式.

[root@itcast01 redis-3.2.1]# redis-cli
127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> 


设置密码之后,Jedis再次连接就可以了.


或直接修改redis安装目录下的配置文件redis-conf 中的属性字段 "requirepass  访问密码"。


如果不想设置密码,可以修改Redis配置文件的protected-mode 属性如下图所示:








  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值