• 使用Java操作Redis


    要在Java程序中操作Redis可以使用Jedis开源工具。

    一、jedis的下载
    如果使用Maven项目,可以把以下内容添加到pom中



        redis.clients
        jedis
        4.3.1

    也可以在maven仓库中下载需要的jar文件,除了jedis.jar以外,还要下载对应的依赖包

    1、jedis下载地址:

    https://mvnrepository.com/artifact/redis.clients/jedis/4.3.1


    2、依赖下载

    在下载页面的下方有依赖项的列表,在对应的链接上右键,选择”在新的标签中打开链接“,如果对应的页面不有jar的链接,可以点击”View All“,进入到子页面中去下载。


    gson是必须的依赖,用于内部json数据的操作

    如果要使用JedisPoolConfig,则必须添加commons-pool2和slf4j-api,没有commons-pool2无法配置池的参数,而没有slf4j-api在运行时会抛异常。

    下载后把五个Jar包添加到项目中去

    二、jedis使用
        说明:本示例全部使用junit4

    1、redis的连接和关闭

    //连接redis
    Jedis j = new Jedis("localhost", 6379);
    //密码
    j.auth("123456");
    //切换到数据库9
    j.select(8);

    //关闭连接
    j.close();

    从以下示例可以看出,jedis操作redis时方法的名称与redis的命令一致。因此对于掌握了redis操作的人员jedis会很容易上手

    2、添加一个字符串的值

    //连接redis
    Jedis j = new Jedis("localhost", 6379);
    //密码
    j.auth("123456");
    //切换到数据库9
    j.select(8);
    //清空当前数据库中的数据
    j.flushDB() ;
    //添加字符串的值
    j.set("key1".getBytes("utf-8"), "value1".getBytes("utf-8"));
    //关闭连接
    j.close();

    redis的默认编码为utf-8,但应用程序的编码不一定一致,如果直接使用字符串进行操作,可以在多个系统中访问时由于编码不一致而出现乱码,因此建议key和值都以utf-8编码转换成字节数组进行添加

    3、获取字符串的值

    Jedis j = new Jedis("localhost", 6379);
    j.auth("123456");
    j.select(8);
    //根据key获取值
    byte[] bys = j.get("key1".getBytes("utf-8"));
    //输出结果
    System.out.println(new String(bys,"utf-8"));

    j.close();

    取出时按存入时的编码还原成字符串即可

    4、事务处理

    Jedis j = new Jedis("localhost", 6379);
    j.auth("123456");
    j.select(8);
    //监听
    j.watch("str2".getBytes("utf-8"),"value2".getBytes("utf-8"));
    //开启事务
    Transaction t = j.multi();
    //添加多条数据
    t.set("str2".getBytes("utf-8"),"value2".getBytes("utf-8"));
    t.set("str3".getBytes("utf-8"),"value3".getBytes("utf-8"));
    //执行事务
    t.exec();

    j.close();

    6、list查询的执行

        当在事务中执行查询时,会反回一个Response对象,此对象的操作必须在事务结束后执行。

    示例

    Transaction t = j.multi();
    //在事务中必须使用事务对象执行相关方法
    t.lpush(toBys("lkey1"),
                  toBys("val1"),toBys("val2"));

    Response> res = t.lrange(toBys("lkey1"), 0 ,-1);

    t.exec();//执行事务

    //从响应中获取查询结果,必须在事务完成之后执行
    List list = res.get();
    for (byte[] bytes : list) {
          System.out.println(new String(bytes,"utf-8"));
    }
            //关闭连接
    j.close();

    6、使用默认连接池创建连接

    //使用默认配置创建连接池
    JedisPool pool = new JedisPool("localhost", 6379);
    //从池中取出连接
    Jedis j = pool.getResource();

    //把连接交还给池
    j.close();

    //关闭池,释放所有连接
    pool.close();
    7、使用连接池配置创建连接池

    JedisPoolConfig conf = new JedisPoolConfig();

    //最大空闲连接数
    conf.setMaxIdle(10);
    //最大连接数
    conf.setMaxTotal(100);
    //最小空闲数
    conf.setMinIdle(2);

    //使用配置对象创建连接池
    JedisPool pool = new JedisPool(conf,"localhost", 6379);

    常用的配置如下

    1)maxActive

        控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。

    2)maxIdle

        控制一个pool最多有多少个状态为idle(空闲)的jedis实例;

    3)whenExhaustedAction

        表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。

    WHEN_EXHAUSTED_FAIL –> 表示无jedis实例时,直接抛出NoSuchElementException;

    WHEN_EXHAUSTED_BLOCK –> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;

    WHEN_EXHAUSTED_GROW –> 则表示新建一个jedis实例,也就说设置的maxActive无用;

    4)maxWait

        表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;

    5)testOnBorrow

        获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;

    6)testOnReturn

        return 一个jedis实例给pool时,是否检查连接可用性(ping());

    7)testWhileIdle

        如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

    8)timeBetweenEvictionRunsMillis

        表示idle object evitor两次扫描之间要sleep的毫秒数;

    9)numTestsPerEvictionRun

        表示idle object evitor每次扫描的最多的对象数;

    10)minEvictableIdleTimeMillis

    表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;

    11)softMinEvictableIdleTimeMillis

        在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;

    12)lifo

        borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;

    8、使用属性配置文件配置池参数

    在项目的根下面添加属性配置文件redis.properties

    max-total=10
    max-idle=4
    min-idle=0

    在java中读取配置文件并添加到配置对象中

    //创建属性配置文件解析对象
    Properties pro = new Properties();
    //解析属性配置文件
    pro.load(Class.class.getResourceAsStream("/redis.properties"));

    //创建连接池配置对象
    JedisPoolConfig conf = new JedisPoolConfig();
    //注入配置参数
    conf.setMaxTotal(Integer.parseInt(pro.getProperty("max-total")));
    conf.setMaxIdle(Integer.parseInt(pro.getProperty("max-idle")));
    conf.setMinIdle(Integer.parseInt(pro.getProperty("min-idle")));

     文章来源于哔站《使用Java操作Redis

    更多学习视频和专栏文章请到哔站个人空间: 布道师学院的个人空间-布道师学院个人主页-哔哩哔哩视频

    更多资源和项目下载请到:”开源吧(找实战项目和毕设项目的好网站)“ ​ :开源吧

  • 相关阅读:
    新能源汽车行业资讯-2022-9-11
    Mellanox cx4 驱动总结
    开源大模型正在“杀死”闭源?
    竞赛——【蓝桥杯】2022年11月第十四届蓝桥杯模拟赛第一期Java
    详解Java NIO,IO与NIO的区别
    word办公小技巧:方框打勾、上下标、横隔线、排序
    使用sqlmap总是提示需要302跳转重新登录的解决方法
    JavaWeb_第5章_JSP
    瞬态抑制二极管TVS的核心参数?|深圳比创达电子EMC(下)
    开通5G网络服务三个月,中国广电交出了什么样的答卷?
  • 原文地址:https://blog.csdn.net/ouyangqing/article/details/133512989