NoSQL数据库原理与应用综合项目——Redis篇

news2024/11/24 23:09:52

NoSQL数据库原理与应用综合项目——Redis篇

文章目录

  • NoSQL数据库原理与应用综合项目——Redis篇
    • 0、 写在前面
    • 1、本地数据或HDFS数据导入到Redis
    • 2、Redis数据库表操作
      • 2.1 Java API 连接Redis
      • 2.2 查询数据
      • 2.3 插入数据
      • 2.4 修改数据
      • 2.5 删除数据
    • 3、Windows远程连接Redis(Linux)
    • 4、数据及源代码
    • 5、总结


在这里插入图片描述


0、 写在前面

  • Windos版本:Windows10
  • Linux版本:Ubuntu Kylin 16.04
  • JDK版本:Java8
  • Hadoop版本:Hadoop-2.7.1
  • HBase版本:HBase-1.1.5
  • Zookeepr版本:使用HBase自带的ZK
  • Redis版本:Redis-3.2.7
  • MongoDB版本:MongoDB-3.2.7
  • Neo4j版本:Neo4j-3.5.12 Community
  • IDE:IDEA 2020.2.3
  • IDE:Pycharm 2021.1.3

1、本地数据或HDFS数据导入到Redis

  • 代码:

使用哈希键值对的方式,每条数据的id字段作为key,所有属性字段作为value

在这里插入图片描述

  • 运行成功图示:

顺利插入13518条数据

图片

  • 结果图:

查询key为13518的数据是否存在

图片

2、Redis数据库表操作

2.1 Java API 连接Redis

pom.xml文件引入redis.clients组下的jedis

  • 代码:
private static String HOST = "10.125.0.15";
private static int PORT = 6379;
private static String PWD = "redis_password";
private static Jedis jedis = null;
private static JedisPool jedisPool = null;
    
/**
 * TODO 初始化Redis连接池
 */
public static void init() {
    if (jedis == null) {
        jedis = new Jedis(HOST, PORT);
        jedis.auth(PWD);
    }
    if (jedis != null) {
        System.out.println("Redis连接成功");
    } else {
        System.out.println("Redis连接失败");
    }
}

2.2 查询数据

  • 查询匹配的key

正则表达式匹配key,使用迭代器Iterator遍历输出查询到的匹配的key的数据

/**
 * TODO 查询某个匹配key
 * @param pattern
 */
public static void queryKey(String pattern) {
  Set<String> keys = jedis.keys(pattern);
  int cnt = 0;
  boolean flag = true;
  int size = keys.size();
  Iterator<String> iterator = keys.iterator();
  System.out.println("经查询匹配到的key有" + size + "个");
  if (size <= 10) {
      System.out.println("分别为:");
      for (String key : keys) {
          System.out.print(key + " ");
      }
      System.out.println();
  } else {
      System.out.println("前5个key分别为:");
      while (iterator.hasNext() && flag) {
          String key = iterator.next();
          cnt++;
          System.out.print(key + " ");
          if (cnt > 5) {
              flag = false;
          }
      }
      System.out.println();
      System.out.println("后5个key分别为:");
      for (int i = 0; i < 5; i++) {
          String key = (String) keys.toArray()[size - i - 1];
          System.out.print(key + " ");
      }
      System.out.println();
  }
}

图片

  • 查询指定key的值

使用Map来存储查询key的结果,最后遍历map的entrySet输出结果信息

/**
 * TODO 查询指定key的值
 * @param key
 */
public static void queryByKey(String key) {
    Boolean vis = jedis.exists(key);
    if (vis) {
        Map<String, String> valueMap = jedis.hgetAll(key);
        int size = valueMap.size();
        System.out.println("键为" + key + "的查询大小为:" + size);
        System.out.println("键为" + key + "的查询结果为:");
        System.out.println("{");
        for (Map.Entry<String, String> entry : valueMap.entrySet()) {
            if (size == 1) {
                System.out.println("\t[" + entry.getKey() + "," + entry.getValue() + "]");
            } else {
                System.out.println("\t[" + entry.getKey() + "," + entry.getValue() + "],");
            }
            size--;
        }
        System.out.println("}");
    } else {
        System.out.println("你所查询的key不存在!");
    }
    jedis.close();
}

图片

  • 查询指定key和属性的值

要查询的key,field作为参数传入query()

/**
 * TODO 查询指定key和指定属性的值
 * @param key
 * @param field
 */
public static void query(String key, String field) {
    Boolean vis = jedis.exists(key);
    if (vis) {
        String value = jedis.hget(key, field);
        if ("".equals(value)) {
            System.out.println("键为" + key + "不存在"  + "属性" + field);
        } else {
            System.out.println("键为" + key + "的" + field + "属性值为:" + value);
        }
    } else {
        System.out.println("你所查询的key不存在!");
    }
    jedis.close();
}

图片

2.3 插入数据

  • 插入一条数据

要插入的key,field,value作为参数传入putOne()

/**
 * TODO 新增一条数据
 */
public static void putOne(String key, String field, String value) {
    jedis.hset(key, field, value);
    String values = jedis.hget(key, field);
    System.out.println("新增了一条键为" + key + ",属性为" + field + "值为:" + values + "的数据");
    jedis.close();
}

图片

在这里插入图片描述

  • 插入多条数据

要插入的key以数组的形式存储,其他属性值以List<Map<String, String>>的结构存储,并作为参数传入putMulti()

/**
 * TODO 新增多条数据
 * @param keysArr
 * @param fieldValues
 */
public static void putMulti(String[] keysArr, List<Map<String, String>> fieldValues) {
    int length = keysArr.length;
    for (int i = 0; i < keysArr.length; i++) {
        jedis.hmset(keysArr[i], fieldValues.get(i));
    }
    System.out.println("数据新增成功!");
    jedis.close();
}

图片

在这里插入图片描述
在这里插入图片描述

2.4 修改数据

  • 修改name属性

要修改的条件key,field,value作为参数传入modifyData()

/**
 * TODO 修改数据
 * @param key
 * @param value
 * @return
 */
public static boolean modifyData(String key, String field, String value) {
    if (jedis.exists(key)) {
        jedis.hset(key, field, value);
        if (value.equals(jedis.hget(key, field))) {
            System.out.println("键为" + key + ",属性为" + field + "的数据" + "修改成功!");
            jedis.close();
            return true;
        } else {
            System.out.println("修改数据失败");
            jedis.close();
            return false;
        }
    } else {
        System.out.println(key + "不存在");
        jedis.close();
        return false;
    }
}

在这里插入图片描述

在这里插入图片描述

2.5 删除数据

  • 根据key删除数据

要删除的条件key作为参数传入deleteOne()

/**
 * TODO 根据key删除数据
 * @param key
 */
public static boolean deleteOne(String key) {
    if (jedis.exists(key)) {
        if (jedis.del(key) == 1) {
            System.out.println("成功删除1条数据!");
            jedis.close();
            return true;
        } else {
            System.out.println("删除数据失败");
            jedis.close();
            return false;
        }
    } else {
        System.out.println("删除的key[" + key + "]不存在!");
        jedis.close();
        return false;
    }
}

在这里插入图片描述

在这里插入图片描述

  • 删除指定key和field的数据

要删除的条件key和field作为参数传入deleteField()

/**
 * TODO 删除指定key和field的数据
 * @param key
 * @param field
 */
public static void deleteField(String key, String field) {
    if (jedis.exists(key)) {
        if (jedis.hdel(key, field) != 0) {
            System.out.println("成功删除key为" + key + ",属性为" + field + "的这条数据!");
        } else {
            System.out.println("删除数据失败,不存在" + field + "这个属性!");
        }
    } else {
        System.out.println("删除的key[" + key + "]不存在!");
    }
    jedis.close();
}

删除前数据:

tp

删除操作:
tp

删除后数据:

tp

  • 删除一组key的数据

要删除的key以数组的形式传入deleteMutli()

/**
 * TODO 删除一组key的数据
 * @param keys
 * @return
 */
public static void deleteMutli(String[] keys) {
    boolean[] deleted = new boolean[keys.length];
    for (int i = 0; i < keys.length; i++) {
        String key = keys[i];
        if (jedis.exists(key)) {
            jedis.del(key);
            deleted[i] = true;
        }
        jedis.close();
    }
    int deleteSize = 0;
    for (boolean b : deleted) {
        if (b) {
            deleteSize++;
        }
    }
    if (deleteSize >= 1) {
        System.out.print("成功删除了" + deleteSize + "条数据,删除的key分别是:");
        int size = deleteSize;
        for (int i = 0; i < keys.length; i++) {
            if (deleted[i]) {
                if (size == 1) {
                    System.out.println(keys[i]);
                } else {
                    System.out.print(keys[i] + ", ");
                }
                size--;
            }
        }
    } else {
        System.out.println("这组要删除的key不存在!");
    }
}

tp

在这里插入图片描述

在这里插入图片描述

3、Windows远程连接Redis(Linux)

Redis的相关配置文件需要提前设置正确,最主要的就是ip地址、auth的设置,同时要注意防火墙是否关闭。

参考链接:

https://blog.csdn.net/m0_52735414/article/details/128188140

4、数据及源代码

  • Github

  • Gitee

5、总结

由于数据量只有1万多条,将数据导入Redis并不麻烦,直接使用Python读取数据表,设置好key和value,并用hset()导入即可。

主要的方法如下:

  • exists()
  • del()
  • hdel()
  • hset()
  • hmset()
  • hget()
  • hgetAll()
  • close()

结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谁说女生不可以学编程?维密超模放弃年薪千万,一心只当程序媛

说到IT行业&#xff0c;大家第一反应应该是程序员 谁说女生不可以学编程&#xff1f;维密超模放弃年薪千万&#xff0c;一心只当程序媛 感觉一说起IT工作者 大家都会想到一个男性的形象 但是其实 有一批脸美、胸大、腰细、腿长、还都热爱编程的妹纸正在加入你们的行列&#…

(附源码)Springboot宠物领养系统 毕业设计 241104

Springboot宠物领养系统 摘 要 如今&#xff0c;随着人们生活水平不断提高&#xff0c;人们的生活在物质满足的基础上&#xff0c;更多的人将生活的重点放在追求精神享受的过程中。于此同时&#xff0c;Internet铺天盖地的普及&#xff0c;使得这样的人纷纷通过Internet的方式去…

springboot 3.0 工程建立

springboot 3.0 工程建立 脚手架搭建 进入spring官网提供的https://start.spring.io/进行脚手架搭建。 选择 Maven进行包管理&#xff0c;语言选择JAVA&#xff0c;Spring Boot 版本选择3.0.0&#xff0c;JDK 版本选择17。并在右侧选择自己希望的依赖。结果如下图&#xff1…

基于SpringMVC+Hibernate+Layui城市智能消防决策平台设计

开发软件&#xff1a;Eclipse,可以用idea,mysql数据库 开发技术&#xff1a;SpringMVC,Spring,Hibernate,jquery,layui 本系统的功能主要分为两个角色&#xff0c;其中用户的功能有&#xff1a;登陆注册&#xff0c;查看火灾案例&#xff0c;火警报警&#xff0c;查看自己的报警…

【产品经理必备文档】述职报告/年终总结汇报ppt模板

今天和大家免费分享产品必备文档模板——产品经理述职文档&#xff08;年终总结汇报&#xff09;的ppt模板~~~ 【文档下载】 这个ppt模板可以在下方小程序里免费下载哦 【编写教程】 个人工作年终总结一般分成4部门&#xff1a;个人岗位职责、工作完成情况、年度经验总结、 1…

北语、北外2022年12月公派英语统考的通知

近日&#xff0c;北语和北外均发布了12月29日国家公派英语高级班结业统考的通知。与以往不同的是&#xff1a;为无法参加12月29日统考的学员增加一次考试机会&#xff0c;时间定于2023年2月25日&#xff0c;但需要提前报名。具体报名时间及方式参见两校的通知&#xff0c;知识人…

17_ 数据库 _ MySQL主从同步配置

文章目录一、主从同步的定义二、使用主从同步的好处三、主从同步的机制四、配置主从同步的基本步骤五、详细配置主从同步的方法5.1 备份主服务器原有数据到从服务器5.1.1 主服务器Ubuntu上进行备份5.1.2 在从服务器Windows上进行数据还原5.2 配置主服务器master&#xff08;Ubu…

单商户商城系统功能拆解48—应用中心—消息通知

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

JUC(九)-线程池-认识JDK中的线程池

JUC、线程池相关内容 文章目录JUC、线程池相关内容一、 什么是线程池1.1 为什么要使用线程池二、 JDK 自带的线程池2.1 newFixedThreadPool方法2.2 newSingleThreadPool方法2.3 newCachedTreadPool方法2.4 newScheduleTreadPool方法2.4.5 Executors Demo2.5 newWorkStealingTre…

搞机器学习不会线性代数?那怎么行

搞机器学习不会线性代数&#xff1f;那怎么行&#xff01; 文章目录搞机器学习不会线性代数&#xff1f;那怎么行&#xff01;1 直观真正理解向量2 理解向量的加法与数乘3 理解向量乘法的本质3.1 向量内积3.2 向量外积4 理解基向量与线性无关4.1 如何理解基向量4.2 如何理解线性…

刷完了这份足足485页的“1000道Java工程师面经”,成功上岸!

前言 本人18年毕业于一家普通二本&#xff0c;考研凉了且没有实习经验&#xff0c;只做过两个项目会一点SpringBoot&#xff0c;每天就是不断地投简历、刷面经&#xff0c;感觉自己都要抑郁了 最后勉强进入了一家学校合作的外包公司干了3年的CRUD&#xff0c;刚开始每个月拿着…

当一个人学习编程之后,带来的人生有什么新变化?

数字化迅速蔓延的世界里&#xff0c;拥有技术技能&#xff08;特别是编程技能&#xff09;可以为你提供更多更好的个人发展机会。在这里&#xff0c;两位半路转行的程序员给你解释了为什么任何人都应该学习编写代码。因为&#xff0c;学习编程既然改变了他们的生活&#xff0c;…

Transformers学习笔记2. HuggingFace数据集Datasets

Transformers学习笔记2. HuggingFace数据集Datasets一、简介二、操作1. 下载数据集2. 常用函数&#xff08;1&#xff09;排序&#xff08;2&#xff09;打乱顺序&#xff08;3&#xff09;选择函数&#xff08;4&#xff09;过滤&#xff08;5&#xff09;切分数据集&#xff…

图书管理网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;老师模块、班级模块、学生模块、课程模块、试题模块、试卷模块、 组卷模块、考试模块、答题模块 管…

第十五章项目1——水果管理系统

文章目录目的从需求开始出发从数据库和数据库连接开始——DAO层对应数据库和数据表的创建项目优化——Mybatis等框架思路引入关于Servlet的编写项目优化——MVC思路引入项目优化——ViewBaseServlet模板引擎的引入项目优化——dispatcherServlet引入项目优化——Service层引入项…

【图像去噪】即插即用法图像去噪【含Matlab源码 152期】

⛄一、简介 理论知识参考文献&#xff1a;基于Retinex和ADMM优化的水下光照不均匀图像增强算法 ⛄二、部分源代码 function out PlugPlayADMM_deblur(y,h,lambda,method,opts) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %out PlugPlayADMM_deblur(y,h,lambda,method,opt…

19-Mysql执行原理之索引合并详解

Mysql执行原理之索引合并详解 我们前边说过MySQL在一般情况下执行一个查询时最多只会用到单个二级索引&#xff0c;但存在有特殊情况&#xff0c;在这些特殊情况下也可能在一个查询中使用到多个二级索引&#xff0c;MySQL中这种使用到多个索引来完成一次查询的执行方法称之为&…

day24【代码随想录】平衡二叉树、二叉树的所有路径、路径总和||、路径总和、求根节点到叶节点数字之和

文章目录前言一、平衡二叉树&#xff08;力扣110&#xff09;二、二叉树的所有路径&#xff08;力扣257&#xff09;1、递归法2、迭代法三、路径总和 II&#xff08;力扣113&#xff09;四、路径总和&#xff08;力扣112&#xff09;五、求根节点到叶节点数字之和&#xff08;力…

【图像配准】SIFT图像配准【含Matlab源码 1007期】

⛄一、SIFT配准简介 SIFT即尺度不变特征变换&#xff0c;是用于图像处理领域的一种描述。这种描述具有尺度不变性&#xff0c;可在图像中检测出关键点&#xff0c;是一种局部特征描述子。 1 SIFT算法特点&#xff1a; &#xff08;1&#xff09;具有较好的稳定性和不变性&…

[附源码]计算机毕业设计Node.js博客管理系统(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…