Redis(3):jedis 操作redis

一、实现功能

通过jedis连接redis数据库,进行数据操作

二、实现代码

1.添加jedis依赖到pom.xml文件

<dependency> 
    <groupId>redis.clients</groupId> 
    <artifactId>jedis</artifactId> 
    <version>2.9.0</version> 
</dependency>

2.简单实现

(1)简单

/**
 * 通过客户端连接redis
 */
public static void jedisdemosimple(){

    //1.设置IP地址和端口
    Jedis jedis=new Jedis("192.168.31.3",6379);

    //2.保存数据
    jedis.set("people","zhangsan3");
    //3.获取数据
    String value=jedis.get("people");
    System.out.println(value);

    //4.释放资源
    jedis.close();
}

(2)工具类

package com.Java.BaseUse.redis;

import com.Java.BaseUse.jdbc.DBUtil.DBUtil;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * Created by Administrator on 2020/3/3.
 */
public class RedisUtil {
    public static String url=null;
    public static int port=0;

    //通常情况下把数据密码放置 项目配置文件中 , 相对于放入类中,更安全一些。
    static {	//静态初始化块
        //创建获取配置文件对象。
        Properties properties = new Properties();
        try {
            //利用反射获取对应的字段
            InputStream in = DBUtil.class.getClassLoader()
                    .getResourceAsStream("redis.properties");//获取创建好的配置文件名
            properties.load(in);

            url = properties.getProperty("url");
            port = Integer.parseInt(properties.getProperty("port")) ;
            //加载驱动类
//            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(3)各个操作类型操作方法

package com.Java.BaseUse.redis;

import com.Java.BaseUse.jdbc.DBUtil.DBUtil;
import redis.clients.jedis.Jedis;

import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * Created by Administrator on 2020/3/3.
 */
public class RedisApi {



    //url
    private static final String redisurl=RedisUtil.url;
    //port
    private static final int port=RedisUtil.port;


    /**
     * 1.key
     */
    public static void testKeys() {
        //连接指定的redis,需要ip地址和端口号
//        Jedis jedis = new Jedis("192.168.0.8",6379);
        Jedis jedis = new Jedis(redisurl, port);
        //获取所有key
        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }
        //判断是否存在某个key
        System.out.println("是否存在k2:" + jedis.exists("k2"));
        //测试某个key的过期时间
        System.out.println("k1的存活时间:" + jedis.ttl("k2"));
        jedis.close();
    }

    /**
     * 2.String操作
     */
    public static void testString() {
        //连接指定的redis,需要ip地址和端口号
        Jedis jedis=new Jedis(redisurl, port);
        jedis.select(1);  //选择指定数据库0-15
        System.out.println("获取K1的值:"+jedis.get("k1"));
        jedis.msetnx("k11","v12","k22","v22","k33","v33");


        System.out.println(jedis.mget("k11","k22","k33"));
        //关闭连接
        jedis.close();
    }


    /**
     * 3.List操作
     */
    public static void testList() {
        //连接指定的redis,需要ip地址和端口号
        Jedis jedis=new Jedis(redisurl, port);
        jedis.lpush("mylist", "1","2","3","4");
        List<String> list = jedis.lrange("mylist", 0, -1);
        for (String element : list) {
            System.out.println(element);
        }
        //关闭连接
        jedis.close();
    }


    /**
     * 4.Set操作
     */
    public static void testSet() {
        //连接指定的redis,需要ip地址和端口号
        Jedis jedis=new Jedis(redisurl,port);
        //添加元素
        jedis.sadd("mySet", "Jack","Marry","Tom","Tony");

        //删除指定元素
        jedis.srem("mySet", "Tony");

        //获取指定key的元素
        Set<String> smembers = jedis.smembers("mySet");
        for (String member : smembers) {
            System.out.println(member);
        }
        //关闭连接
        jedis.close();
    }


    /**
     * 5.hash
     */
    public static void testHash() {
        //连接指定的redis,需要ip地址和端口号
        Jedis jedis=new Jedis(redisurl,port);
        jedis.hset("myHash", "username", "Jack");
        jedis.hset("myHash", "password", "123123");
        jedis.hset("myHash", "age", "11");

        //将多个数据封装为一个map
        Map<String, String> map=new HashMap<String, String>();
        map.put("gender", "male");
        map.put("department", "研发部");

        //批量设置多个数据
        jedis.hmset("myHash", map);
        List<String> values = jedis.hmget("myHash","username","password");
        for (String val : values) {
            System.out.println(val);
        }

        //关闭连接
        jedis.close();
    }

    /**
     * 6.zset操作
     */
    public static void testZset() {
        //连接指定的redis,需要ip地址和端口号
        Jedis jedis=new Jedis(redisurl, port);
        jedis.zadd("myZset", 100, "math");
        //将多个数据封装为一个map
        Map<String, Double> subject=new HashMap<String, Double>();
        subject.put("chinese", 88d);
        subject.put("english", 86d);
        //批量添加数据
        jedis.zadd("myZset", subject);
        Set<String> zset = jedis.zrange("myZset", 0, -1);
        for (String val : zset) {
            System.out.println(val);
        }
        //关闭连接
        jedis.close();
    }

}

3.通过连接池连接Redis

(1)核心参数

  • MaxTotal 控制一个 pool 可分配多少个 jedis 实例,通过 pool.getResource()来获取;如果赋值为-1,则表示不限制;如果 pool 已经分配了 MaxTotal 个 jedis 实例,则此时 pool 的状态为 exhausted。
  • maxIdle 控制一个 pool 最多有多少个状态为 idle(空闲)的 jedis 实例。
  • MaxWaitMillis 表示当 borrow 一个 jedis 实例时,最大的等待毫秒数,如果超过等待时间,则直接抛
  • JedisConnectionException。
  • testOnBorrow 获得一个 jedis 实例的时候是否检查连接可用性(ping());如果为 true,则得到的 jedis实例均是可用的。

(2)代码实例

/**
 * 通过连接池连接redis
 */
public static void jedisdemopool(){
    //1.获得连接池配置对象
    JedisPoolConfig config=new JedisPoolConfig();
    //设置最大连接数
    config.setMaxTotal(30);
    //设置最大空闲连接数
    config.setMaxIdle(10);

    //2.获得连接池
    JedisPool jedispool=new JedisPool(config,"192.168.31.3",6379);

    //3.获得核心对象
    Jedis jedis=null;
    try {
        //4.通过连接池获得连接
        jedis=jedispool.getResource();
        //5.设置数据
        jedis.set("peoples","lisi3");
        //6.获取数据
        String value=jedis.get("peoples");
        System.out.println(value);
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        //7.释放资源
        if (jedis!=null){
            jedis.close();
        }
        if(jedispool !=null){
            jedispool.close();
        }
    }

}

或者

package com.Java.BaseUse.redis;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Created by Administrator on 2020/3/3.
 * 参考:
 */
public class RedisPoolUtilApi {

    //url
    private static final String redisurl=RedisUtil.url;
    //port
    private static final int port=RedisUtil.port;

    private static volatile JedisPool jedisPool = null;

    private RedisPoolUtilApi(){

    }

    /**
     * 1.简单测试
     */
    public static void testPool(){
        //默认的连接池配置
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        System.out.println(poolConfig);
        //连接池对象
        JedisPool jedisPool=new JedisPool(poolConfig, redisurl, port,60000);

        Jedis jedis = jedisPool.getResource();
        String ping = jedis.ping();
        System.out.println(ping);
        //如果是从连接池中获取的,那么执行close方法只是将连接放回到池中
        jedis.close();
        jedisPool.close();
    }


    /**
     * 2.返回RedisPool的单例模式
     * @return
     */
    public static JedisPool getJedisPoolInstance() {
        if (null == jedisPool) {
            synchronized (RedisPoolUtilApi.class) {
                if (null == jedisPool) {
                    JedisPoolConfig poolConfig = new JedisPoolConfig();
                    poolConfig.setMaxTotal(200);//最大连接数
                    poolConfig.setMaxIdle(32);//最大空闲连接数
                    //获取连接时的最大等待毫秒数,如果超时就抛异常,默认-1
                    poolConfig.setMaxWaitMillis(100*1000);
                    //连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
                    poolConfig.setBlockWhenExhausted(true);
                    //在获取连接的时候检查有效性, 默认false
                    poolConfig.setTestOnBorrow(true);
                    jedisPool = new JedisPool(poolConfig, redisurl, port, 60000 );
                } } }
        return jedisPool;
    }
}

三、参考

1.cpthack大牛实现

https://github.com/cpthack/redis-client

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值