Redis---jedis的基本使用

一、jedis是什么?

 jedis 是 redis推荐的java客户端。通过Jedis我们可以很方便地使用java代码的方式,对redis进行操作。jedis使用起来比较简单,它的操作方法与redis命令相类似

二、应用案例

  先添加jedis依赖

        <!--jedis相关依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

然后就可以直接测试了

package com.zk.redis.controller;

import com.zk.redis.utils.RedisUtil;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class JedisController {

    private Jedis jedis;

    @Before
    public void setUp() {
        jedis = new Jedis("127.0.0.1", 6379);
    }

    /**
     * redis存储字符串
     */
    @Test
    public void testString() {
        jedis.set("name", "zhangkun");
        System.out.println(jedis.get("name"));
        //拼接
        jedis.append("name", " is cool");
        System.out.println(jedis.get("name"));
        //删除
        jedis.del("name");
        System.out.println(jedis.get("name"));
        //设置多个键值对
        jedis.mset("name", "zhangkun", "age", "24", "qq", "110");
        //进行加1操作
        jedis.incr("age");
        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", "zhangkun");
        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
     * 1.lpush 从左往右添加元素
     * 在key 对应 list的头部添加字符串元素
     * 2.rpush
     * 从右到左添加元素
     * 在key 对应 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.flushAll();
        //添加
        jedis.sadd("user", "zs");
        jedis.sadd("user", "ls");
        jedis.sadd("user", "ww");
        jedis.sadd("user", "gl");
        jedis.sadd("user", "tq");
        //移除noname
        jedis.srem("user", "tq");
        System.out.println(jedis.smembers("user"));//获取所有加入的value
        System.out.println(jedis.sismember("user", "tq"));//判断 who 是否是user集合的元素
        System.out.println(jedis.srandmember("user"));//返回集合中的一个随机元素
        System.out.println(jedis.scard("user"));//返回集合的元素个数
    }

    @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));//未排序
        System.out.println(jedis.sort("a")); //输入排序后结果
    }

    /**
     * 测试RedisUtil
     */
    @Test
    public void testRedisPool() {
        RedisUtil.getJedis().set("newName", "中文测试");
        System.out.println(RedisUtil.getJedis().get("newName"));

        RedisUtil.set("UtilTest", "success");
        System.out.println(RedisUtil.getJedis().get("UtilTest"));
        System.out.println(RedisUtil.getStr("UtilTest"));
    }


}

上面只是简单使用,项目中我们一般封装在工具类里,用法和上面个红色测试方法差不多

package com.zk.redis.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisConnectionException;


/**
 * redis连接池
 */
@Slf4j
public final class RedisUtil {

    //Redis服务器IP
    private static String ADDR = "127.0.0.1";

    //Redis的端口号
    private static int PORT = 6379;

    //访问密码
    private static String AUTH = "";

    //可用连接实例的最大数目,默认值为8;
    //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
    private static int MAX_TOTAL = 1024;

    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
    private static int MAX_IDLE = 200;

    //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
    private static int MAX_WAIT_MILLIS = 10000;
    private static int TIMEOUT = 10000;

    //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
    private static boolean TEST_ON_BORROW = true;

    private static JedisPool jedisPool = null;

    /**
     * 静态块,初始化Redis连接池
     */
    private static void initializePool() {
        try {
            log.info("ADDR:" + ADDR + ";PORT:" + PORT + ";AUTH" + AUTH);
            JedisPoolConfig config = new JedisPoolConfig();
            /*注意:
            在高版本的jedis jar包,比如本版本2.9.0,JedisPoolConfig没有setMaxActive和setMaxWait属性了
            这是因为高版本中官方废弃了此方法,用以下两个属性替换。
            maxActive  ==>  maxTotal
            maxWait==>  maxWaitMillis
            */
            //设置最大连接数(100个足够用了,没必要设置太大)
            config.setMinIdle(2);
            config.setMaxTotal(MAX_TOTAL);
            //最大空闲连接数  原因,运行环境配置较差,redis连接数过高所致,降低redis.maxIdle和redis.maxActive后,问题解决。没有再出现。
            config.setMaxIdle(MAX_IDLE);
            //获取Jedis连接的最大等待时间(50秒)
            config.setMaxWaitMillis(MAX_WAIT_MILLIS);
            //在获取Jedis连接时,自动检验连接是否可用
            config.setTestOnBorrow(TEST_ON_BORROW);
            //在将连接放回池中前,自动检验连接是否有效
            config.setTestOnReturn(true);
            //自动测试池中的空闲连接是否都是可用连接
            config.setTestWhileIdle(true);
            //密码为空就不认证
            if (StringUtils.isBlank(AUTH)) {
                jedisPool = new JedisPool(config, ADDR, PORT);
            } else {
                jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取Jedis实例
     */
    public static Jedis getJedis() {
        if (null == jedisPool) {
            poolInit();
        }
        Jedis jedis = null;
        int timeoutCount = 0;
        int retryNum = 3;
        while (jedis == null && timeoutCount < retryNum) {
            try {
                jedis = jedisPool.getResource();
            } catch (Exception e) {
                if (e instanceof JedisConnectionException) {
                    timeoutCount++;
                    log.info("getJedis timeoutCount={}", timeoutCount);
                    if (timeoutCount > 3) {
                        break;
                    }
                } else {
                    log.info("jedisInfo ... NumActive=" + jedisPool.getNumActive()
                            + ", NumIdle=" + jedisPool.getNumIdle()
                            + ", NumWaiters=" + jedisPool.getNumWaiters()
                            + ", isClosed=" + jedisPool.isClosed());
                    log.info("GetJedis error,{}", e);
                    break;
                }
            }
            timeoutCount++;
        }
        return jedis;
    }

    /**
     * 多线程环境同步初始化(保证项目中有且仅有一个连接池)
     */
    private static synchronized void poolInit() {
        if (null == jedisPool) {
            initializePool();
        }
    }

    // 设置过期时间
    public static boolean setTime(String key, String value, Integer expireSecond) {
        Jedis jedis = null;
        try {
            jedis = RedisUtil.getJedis();
            // NX是不存在时才set, XX是存在时才set, EX是秒,PX是毫秒
            if (jedis.exists(key)) {
                jedis.del(key);
            }
            jedis.setex(key, expireSecond, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            closeJedisPool(jedis);
        }
    }

    // 不设置过期时间
    public static boolean set(String key, String value) {
        Jedis jedis;
        jedis = RedisUtil.getJedis();
        try {
            boolean keyExist = jedis.exists(key);
            if (keyExist) {
                jedis.del(key);
            }
            jedis.set(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            closeJedisPool(jedis);
        }
    }

    // 删除缓存
    public static boolean del(String key) {
        Jedis jedis = RedisUtil.getJedis();
        try {
            jedis.del(key);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            closeJedisPool(jedis);
        }
    }

    // 取数据
    public static String getStr(String key) {
        Jedis jedis = null;
        String data = null;
        try {
            jedis = RedisUtil.getJedis();
            data = jedis.get(key);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeJedisPool(jedis);
        }
        return data;
    }

    public static void closeJedisPool(Jedis jedis) {
        if (jedis != null) {
            jedis.close(); //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
        }
    }

    /**
     * 释放jedis资源
     */
    public static void returnResource(final Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnResource(jedis);
        }
    }

}

 OK,小伙伴们赶快自己试试吧~~~

posted @ 2021-09-14 16:48  江南大才子  阅读(519)  评论(0编辑  收藏  举报