菜鸟笔记
提升您的技术认知

Day5、Java操作Redis

阅读 : 1200

1、Redis的Java客户端

Redis的Java客户端也有很多: https://redis.io/clients#java,其中比较受欢迎的是Jedis和Lettuce。

  • Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接,官方推荐。 https://mvnrepository.com/search?q=jedis
  • Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为
    StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
  • 在SpringBoot Data Redis 1.x之前默认使用的是Jedis,但目前最新版的修改成了Lettuce。
  • 之前公司使用Jedis居多,Lettuce近两年在逐步上升,总的来讲Jedis的性能会优于Lettuce(因为它是直接操作Redis)。

JedisTest.java

package com.xiao;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Set;

public class JedisTest {
  

    Jedis jedis = null;

    // 建立连接
    @Before
    public void init() {
  
        // 初始化 Jedis 客户端,声明主机和端口
        jedis = new Jedis("192.168.65.3", 6379);
        // 身份认证
        jedis.auth("123456");
        // PING PONG 心跳机制检测是否连接成功
        String pong = jedis.ping();
        System.out.println("pong = " + pong);
    }

    @Test
    public void testString() {
  
        //选择数据库
        jedis.select(2);
        //插入一条数据
        String result = jedis.set("username", "xiao");
        System.out.println("result = " + result);
        //获取一条数据
        String username = jedis.get("username");
        System.out.println("username = " + username);
    }

    @Test
    public void testKeys() {
  
        jedis.select(2);
        Set keys = jedis.keys("*");
        System.out.println(keys);
    }
    // 释放资源
    @After
    public void close(){
  
        if (jedis != null) {
  
            jedis.close();
        }
    }

}

JedisPoolConnectRedis.java

package com.xiao;

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

// 连接池工具类
public class JedisPoolConnectRedis {
  

        private static JedisPool jedisPool;

        static {
  
            // 创建连接池配置对象
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            // 设置最大连接数,默认8
            jedisPoolConfig.setMaxTotal(5);
            // 设置最大空闲数量,默认8
            jedisPoolConfig.setMaxIdle(5);
            // 设置最小空闲数量,默认0
            jedisPoolConfig.setMinIdle(0);
            // 设置等待时间 ms
            jedisPoolConfig.setMaxWaitMillis(100);
            // 初始化 JedisPool 对象
            jedisPool = new JedisPool(jedisPoolConfig,
                    "192.168.65.3", 6379,
                    100,"123456");
        }
        /**
        * 获取Jedi对象
        * @return
        */
        public  static Jedis getJedis() {
  
            return jedisPool.getResource();
        }
}

2、 环境准备

2.1、 引入依赖



  redis.clients
  jedis
  2.9.0

2.2、创建jedis对象

 public static void main(String[] args) {
  
   //1.创建jedis对象
   Jedis jedis = new Jedis("192.168.40.4", 6379);//1.redis服务必须关闭防火墙  2.redis服务必须开启远程连接
   jedis.select(0);//选择操作的库默认0号库
   //2.执行相关操作
   //....
   //3.释放资源
   jedis.close();
 }

3、常用API

3.1、操作key相关API

private Jedis jedis;
    @Before
    public void before(){
  
        this.jedis = new Jedis("192.168.202.205", 7000);
    }
    @After
    public void after(){
  
        jedis.close();
    }

    //测试key相关
    @Test
    public void testKeys(){
  
        //删除一个key
        jedis.del("name");
        //删除多个key
        jedis.del("name","age");

        //判断一个key是否存在exits
        Boolean name = jedis.exists("name");
        System.out.println(name);

        //设置一个key超时时间 expire pexpire
        Long age = jedis.expire("age", 100);
        System.out.println(age);

        //获取一个key超时时间 ttl
        Long age1 = jedis.ttl("newage");
        System.out.println(age1);

        //随机获取一个key
        String s = jedis.randomKey();

        //修改key名称
        jedis.rename("age","newage");

        //查看可以对应值的类型
        String name1 = jedis.type("name");
        System.out.println(name1);
        String maps = jedis.type("maps");
        System.out.println(maps);
    }

3.2、操作String相关API

//测试String相关
    @Test
    public void testString(){
  
        //set
        jedis.set("name","小陈");
        //get
        String s = jedis.get("name");
        System.out.println(s);
        //mset
        jedis.mset("content","好人","address","海淀区");
        //mget
        List mget = jedis.mget("name", "content", "address");
        mget.forEach(v-> System.out.println("v = " + v));
        //getset
        String set = jedis.getSet("name", "小明");
        System.out.println(set);

        //............
    }

3.3、操作List相关API

//测试List相关
    @Test
    public void testList(){
  

        //lpush
        jedis.lpush("names1","张三","王五","赵柳","win7");

        //rpush
        jedis.rpush("names1","xiaomingming");

        //lrange

        List names1 = jedis.lrange("names1", 0, -1);
        names1.forEach(name-> System.out.println("name = " + name));

        //lpop rpop
        String names11 = jedis.lpop("names1");
        System.out.println(names11);

        //llen
        jedis.linsert("lists", BinaryClient.LIST_POSITION.BEFORE,"xiaohei","xiaobai");

        //........

    }

3.4、操作Set的相关API

//测试SET相关
@Test
public void testSet(){
  

  //sadd
  jedis.sadd("names","zhangsan","lisi");

  //smembers
  jedis.smembers("names");

  //sismember
  jedis.sismember("names","xiaochen");

  //...
}

3.5、 操作ZSet相关API

//测试ZSET相关
@Test
public void testZset(){
  

  //zadd
  jedis.zadd("names",10,"张三");

  //zrange
  jedis.zrange("names",0,-1);

  //zcard
  jedis.zcard("names");

  //zrangeByScore
  jedis.zrangeByScore("names","0","100",0,5);

  //..

}

3.6、 操作Hash相关API

//测试HASH相关
@Test
public void testHash(){
  
  //hset
  jedis.hset("maps","name","zhangsan");
  //hget
  jedis.hget("maps","name");
  //hgetall
  jedis.hgetAll("mps");
  //hkeys
  jedis.hkeys("maps");
  //hvals
  jedis.hvals("maps");
  //....
}