JavaWeb之Redis

31、Redis

31.1、Redis概述

概念:redis是一款高性能的NOSQL系列的非关系性数据库

什么是NOSQL
NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

NOSQL和关系型数据库比较
优点:

  1. 成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
  2. 查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
  3. 存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
  4. 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。

缺点:

  1. 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。

  2. 不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。

  3. 不提供关系型数据库对事务的处理。

非关系型数据库的优势:

  1. 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
  2. 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势:

  1. 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  2. 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。

总结
关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据

主流的NOSQL产品
• 键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化
• 列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
• 文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法
• 图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:

  1. 字符串类型 string
  2. 哈希类型 hash
  3. 列表类型 list
  4. 集合类型 set
  5. 有序集合类型 sortedset

redis的应用场景

  • 缓存(数据查询、短连接、新闻内容、商品内容等等)
  • 聊天室的在线好友列表
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(可以精确到毫秒)
  • 分布式集群架构中的session分离

31.2、下载安装

官网:https://redis.io

中文网:http://www.redis.net.cn/

解压直接可以使用:

  • redis.windows.conf:配置文件
  • redis-cli.exe:redis的客户端
  • redis-server.exe:redis服务器端

31.3、命令操作

31.3.1、redis的数据结构

redis的数据结构:

redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构

  • value的数据结构:
    1. 字符串类型 String
    2. 哈希类型 hash:map格式
    3. 列表类型 list:linkedlist格式
    4. 集合类型 set
    5. 有序集合类型 sortedset

在这里插入图片描述

31.3.2、字符串类型

字符串类型 String

  1. 存储:set key value

    set username zhangsan

  2. 获取:get key 返回键对应的值

    get username

  3. 删除:del key

    del username

31.3.3、哈希类型

哈希类型hash

  1. 存储:hset key field value

    hset myhash username lisi

  2. 获取:

    hget key field:获取指定的field对象的值

    hget myhash username

    返回值:lisi

    hgetall key:获取所有的field和value

    hgetall myhash

    返回值:

    username

    lisi

    password

    123

  3. 删除:hdel key field

    hdel myhash username

31.3.4、列表类型

列表类型list:简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

  1. 存储:
    1. lpush key value:从左边存入列表
    2. rpush key value:从右边存入列表
  2. 获取:
    • lrange key start end:返回获取
  3. 删除:
    • lpop key:从列表的最左边移除一个元素,并将元素返回
    • rpop key:从列表的最右边移除一个元素,并将元素返回

在这里插入图片描述

31.3.5、集合类型

集合类型 set :不允许重复元素

  1. 存储:sadd key value
  2. 获取:smembers key:获取set集合中所有的元素
  3. 删除:srem key value:删除set集合中的某个元素

31.3.6、有序集合类型

有序集合类型:sortedset:不允许重复元素,且元素有顺序

  1. 存储:zadd key score value score:就是一个分数可以是任意值
  2. 获取:zrange key start end
    1. 获取所有的值zrange key 0 -1
    2. 获取所有的值和分数zrange key 0 -1 withscores
  3. 删除:zrem key value

31.3.7、通用命令

  1. keys *:查询所有的键
  2. type key:获取键对应的value的类型
  3. del key:删除指定的key value

31.4、redis持久化

redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘文件中。

redis持久化机制:RDB、AOF

31.4.1、RDB持久化机制

RDB:默认方式,不需要进行配置,默认就是使用这种机制

  • 在一定的间隔时间中,检测key的变化情况,然后持久化
  1. 编辑redis.windwos.conf文件

    save 900 1:每15分钟后有一个键发生改变就持久化一次

    save 300 10:每5分钟后有十个键发生改变就持久化一次

    save 60 10000:每1分钟有一万个键发生改变就持久化一次

  2. 通过cmd命令行的方式重启redis服务器,并制定配置文件名称

D:\redis\windows-64\redis-2.8.9>redis-server.exe redis.windows.conf

31.4.2、AOF持久化机制

AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据

编辑redis.windwos.conf文件

appendonly on(关闭aof) --> appendonly yes(开启aof)

appendfsync always:每次操作都进行持久化

appendfsync everyesc:每隔一秒进行一次持久化

appendfsync no:不进行持久化

31.5、Jedis

31.5.1、Jedis概述

Jedis:一款Java操作redis数据库的工具

31.5.2、Jedis快速入门

使用步骤:

  1. 下载Jedis的jar包
  2. 使用
@Testpublic void test1(){//创建连接Jedis jedis = new Jedis("localhost",6379);//操作redisjedis.set("password","123");//关闭连接jedis.close();}

31.5.3、Jedis操作String类型数据

字符串类型 String

get、set

@Testpublic void test1(){//创建连接Jedis jedis = new Jedis();//如果使用空参构造,默认值"localhost",6379端口//存储jedis.set("password","123");//获取String password = jedis.get("password");System.out.println(password);//可以使用setex()方法存储可以指定过期时间的 key valuejedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对//关闭连接jedis.close();}

31.5.4、Jedis操作hash类型数据

哈希类型 hash:map格式

hset、hget、hgetAll

//Jedis操作hash类型数据@Testpublic void test2(){//创建连接Jedis jedis = new Jedis();//如果使用空参构造,默认值"localhost",6379端口//存储jedis.hset("user","name","zhangsan");jedis.hset("user","age","18");jedis.hset("user","sex","nan");//获取String name = jedis.hget("user", "name");System.out.println(name);//获取所有的键值对Map<String, String> map = jedis.hgetAll("user");//遍历集合获取所有的键值对Set<String> keys = map.keySet();//根据key找值for (String key : keys) {String value = map.get(key);System.out.println(key + ":" +value);}//关闭连接jedis.close();}

31.5.5、Jedis操作list类型数据

列表类型 list:linkedlist格式。支持重复元素

lpush/rpush、lpop/rpop、lrange start end :范围获取

//Jedis操作list类型数据@Testpublic void test3(){//创建连接Jedis jedis = new Jedis();//如果使用空参构造,默认值"localhost",6379端口//存储jedis.lpush("mylist","a","b","c");//从左边存jedis.rpush("mylist","a","b","c");//从右边存//获取列表的数据List<String> mylist = jedis.lrange("mylist", 0, -1);System.out.println(mylist);//删除列表中的数据(弹出)String mylist1 = jedis.lpop("mylist");System.out.println(mylist1);String mylist2 = jedis.rpop("mylist");System.out.println(mylist2);//获取列表的数据List<String> mylist3 = jedis.lrange("mylist", 0, -1);System.out.println(mylist3);//关闭连接jedis.close();}

31.5.6、Jedis操作set类型数据

集合类型 set:不允许重复元素

sadd、smembers:获取所有元素

  //Jedis操作set类型数据@Testpublic void test4(){//创建连接Jedis jedis = new Jedis();//如果使用空参构造,默认值"localhost",6379端口//存储jedis.sadd("person","son","man","min");//获取所有的值Set<String> person = jedis.smembers("person");System.out.println(person);//关闭连接jedis.close();}

31.5.7、Jedis操作sortedset类型数据

有序集合类型 sortedset:不允许重复元素,且元素有顺序

zadd/zrange:获取数据

//Jedis操作sortedset类型数据@Testpublic void test5(){//创建连接Jedis jedis = new Jedis();//如果使用空参构造,默认值"localhost",6379端口//存储jedis.zadd("son",3,"亚瑟");jedis.zadd("son",20,"后裔");jedis.zadd("son",55,"孙悟空");//获取数据Set<String> son = jedis.zrange("son", 0, -1);System.out.println(son);//关闭连接jedis.close();}

31.5.8、Jedis连接池

Jedis连接池:JedisPool

  • 使用:
    1. 创建JedisPool连接池对象
    2. 调用方法getResource()方法获取Jedis连接
 //jedis连接池@Testpublic void test6(){//可以通过对象对Jedis连接池对象进行配置JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();//配置连接池的最大连接数jedisPoolConfig.setMaxTotal(50);//配置连接池的最大空余连接jedisPoolConfig.setMaxIdle(10);//创建Jedis链接池对象JedisPool jedisPool = new JedisPool(jedisPoolConfig,"localhost");//通过链接池方法获取连接对象Jedis jedis = jedisPool.getResource();//存储数据jedis.set("hello","hhhh");//归还资源jedis.close();}

31.5.9、Jedis连接池工具类

package com.example.utils;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;public class JedisUtils {//定义一个jedisPool成员变量private static JedisPool jedisPool;//定义一个静态代码块实现配置文件的加载static {InputStream is = JedisUtils.class.getClassLoader().getResourceAsStream("jedis.properties");//创建peoperties集合对象加载文件Properties properties = new Properties();try {properties.load(is);} catch (IOException e) {e.printStackTrace();}//创建配置连接池对象JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();String maxIdle = (String) properties.get("maxIdle");System.out.println(maxIdle);String maxTotal = (String) properties.get("maxTotal");System.out.println(maxTotal);jedisPoolConfig.setMaxIdle(Integer.parseInt(maxIdle));jedisPoolConfig.setMaxTotal(Integer.parseInt(maxTotal));jedisPool = new JedisPool(jedisPoolConfig,properties.getProperty("host"));}//获取jedis对象public static Jedis getJedis(){return jedisPool.getResource();}
}

31.5.10、案例

案例需求:

  1. 提供index.html页面,页面中有一个省份下拉列表
  2. 当页面加载完成后发送ajax请求,加载所有省份

注意:使用redis缓存一些不经常发生变化的数据。

  • 数据库的数据一旦发生改变,则需要更新缓存
    • 数据库的表执行 增删改的操作,需要将redis缓存数据情况,再次存入
    • 在service对应的增删改方法中,将redis数据删除。
      在这里插入图片描述
package cn.itcast.web.servlet;import cn.itcast.service.ProvinceService;
import cn.itcast.service.impl.ProvinceServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/* //1.调用service查询ProvinceService service = new ProvinceServiceImpl();List<Province> list = service.findAll();//2.序列化list为jsonObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(list);*///1.调用service查询ProvinceService service = new ProvinceServiceImpl();String json = service.findAllJson();System.out.println(json);//3.响应结果response.setContentType("application/json;charset=utf-8");response.getWriter().write(json);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}
package cn.itcast.service.impl;import cn.itcast.dao.ProvinceDao;
import cn.itcast.dao.impl.ProvinceDaoImpl;
import cn.itcast.domain.Province;
import cn.itcast.jedis.util.JedisPoolUtils;
import cn.itcast.service.ProvinceService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import redis.clients.jedis.Jedis;import java.util.List;public class ProvinceServiceImpl implements ProvinceService {//声明daoprivate ProvinceDao dao = new ProvinceDaoImpl();@Overridepublic List<Province> findAll() {return dao.findAll();}/**使用redis缓存*/@Overridepublic String findAllJson() {//1.先从redis中查询数据//1.1获取redis客户端连接Jedis jedis = JedisPoolUtils.getJedis();String province_json = jedis.get("province");//2判断 province_json 数据是否为nullif(province_json == null || province_json.length() == 0){//redis中没有数据System.out.println("redis中没数据,查询数据库...");//2.1从数据中查询List<Province> ps = dao.findAll();//2.2将list序列化为jsonObjectMapper mapper = new ObjectMapper();try {province_json = mapper.writeValueAsString(ps);} catch (JsonProcessingException e) {e.printStackTrace();}//2.3 将json数据存入redisjedis.set("province",province_json);//归还连接jedis.close();}else{System.out.println("redis中有数据,查询缓存...");}return province_json;}
}
package cn.itcast.dao.impl;import cn.itcast.dao.ProvinceDao;
import cn.itcast.domain.Province;
import cn.itcast.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import java.util.List;public class ProvinceDaoImpl implements ProvinceDao {//1.声明成员变量 jdbctemplementprivate JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());@Overridepublic List<Province> findAll() {//1.定义sqlString sql = "select * from province ";//2.执行sqlList<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));return list;}
}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="js/jquery-3.3.1.min.js"></script><script>$(function () {//发送ajax请求,加载所有省份数据$.get("provinceServlet",{},function (data) {//[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]//1.获取selectvar province = $("#province");//2.遍历json数组$(data).each(function () {//3.创建<option>var option = "<option name='"+this.id+"'>"+this.name+"</option>";//4.调用select的append追加optionprovince.append(option);});});});</script></head>
<body><select id="province"><option>--请选择省份--</option></select>
</body>
</html>

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

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

相关文章

MIT_线性代数笔记:第 26 讲 复矩阵;快速傅里叶变换

目录 复向量 Complex vectors复矩阵 Complex matrices傅里叶变换 Fourier transform快速傅里叶变换 Fast Fourier transform 实矩阵也可能有复特征值&#xff0c;因此无法避免在矩阵运算中碰到复数&#xff0c;本讲学习处理复数矩阵和复向量。 最重要的复矩阵是傅里叶矩阵&…

电力能源监测管理系统,在医院中有哪些作用?

随着经济全球化的发展&#xff0c;节能减排成为当前社会发展必须关注的问题。电力能源监测管理系统&#xff0c;可以分析电力管理能源的现状&#xff0c;并根据现状提出对应的策略&#xff0c;为快速高效建成绿色智能化医院提供有力支撑和技术保障。 医院能源管理现状 1、人力…

Java零基础教学文档第四篇:HTML_CSS_JavaScript(2)

【HTML】 【主要内容】WEB: 1&#xff0e;Web前端简介 2&#xff0e;创建第一个前端项目 3&#xff0e;相关标签详解 4&#xff0e;表格标签详解 5&#xff0e;表单标签详解 6&#xff0e;框架和实体字符 【学习目标】 1. Web前端简介 1.1 为什么要学习Web前端&#…

Windows10 Docker Desktop安装

一、简介 Docker Desktop是Docker公司推出的一款桌面应用程序&#xff0c;它提供了一个用户友好的界面&#xff0c;方便开发人员在本地环境中使用容器技术。 容器是一种轻量级的虚拟化技术&#xff0c;可以将应用程序和其依赖项打包在一起&#xff0c;形成一个独立、可移植的…

Linux学习之网络编程1(纯理论)

写在前面 刚刚更新完Linux系统编程&#xff0c;特别推荐大家去看的Linux系统编程&#xff0c;总共44个小时&#xff0c;老师讲的非常好&#xff0c;我是十天肝完的&#xff0c;每天大概看20集&#xff0c;每天还要以写blog的形式来写笔记来总结一下&#xff0c;虽然这十天有点…

适用于Mac电脑的 iOS 设备管理器选 iTunes 还是iMazing?

mac上有没有好用的ios设备管理器&#xff1f; 因为工作的关系&#xff0c;一共使用3部苹果手机&#xff0c;资料很杂很多也很乱&#xff0c;想整理也不知道从何下手&#xff0c;有人推荐【iTunes】&#xff0c;有人推荐【iMazing】&#xff0c;该如何选择呢&#xff1f; 一、i…

架构师 - 架构师是做什么的 - 学习总结

架构师核心定义 架构师是什么 架构师是业务和技术之间的桥梁 架构师的核心职责是消除不确定性、和降低复杂性 架构设计环 架构师的三个核心能力 架构师的三个关键思维 架构师主要职责 架构设计 Vs 方案设计 架构设计前期 主要任务 澄清不确定性 明确利益干系人的诉求消除冲…

2024.1.13力扣每日一题——构造限制重复的字符串

2024.1.13 题目来源我的题解方法一 计数模拟 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2182 我的题解 方法一 计数模拟 因为字符串s由小写字母构成&#xff0c;因此使用一个int[26]的数组保存每个字符的数量&#xff0c;然后从最大的字符开始构造结果字符串sb&…

段码液晶显示屏模块 背光控制的坑

玩的这个模块做测试&#xff0c;它的引脚有以下的介绍&#xff0c;商家提供了些资料&#xff0c;但没原理图。 led引脚想当然的接个IO输出口&#xff0c;但怎么输出0或1都不能控制背光 然后仔细研究了上面的电路&#xff0c;才发现LED是直接连接着VCC的 总结是这个背光要控制的…

曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 贝塞尔曲线的应用2 图解贝塞尔曲线3 贝塞尔曲线的性质4 算法仿真4.1 ROS C仿真4.2 Python仿真4.3 Matlab仿真 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法…

全包了 功能超级强大的linux管理平台1panel部署教程

目录 先看下效果 1.1panel是什么 2.安装教程 2.1下载安装包 2.2解压 2.3安装 3.查看 3.1初始化并登录 3.2容器管理页面&#xff0c;可以启动 重启 创建容器 ​编辑 3.3应用商店 意见安装常用应用 ​编辑 3.4可视化任务管理 3.5网站管理 3.6数据库管理 ​编辑 3…

iOS UIViewContentMode 不同效果图文对比

一. iOS提供了的ContentMode有如下几种 其中默认mode是UIViewContentModeScaleToFill typedef NS_ENUM(NSInteger, UIViewContentMode) {UIViewContentModeScaleToFill,UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is tr…

Python教程44:海龟画图turtle画卡塔尔世界杯吉祥物

---------------turtle源码集合--------------- Python教程42&#xff1a;海龟画图turtle画海绵宝宝 Python教程41&#xff1a;海龟画图turtle画蜡笔小新 Python教程40&#xff1a;使用turtle画一只杰瑞 Python教程39&#xff1a;使用turtle画美国队长盾牌 Python教程38&a…

领域驱动设计解决汉诺塔问题-文风批评(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 以下文章内容纯属虚构&#xff0c;用来批评某些领域驱动设计文风。后续将挑一些近期的文章作为例子来批评。 ********** 领域驱动设计是革命性的创新&#xff0c;是划时代的洞见。领…

OpenCV-Python(40):光流算法

目标 光流的概念以及Lucas-Kanade 光流法使用函数cv2.calcOpticalFlowPyrLK() 对图像中的特征点进行跟踪 光流 介绍 由于目标对象或者摄像机的移动造成的图像对象在连续两帧图像中的移动被称为光流。它是一个2D 向量场&#xff0c;可以用来显示一个点从第一帧图像到第二帧图像…

CLion、IDEA设置编码为utf-8,防乱码

其实只要是JetBrains的软件都是通用的&#xff0c;下面以IDEA为例 1.设置项目文件编码 2.设置控制台的字符编码

bash shell基础命令

1.shell启动 shell提供了对Linux系统的交互式访问&#xff0c;通常在用户登录终端时启动。系统启动的shell程序取决于用户账户的配置。 /etc/passwd/文件包含了所有用户的基本信息配置&#xff0c; $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash ...例如上述root账户信…

【外汇天眼】误入假冒Ctrl Investments无法出金,投资者:太相信网友了!

在当下这个互联网迅速发展的时代&#xff0c;各类交友类APP成为人们拓展社交圈的新渠道。一方面这样的交友软件在满足了用户基础的社交要求&#xff0c;另一方面网络世界所交往的朋友能给用户带来的神秘感和新鲜感&#xff0c;所以导致一部分年轻人离不开这些交友软件。然而&am…

Python 两种多值参数

有时可能需要一个函数中处理的参数的个数是不确定的&#xff0c;就需要使用多值参数 参数名前加上*&#xff0c;代表可以接收元组参数名前加上**&#xff0c;代表可以接收字典 代码&#xff1a; def demo(*args, **kwargs):print(args)print(kwargs)demo(1, 2, 3, 4, 5, nam…

两个数组的交集 II

题目链接 两个数组的交集 II 题目描述 注意点 返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;可以不考虑输出结果的顺序 解答思路 使用哈希表存储nums1中的元素及出…