• Redis学习之Jedis的操作和使用


    1、Jedis的介绍

    Jedis就是Redis在Java中的实现,所以Jedis就是集成了Redis的一些命令操作,封装了Redis的Java客户端,提供了连接池管理。虽然Jedis是Redis官方推荐的面向Java的操作Redis的客户端,但是我们一般不直接使用Jedis,而是在其上在封装一层,作为业务的使用。所以一般会使用RedisTemplate,RedisTemplate是SpringDataRedis中对JedisApi的高度封装。SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端,比Jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用如:SpringCache。所以我们这里简单了解Jedis的使用即可。

    2、Jedis的应用准备工作

    首先要修改redis.conf配置文件的这两项:

    bind 127.0.0.1 注释掉

    protected-mode 设置为no

    额外还有一点需要注意的是开启对应的端口:

    1. CentOS7下查看防火墙运行访问的端口号:firewall-cmd --list-ports
    2. 开启6379端口号:firewall-cmd --zone=public --add-port=6379/tcp --permanent
    3. 重启防火墙:firewall-cmd --reload

    然后需要导入相关依赖:

        <dependencies>
            <!-- Jedis的支持包 -->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>3.3.0</version>
            </dependency>
            <!-- Junit测试包 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <!-- 导入slf4j包 -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-nop</artifactId>
                <version>1.7.2</version>
            </dependency>

    创建生成Jedis连接的JedisPoolUtil.java工具类,其中:

    • redis.clients.jedis.JedisPool:加载配置信息创建连接池
    • redis.clients.jedis.JedisPoolConfig:存放配置信息
    package com.thr.redis;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    public class JedisPoolUtil {
        private static JedisPool jedisPool;
    
        static {
            //连接池配置信息,不写使用默认值
            JedisPoolConfig config = new JedisPoolConfig();
            //可用最大连接数
            config.setMaxTotal(50);
            //最大空闲连接数
            config.setMaxIdle(5);
            //最长等待时间
            config.setMaxWaitMillis(10000);
            //在获取redis连接时,自动检测连接是否有效
            config.setTestOnBorrow(true);
            //我的redis数据库设置了密码,所以需要密码参数
            ////jedisPool=new JedisPool(config,ADDR,PORT,TIMEOUT,AUTH);
            jedisPool=new JedisPool(config,"192.168.30.102",6379,60000,"123456");
        }
        //获取Redis资源
        public synchronized static Jedis getJedis(){
            try
            {
                if (jedisPool!=null)
                {
                    Jedis jedis=jedisPool.getResource();
                    return jedis;
                }else {
                    return null;
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            return null;
        }
        //释放redis资源
        @SuppressWarnings("deprecation")
        public synchronized static void releaseConn(Jedis jedis){
            if (jedisPool!=null)
            {
                jedisPool.close();
            }
        }
    }
    

    然后通过Jedis的ping()方法测试是否成功连接到了redis。

        @Test
        public void testPing(){
            Jedis jedis = JedisPoolUtil.getJedis();
            //测试是否成功连接redis
            System.out.println(jedis.ping());
        }

    输出结果如下:

    image

    看到输出PONG,则表示连接成功了!下面我们分别来使用Jedis操作Redis的一些命令。

    3、操作基本的key

        //对key的操作
        @Test
        public void operateKey()  {
            System.out.println("******对key的操作******");
            Jedis jedis = JedisPoolUtil.getJedis();
            try {
                // 1.flushDB():清空Redis数据库(谨慎操作)
                System.out.println(jedis.flushDB());
                // 2.exists():判断key是否存在
                System.out.println(jedis.exists("key1"));
                jedis.set("key1","value1");
                jedis.set("key2","value2");
                System.out.println(jedis.exists("key1"));
                // 3.keys():查询匹配的key
                // KEYS * 匹配数据库中所有 key 。
                // KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
                // KEYS h*llo 匹配 hllo 和 heeeeello 等。
                // KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
                System.out.println(jedis.keys("*"));
                // 4.expire();设置60秒后该key过期
                jedis.expire("key2", 60);
                // 5.pttl():获取key的剩余生存时间
                System.out.println(jedis.pttl("key2"));
                // 6.persist():移除key的过期时间
                jedis.persist("key");
                // 7.type():获取key的类型, "string", "list", "set". "none" none表示key不存在
                System.out.println("type: " + jedis.type("key2"));
                // 8.renamenx():将key重命名
                jedis.renamenx("key2", "key2_rename");
                System.out.println("key2是否存在: " + jedis.exists("key2"));// 判断是否存在
                System.out.println("key2_rename是否存在: " + jedis.exists("key2_rename"));// 判断是否存在
                // 9.del():删除key
                jedis.del("key2");
                System.out.println(jedis.exists("key2"));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JedisPoolUtil.releaseConn(jedis);
            }
        }

    输出结果如下:

    image

    4、操作String类型数据

        //操作String类型数据
        @Test
        public void operateString(){
            System.out.println("******对String的操作******");
            Jedis jedis = JedisPoolUtil.getJedis();
            try {
                // 清空Redis数据库(谨慎操作)
                //System.out.println(jedis.flushDB());
                // 1.set():设置键值(key-value)
                jedis.set("hello", "String");
                System.out.println("获取的值为:"+jedis.get("hello"));
                // 2.append():在键值后追加内容
                jedis.append("hello", " This is append String");
                System.out.println("拼接后的值为:"+jedis.get("hello"));
                // 3.mset():同时设置多个key-value
                jedis.mset("a","1","b","2","c","3");
                System.out.println("批量获取值:"+jedis.mget("a", "b", "c"));
                // 4.setex():设置key过期时间
                jedis.setex("hello2",3,"String");
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("key的剩余过期时间:"+jedis.pttl("hello2"));
                // 5.setnx():在键key不存在的情况下,将键key的值设置为value,当且仅当可以存在(这个命令非常重要,可以实现分布式锁的功能)
                // 解释:如果key存在,则SETNX不做任何动作,如果key不存在则相当于进行SET操作
                jedis.setnx("hello","world");
                //jedis.setnx("h","w");
                System.out.println(jedis.get("hello"));
                System.out.println(jedis.keys("*"));
                // 6.incr():如果键key的值是整数可以进行加减操作,其他它类型会报错
                jedis.set("testInt", "0");
                jedis.incr("testInt");
                System.out.println("整数值进行加操作:"+jedis.get("testInt"));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JedisPoolUtil.releaseConn(jedis);
            }
        }

    输出结果如下:

    image

    5、操作List类型

        //操作List类型
        @Test
        public void operateList(){
            System.out.println("******对List的操作******");
            Jedis jedis=JedisPoolUtil.getJedis();
            try
            {
                // 清空Redis数据库(谨慎操作)
                System.out.println(jedis.flushDB());
                // 1.lpush():从列表左侧增加元素,lpush()方法参数列表是可变参数
                jedis.lpush("redisList","aaa","bbb","ccc","ddd");
                // 2.lpushx():将值value插入到列表key的前面,仅当key存在并且是同一个List
                // 和LPUSH命令相反,当可以不存在是,LPUSHX命令上面也不做
                // 注意:LPUSHX和RPUSHX只能插入已存在的List中,如果键key不存在就不进行任何操作
                jedis.lpushx("redisList", "AAA","BBB");
                // 3.lrange():返回List列表中key指定区间内的元素,偏移量start-stop,当start是0,stop是-1时表示遍历整个redisList
                System.out.println("List列表的元素:"+jedis.lrange("redisList", 0, -1));
                List<String> redisList=jedis.lrange("redisList", 0, -1);
                System.out.print("遍历出来的List元素:");
                for (int i = 0; i < redisList.size(); i++ )
                {
                    System.out.print(redisList.get(i)+" ");
                }
                System.out.println();
                // 4.llen():返回List列表的长度
                System.out.println("List列表的长度为:"+jedis.llen("redisList"));
                // 5.linsert():可以在指定值后插入元素,如果该元素有多个,只在第一个后面插入
                jedis.linsert("redisList", ListPosition.AFTER, "AAA", "CCC");
                jedis.linsert("redisList", ListPosition.AFTER, "CCC", "DDD");
                System.out.println(jedis.lrange("redisList", 0, -1));
                // 6.lindex():根据指定索引获取值,索引为正从左往右获取,索引为负从右向左获取
                String index2=jedis.lindex("redisList", 2);
                String index_2=jedis.lindex("redisList", -2);
                System.out.println("从左到右获取索引为2的值为:"+index2);
                System.out.println("从右到左获取索引为2的值为:"+index_2);
                // 7.lset():修改列表指定索引元素,若不存在则报错
                jedis.lset("redisList", 1, "updateValue");
                System.out.println("修改索引为1的值:"+jedis.lindex("redisList", 1));
                System.out.println(jedis.lrange("redisList", 0, -1));
                // 8.lpop():删除列表左侧头部元素
                String lrem=jedis.lpop("redisList");
                System.out.println("删除列表的头部元素:"+lrem);
                // 9.rpop():删除列表右侧头部元素
                String rrem=jedis.rpop("redisList");
                System.out.println("删除列表的尾部元素:"+rrem);
                // 10.ltrim():去除索引范围外的元素
                String ltrim=jedis.ltrim("redisList", 1, 3);
                System.out.println("去除key为redisList,索引在1-3之外的其它元素:"+ltrim);
                System.out.println(jedis.lrange("redisList", 0, -1));
                // 11.lrem():移出指定值的索引位置,如果count>0从左往右删除count个该元素,如果count=0删除列表中与value相同的元素,如果count<0从右往左删除count个该元素
                jedis.lrem("redisList", 1, "CCC");
                System.out.println("移除从左到右key为redisList,值为CCC的一个元素:"+jedis.lrange("redisList", 0, -1));
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally{
                JedisPoolUtil.releaseConn(jedis);
            }
        }

    输出结果如下:

    image

    6、操作Hash数据类型

        //操作Hash类型数据
        @Test
        public void operateHash(){
            System.out.println("******对Hash的操作******");
            Jedis jedis=JedisPoolUtil.getJedis();
            try
            {
                //清空数据库(谨慎操作)
                System.out.println(jedis.flushDB());
                Map<String, String> map=new HashMap<String, String>();
                map.put("username", "张三");
                map.put("password", "123456");
                map.put("age", "24");
                map.put("sex", "男");
                // 1.hmset():批量添加hash类型数据
                jedis.hmset("user", map);
                // 2.hget():获取该键包含的指定键值
                System.out.println("获取指定key的值:"+jedis.hget("user", "username"));
                // 3.hgetAll():获取Hash表中该键包含的所有键值对
                System.out.println("该key中所有的键值对:"+jedis.hgetAll("user"));
                // 4.hexists():判断key是否存在
                boolean isExists=jedis.hexists("user", "address");
                System.out.println("Key address是否存在?"+(isExists?"是":"否"));
                // 5.hlen():获取该散列表包含的键的个数
                long hlen=jedis.hlen("user");
                System.out.println("散列表的key为user的长度为:"+hlen);
                // 6.hset():向散列中添加键值
                jedis.hset("user", "address", "中国深圳");
                // 7.hkeys()/hvals:返回哈希表中key所有的域和域的值。
                System.out.println("哈希表key为user的所有域为:"+jedis.hkeys("user"));
                System.out.println("哈希表key为user的所有域值为:"+jedis.hvals("user"));
                // 8.hincrBy():如果键值是整型,可以加减该键值
                jedis.hincrBy("user", "age",2);
                System.out.println("增加后的age为:"+jedis.hget("user","age"));
                // 9.hdel():删除散列中的键
                jedis.hdel("user", "address");
                isExists=jedis.hexists("user", "address");
                System.out.println("user对象中的address是否还存在?"+(isExists?"是":"否"));
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally{
                JedisPoolUtil.releaseConn(jedis);
            }
        }

    输出结果如下:

    image

    7、操作Set类型数据

        //操作Set类型数据
        @Test
        public void operateSet(){
            System.out.println("******对Set的操作******");
            Jedis jedis=JedisPoolUtil.getJedis();
            try
            {
                //清空数据库(谨慎操作)
                System.out.println(jedis.flushDB());
                // 1.sadd():添加元素,注意与List类型的区别,Set不会存储重复元素
                jedis.sadd("redisSet", "AAA");
                jedis.sadd("redisSet", "AAA","BBB");
                jedis.sadd("redisSet", "AAA","BBB","CCC","DDD");
                // 2.scard():获取集合里面的元素数量
                System.out.println(jedis.scard("Set集合中的数量为:"+"redisSet"));
                // 3.smembers():查询Set集合中的所有元素
                Set<String> redisSet=jedis.smembers("redisSet");
                System.out.println("Set集合中的所有元素:"+redisSet);
                System.out.print("Set集合中遍历出来的所有元素:");
                Iterator<String> iterator=redisSet.iterator();
                while (iterator.hasNext())
                {
                    System.out.print(iterator.next()+" ");
                }
                System.out.println();
                // 4.sismember():判断元素是否存在于集合内
                boolean isExists=jedis.sismember("redisSet", "AAA");
                System.out.println("AAA是否在redisSet?"+(isExists?"是":"否"));
                // 5、集合运算(并集、交集、差集)
                // (1)、并集
                jedis.sadd("redisSet2", "aaa","bbb","ccc");
                Set<String> unionSet=jedis.sunion("redisSet","redisSet2");
                System.out.println("交集结果:"+unionSet);
                // 并集结果存入到另一个Set集合,并且只返回集合的数量
                System.out.println("并集结果存入unionSet集合:"+jedis.sunionstore("unionSet", "redisSet","redisSet2"));
                // (2)、交集
                Set<String> interSet=jedis.sinter("redisSet","unionSet");
                System.out.println("交集结果:"+interSet);
                // 交集结果存入到另一个Set集合,并且只返回集合的数量
                System.out.println("交集结果存入interSet集合:"+jedis.sinterstore("interSet", "redisSet","unionSet"));
                // (3)、差集
                Set<String> diffSet=jedis.sdiff("redisSet","redisSet2");
                System.out.println("差集结果:"+diffSet);
                // 差集结果存入到另一个Set集合,并且只返回集合的数量
                System.out.println("差集结果存入diffSet集合:"+jedis.sdiffstore("diffSet","redisSet","redisSet2"));
                // 6.spop():移除并且返回集合中的一个随机元素
                System.out.println(jedis.spop("diffSet"));
                // 7.srem():删除指定集合元素
                System.out.println(jedis.srem("unionSet", "aaa"));
                // 8.smove():将一个集合中的元素移入另一个集合中
                jedis.smove("redisSet", "redisSet2", "AAA");
                System.out.println("redisSet元素为:"+jedis.smembers("redisSet"));
                System.out.println("redisSet2元素为:"+jedis.smembers("redisSet2"));
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally{
                JedisPoolUtil.releaseConn(jedis);
            }
        }

    输出结果如下:

    image

    8、操作有序集合类型

        //操作有序集合(SortedSet)类型
        @Test
        public void operateSortedSet(){
            System.out.println("******对有序集合(SortedSet)的操作******");
            Jedis jedis=JedisPoolUtil.getJedis();
            try
            {
                //清空数据库(谨慎操作)
                System.out.println(jedis.flushDB());
                // 1.zadd():添加元素到有序集合
                jedis.zadd("scores", 69,"张三");
                jedis.zadd("scores", 83,"李四");
                jedis.zadd("scores", 73,"王五");
                //zadd()方法也有重载的传入map类型,分数是Double类型
                Map<String, Double> scoresMap=new HashMap<String, Double>();
                scoresMap.put("赵六", new Double(59));
                scoresMap.put("孙七", new Double(99));
                jedis.zadd("scores",scoresMap);
                // 2.zcard():返回集合中的元素个数
                System.out.println("有序集合中的个数:"+jedis.zcard("scores"));
                // 3.zrange():查询有序集合的元素
                System.out.println("按照分数从低到高查询zrange:"+jedis.zrange("scores", 0, -1));
                System.out.println("按照分数从高到低查询zrange:"+jedis.zrevrange("scores", 0, -1));
                // 4.zrangeWithScores():使用Set存储元组遍历元组内分数和元素
                Set<Tuple> sortSet=jedis.zrangeWithScores("scores", 0, -1);
                Iterator<Tuple>iterator=sortSet.iterator();
                while(iterator.hasNext()){
                    Tuple tuple=iterator.next();
                    System.out.println(tuple.getScore()+":"+tuple.getElement());
                }
                // 5.zrangeByScore():根据分数范围查询元素(60<=score<=100)
                Set<String> zrangeByScore=jedis.zrangeByScore("scores", new Double(60), new Double(100));
                System.out.print("查询分数范围在(60<=score<=100)之间的元素结果为:");
                for (Iterator<String> it=zrangeByScore.iterator();it.hasNext();)
                {
                    System.out.print(it.next()+" ");
                }
                System.out.println();
                // 6.zcount():查询指定分数范围内(60<=score<=100)zset键的元素个数
                long rangeCount=jedis.zcount("scores", 60, 100);
                System.out.println("分数范围在(60<=score<=100)之间键的元素个数:"+rangeCount);
                // 7.zrank():查询指定元素的下标,不存在则返回null
                long zrank=jedis.zrank("scores", "张三");
                System.out.println("查询指定元素的下标为:"+zrank);
                // 8.zscore():查询指定元素的分数,不存在则返回null
                Double zscore=jedis.zscore("scores", "张三");
                System.out.println("查询指定元素的分数为:"+zscore);
                // 9.zincrby():为有序集合的score分数添加一个增量
                Double zincrby=jedis.zincrby("scores", 99, "张三");
                System.out.println("增加后张三的score分数为:"+zincrby);
                // 10.zrem():删除指定元素
                jedis.zrem("scores", "张三");
                // 11.zremrangeByScore():根据分数范围删除元素
                jedis.zremrangeByScore("scores", 60, 80);
                System.out.println("集合的元素为:"+jedis.zrange("scores", 0, -1));
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally{
                JedisPoolUtil.releaseConn(jedis);
            }
        }

    输出结果如下:

    image

    参考资料:

    作者: 唐浩荣
    本文版权归作者和博客园共有,欢迎转载,但是转载需在博客的合适位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    致虚极守静笃
    DNS 透明代理
    Java“禁止”泛型数组
    Java和C#语法对比
    JVM 内存区域 (运行时数据区域)
    Java8 使用
    G1收集器的收集原理
    BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】
    数据结构之网络流入门(Network Flow)简单小节
    BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
  • 原文地址:https://www.cnblogs.com/tanghaorong/p/14357455.html
Copyright © 2020-2023  润新知