栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java使用Jedis操作Redis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java使用Jedis操作Redis

Java使用Jedis操作Redis 1.Jedis的介绍
  • java和redis打交道的API客户端
  • 可以想象,操作关系型数据库比如 MySQL 我们可以使用 JDBC,而操作 Redis 我们可以使用 Jedis
2.Java 项目使用 Jedis 2.1 我们新建一个 Maven 项目,添加 Maven 依赖


   redis.clients
   jedis
   3.1.0

2.2 编写 Java 代码 2.2.1 初始化 Jedis 连接对象
public class JedisDemo1 {

    // 获取 Jedis 对象
    private Jedis jedis = new Jedis("192.168.159.133", 6379);
}
2.2.2 测试Redis连接是否成功
public void ping(){
    String ping = jedis.ping();
    System.out.println("Redis 连接状态:" + ping);
}

2.2.3 Redis 通用基础操作
public void basicMethod(){
    // 查询所有
    System.out.println("=========[查询所有]=========");
    Set keys = jedis.keys("jedis*");
    for (String key : keys) {
        System.out.println("键:" + key + ", 键的类型:" + jedis.type(key) + ", 值:" + jedis.get(key));
    }
    // 设置键值对
    System.out.println("=========[设置键值对]=========");
    jedis.set("jedis1", "1");
    jedis.set("jedis2", "2");
    jedis.set("jedis3", "3");
    keys = jedis.keys("jedis*");
    for (String key : keys) {
        System.out.println("键:" + key + ", 键的类型:" + jedis.type(key) + ", 值:" + jedis.get(key));
    }
    // 判断键值对是否存在
    System.out.println("=========[判断键值对是否存在]=========");
    Boolean jedis1 = jedis.exists("jedis1");
    System.out.println("jedis1 键是否存在:" + jedis1);
    // 设置有效期限的键,获取 ttl 值
    System.out.println("=========[设置有效期限的键,获取 ttl 值]=========");
    jedis.set("expire1", "ttl key");
    jedis.expire("expire1", 60);
    try {
        Thread.sleep(5000); // 休眠 5 秒钟
    } catch (Exception e){
        System.out.println(e.getMessage());
    }
    System.out.println("休眠 5 秒钟之后,ttl 值为:" + jedis.ttl("expire1"));
    // 获取键的数量
    System.out.println("=========[获取键的数量]=========");
    Long aLong = jedis.dbSize();
    System.out.println("当前数据库中键的数量为:" + aLong);
    // 删除元素
    System.out.println("=========[删除元素]=========");
    jedis.del("jedis1", "jedis2", "jedis3");
}

2.2.4 String 类型操作方法
public void stringMethod(){
    // 设置有效时间的 string 键
    System.out.println("=========[设置有效时间的 string 键]=========");
    jedis.setex("string-ttl-1", 60, "string key");
    System.out.println("=========[键不存在设置,存在则失败]=========");
    Long setnx = jedis.setnx("string-ttl-1", "string key");
    if (setnx == 1L){
        System.out.println("setnx 设置键成功");
    } else {
        System.out.println("setnx 键设置失败");
    }
    // 同时设置多个键值对,并获取
    System.out.println("=========[同时设置多个键值对,并获取]=========");
    jedis.mset("string-1", "1", "string-2", "2", "string-3", "3");
    List mget = jedis.mget("string-1", "string-2", "string-3");
    System.out.println("获取到的多个值:" + mget.toString());
    // 对 数值型的 键值对进行增减操作
    System.out.println("=========[对 数值型的 键值对进行增减操作]=========");
    jedis.incr("string-1"); // 自增
    jedis.decr("string-2"); // 自减
    jedis.incrBy("string-3", 3L); // 指定自增
    mget = jedis.mget("string-1", "string-2", "string-3");
    System.out.println("获取到的多个值:" + mget.toString());
    // 返回旧的数据,更新新的数据
    System.out.println("=========[返回旧的数据,更新新的数据]=========");
    String new_data = jedis.getSet("string-ttl-1", "new data");
    System.out.println("string-ttl-1 键旧的数据为:" + new_data);
    // 对值进行字符串操作
    System.out.println("=========[对值进行字符串操作]=========");
    jedis.append("string-1", "-aaa"); // 追加内容
    Long strlen = jedis.strlen("string-1"); // 获取值的长度
    jedis.setrange("string-1", strlen - 1, "-set"); // 修改指定索引开始位置
    System.out.println("string-1 键的值为:" + jedis.get("string-1"));
    // 删除实验数据
    System.out.println("=========[删除实验数据]=========");
    jedis.del("string-1", "string-2", "string-3");
}

2.2.5 List 类型操作方法
public void listMethod(){
    // 从左侧和右侧 添加元素
    System.out.println("=========[从左侧和右侧 添加元素]=========");
    jedis.lpush("list-java-1", "Mike", "John", "Jack", "John", "Peter");
    jedis.rpush("list-java-1", "Jack", "Smith", "John");
    // 根据索引获取元素
    System.out.println("=========[根据索引获取元素]=========");
    String lindex = jedis.lindex("list-java-1", 1L);
    System.out.println("索引为 1 的元素为:" + lindex);
    // 更改对应索引的元素
    System.out.println("=========[更改对应索引的元素]=========");
    jedis.lset("list-java-1", 1L, "Amy");
    lindex = jedis.lindex("list-java-1", 1L);
    System.out.println("索引为 1 的元素为:" + lindex);
    // 根据元素在之前和之后插入元素
    System.out.println("=========[根据元素在之前和之后插入元素]=========");
    jedis.linsert("list-java-1", ListPosition.AFTER, "Amy", "list-after"); // 后插
    jedis.linsert("list-java-1", ListPosition.BEFORE, "Amy", "list-before"); // 前插
    // 获取所有元素
    System.out.println("=========[获取所有元素]=========");
    List lrange = jedis.lrange("list-java-1", 0, -1);
    System.out.println("元素数量:" + jedis.llen("list-java-1") + ", 所有元素:" + lrange.toString());
    // 删除指定数量的某元素
    System.out.println("=========[删除指定数量的某元素]=========");
    jedis.lrem("list-java-1", 2, "John");
    lrange = jedis.lrange("list-java-1", 0, -1);
    System.out.println("元素数量:" + jedis.llen("list-java-1") + ", 所有元素:" + lrange.toString());
    // 删除全部元素
    System.out.println("=========[删除全部元素]=========");
    jedis.ltrim("list-java-1", 0, 0); // 删除除第一个元素之外的所有元素
    jedis.lpop("list-java-1"); // 出栈最后一个元素
    lrange = jedis.lrange("list-java-1", 0, -1);
    System.out.println("元素数量:" + jedis.llen("list-java-1") + ", 所有元素:" + lrange.toString());
}

2.2.6 Set 集合操作方法
public void setMethod(){
    // 添加元素
    System.out.println("=========[添加元素]=========");
    jedis.sadd("set-java-user", "Mike", "John", "Jack", "John");
    jedis.sadd("set-java-user-2", "Amy", "John", "Jack", "Peter");
    jedis.sadd("set-java-address", "Beijing", "Shanghai", "Dalian", "Shenzhen");
    // 查询元素
    System.out.println("=========[查询元素]=========");
    Set userSet = jedis.smembers("set-java-user");
    System.out.println("用户set元素数量:" + userSet.size() + "用户的所有元素:" + userSet.toString());
    userSet = jedis.smembers("set-java-user-2");
    System.out.println("用户set 2 元素数量:" + userSet.size() + "用户的所有元素:" + userSet.toString());
    Set addressSet = jedis.smembers("set-java-address");
    System.out.println("地址set元素数量:" + addressSet.size() + "地址的所有元素:" + addressSet.toString());
    // 判断元素是否在 set 中
    System.out.println("=========[判断元素是否在 set 中]=========");
    System.out.println(jedis.sismember("set-java-user", "Smith")? "Smith 存在": "Smith 不存在");
    System.out.println(jedis.sismember("set-java-address", "Beijing")? "Beijing 存在": "Beijing 不存在");
    // 交集,并集,差集的计算
    System.out.println("=========[交集,并集,差集的计算]=========");
    Set sinter = jedis.sinter("set-java-user", "set-java-user-2"); // 交集
    Set sunion = jedis.sunion("set-java-user", "set-java-user-2"); // 并集
    Set sdiff = jedis.sdiff("set-java-user", "set-java-user-2"); // 差集
    System.out.println("交集:" + sinter.toString());
    System.out.println("并集:" + sunion.toString());
    System.out.println("差集:" + sdiff.toString());
    // 删除元素
    System.out.println("=========[删除元素]=========");
    jedis.srem("set-java-user-2", "Amy"); // 删除指定元素
    jedis.smove("set-java-user", "set-java-user-2", "Mike"); // 将元素进行移动
    jedis.spop("set-java-user", jedis.scard("set-java-user"));// 删除所有元素
    jedis.spop("set-java-user-2", jedis.scard("set-java-user-2")); // 删除所有元素
    jedis.spop("set-java-address", jedis.scard("set-java-address")); // 删除所有元素
}

2.2.7 sort set 操作方法(有序集合)
public void sortSet(){
    // 添加元素
    System.out.println("=========[添加元素]=========");
    Map hashMap = new LinkedHashMap<>();
    hashMap.put("不及格", 59.0);
    hashMap.put("及格", 69.0);
    hashMap.put("中等", 79.0);
    hashMap.put("良好", 89.0);
    hashMap.put("优秀", 99.0);
    hashMap.put("满分", 100.0);
    jedis.zadd("sortset-java-1", hashMap);
    // 查询元素
    System.out.println("=========[查询元素]=========");
    System.out.println("元素总数为:" + jedis.zcard("sortset-java-1"));
    System.out.println("优秀 分数为:" + jedis.zscore("sortset-java-1", "优秀"));
    System.out.println("及格人数为:" + jedis.zcount("sortset-java-1", 60, 100) + ", 上面的档次有:" + jedis.zrangeByScore("sortset-java-1", 60, 100).toString());
    System.out.println("中等人数为:" + jedis.zcount("sortset-java-1", 70, 100) + ", 上面的档次有:" + jedis.zrangeByScore("sortset-java-1", 70, 100).toString());
    System.out.println("良好人数为:" + jedis.zcount("sortset-java-1", 80, 100) + ", 上面的档次有:" + jedis.zrangeByScore("sortset-java-1", 80, 100).toString());
    System.out.println("优秀人数为:" + jedis.zcount("sortset-java-1", 90, 100) + ", 上面的档次有:" + jedis.zrangeByScore("sortset-java-1", 90, 100).toString());
    // 删除元素
    System.out.println("=========[删除元素]=========");
    jedis.zrem("sortset-java-1", "不及格"); // 单独删除一个元素
    jedis.zremrangeByScore("sortset-java-1", 60, 100); // 删除分数段的所有元素
}

2.2.8 Hash 操作方法
  • 此处涉及到了对象序列化的内容,所以使用到了 FastJSON工具包,需要添加依赖


    com.alibaba
    fastjson
    1.2.3

public void hashMethod(){
    // 模拟从数据库中读取大量用户数据,缓存到 redis 中
    List userList = new LinkedList<>();
    userList.add(new User(2022090101, "Mike", 21, "Beijing"));
    userList.add(new User(2022090102, "Peter", 24, "Shanghai"));
    userList.add(new User(2022090103, "Jack", 22, "Shenzhen"));
    userList.add(new User(2022090104, "云梦", 22, "Dalian"));
    userList.add(new User(2022090105, "归遥", 20, "Hangzhou"));
    // 将数据库中读取出来的数据进行处理,构建为 map
    Map userMap = new LinkedHashMap<>();
    for (User user: userList){
        userMap.put(String.valueOf(user.getId()), JSON.toJSONString(user));
    }
    // 增加数据(进行序列化)
    System.out.println("============[增加数据(进行序列化)]===========");
    jedis.hmset("hash-java-user", userMap);
    // 获取所有的键,值
    System.out.println("============[获取所有的键,值]===========");
    Set hkeys = jedis.hkeys("hash-java-user");
    System.out.println("所有的键:" + hkeys.toString());
    List hvals = jedis.hvals("hash-java-user");
    System.out.println("所有的值:" + hvals.toString());
    // 判断某个键是否存在
    System.out.println("============[判断某个键是否存在]===========");
    Boolean hexists = jedis.hexists("hash-java-user", "2022090101");
    System.out.println("2022090101 是否存在:" + hexists);
    hexists = jedis.hexists("hash-java-user", "2022090108");
    System.out.println("2022090108 是否存在:" + hexists);
    // 获取并修改某个键对应的值
    System.out.println("============[获取并修改某个键对应的值]===========");
    if (jedis.hexists("hash-java-user", "2022090101")){
        String hget = jedis.hget("hash-java-user", "2022090101");
        User user = JSON.parseObject(hget, User.class);
        System.out.println("2022090101 对应的数据为:" + user.toString());
        user.setAge(30);
        user.setAddress("Guangzhou");
        jedis.hset("hash-java-user", "2022090101", JSON.toJSONString(user));
    } else {
        System.out.println("2022090101 对应的数据为 null");
    }
    // 获取所有键值对
    System.out.println("============[获取所有键值对]===========");
    Map newUserMap = jedis.hgetAll("hash-java-user");
    System.out.println("元素数量:" + jedis.hlen("hash-java-user"));
    Set> entries = newUserMap.entrySet();
    for (Map.Entry entry: entries){
        System.out.println("键:" + entry.getKey() + ", 值:" + entry.getValue());
    }
    // 删除元素
    System.out.println("============[删除元素]===========");
    jedis.hkeys("hash-java-user").forEach(key -> jedis.hdel("hash-java-user", key));
}

2.2.9 事务操作方法
public void multiMethod(){
    // 模拟转账操作(模拟 Mike,Jack用户各有 100 元)
    jedis.set("Mike", "100");
    jedis.set("Jack", "100");
    // 进行转账操作(转账 20 元)
    int transfer = 20;
    String mike = jedis.get("Mike");
    Transaction transaction = jedis.multi();
    try{
        // 判断余额是否足以转出
        if (Integer.parseInt(mike) >= transfer){
            transaction.decrBy("Mike", (long) transfer); // 转出
            transaction.incrBy("Jack", (long) transfer); // 转入
            transaction.exec(); // 提交事务
            System.out.println("双方转账成功");
        } else {
            System.out.println("Mike 账户余额不足,转账失败");
        }
    } catch (Exception e){
        System.out.println("转账过程中出现异常:" + e.getMessage());
        transaction.discard(); // 回滚
    } finally {
        transaction.close();
    }
    System.out.println("转账后双方余额:Mike:" + jedis.get("Mike") + ", Jack: " + jedis.get("Jack"));
    // 删除测试数据
    jedis.del("Mike", "Jack");
}

3.总结

以上就是 Jedis 操作 Redis的基本操作,五大数据类型,事务的所有方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/978180.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号