键值数据库Redis——Windows环境下载安装+命令行基本操作+Java操纵Redis

news2024/11/19 7:25:59

文章目录

  • 前言
  • 一、下载与安装(Windows环境)
    • ** 检查数据库连接状态 **
    • ** 查看Redis数据库信息 **
  • 二、Redis五种数据结构与基本操作
    • 获取所有的key——keys *
    • 清空所有的key——flushall
    • 2.1 字符串操作
    • 2.2 散列操作
    • 2.3 列表操作
    • 2.4 集合操作
    • 2.5 位图操作
  • 三、Java操纵Redis
    • ** Jedis **
    • 3.1 字符串操作
      • 3.1.1 获取Redis连接
      • 3.1.2 赋值与取值
      • 3.1.3 截取与追加
      • 3.1.4 设置过期时间
    • 3.2 散列操作
      • 3.2.1 赋值与取值
      • 3.2.2 递增递减操作
      • 3.2.3 获取所有键和值
    • 3.3 列表操作
      • 3.3.1 存取数据
      • 3.3.2 获取指定位置元素
      • 3.3.3 删除指定元素
    • 3.4 集合操作
      • 3.4.1 存取数据
      • 3.4.2 集合运算
  • 四、完整代码
    • 4.1 工具类——RedisUtil
    • 4.2 测试类——RedisUtilTest


前言

善始者繁多,克终者盖寡。

按照存储类型进行划分,Redis属于键值数据库的一种,其他常见的数据库如下图所示。Redis是基于内存的数据库,所有在数据读写方面它比mysql、mongodb等数据库要快,当数据库中数据量足够巨大时,系统的性能也会受到影响,所以通常情况下Redis数据库中的键都会有一个过期时间(Time To Live),与之相对的为了让数据更长久的保存下来,Redis需要进行数据持久化操作,具体来说有RDB和AOF两种方式,RDB是Redis默认持久化方式,可以理解为定期持久化,AOF类似于实时持久化。因为Redis数据库的数据读写速度快,所有它常常被用在缓存、计数器(秒杀功能)、消息队列上。
在这里插入图片描述

一、下载与安装(Windows环境)

Windows环境下下载Redis主要有两种渠道:官方下载和社区下载。推荐使用社区下载!!!

Redis官方发布的Linux和其他平台的Redis最新版本为7.2,但是!Windows版本还停留在3.x版本,据说官方已不再更新和维护Windows版本,也就是从官方渠道只能下载3.x的Windos版Redis。

第三方开发团队提供了更新的Windows版Redis,目前最新版本为5.0.14.1。

Windows版的Redis文件结构非常简单,将压缩包解压后可得到下图文件。

在这里插入图片描述

各程序功能描述如下图所示。使用Redis的第一步操作时启动Redis服务器,第二步是启动Redis客户端(默认地址和端口为127.0.0.1:6379)

在这里插入图片描述

** 检查数据库连接状态 **

Redis服务器启动成功后会显示Reids版本、端口号、进程号、Redis配置文件地址等信息。
在这里插入图片描述

使用“ping”指令可以检查当前客户端与服务器连接情况,返回“PONG”时表明连接没有问题。

ping

在这里插入图片描述

** 查看Redis数据库信息 **

使用“info”指令可以查看当前Redis数据库服务器、客户端、内存使用情况、持久化等信息。

在这里插入图片描述

二、Redis五种数据结构与基本操作

获取所有的key——keys *

keys *
通过该指令可以用来验证指令和操作是否生效。

清空所有的key——flushall

flushall
通过该指令可以清空内存中所有的key。

2.1 字符串操作

  1. 赋值与取值
    set key value [NX/UX]
    get key [NX/UX]
    NX:不覆盖,不存在就自动创建
    XX:覆盖已存在,不存在时不会自动创建

  2. 取值后赋值
    getset key value
    该指令会返回原来key的值。

  3. 批量赋值和取值
    mset key1 value1 key2 value2 key3 value3…
    mget key1 key2 key3

  4. 判断字段是否存在
    exists key

  5. 递增/递减
    incr/decr key
    该指令使用默认步长(1或-1)进行递增和递减
    incrby/decrby key increment/decrement
    该指令可指定步长

  6. 获取字符串
    strlen key
    该指令返回字符串长度。
    getrange key start end
    该指令获取指定范围的字符,可以将end设置为-1,表示获取字符串第start个到最后一个字符。
    setrange key start end
    该指令用于覆盖原来的字符串,从指定位置开始覆盖
    append key value

  7. 删除字段
    del key1 key2 key3…

2.2 散列操作

可以使用散列存储对象。

  1. 赋值与取值
    hset key field value
    hget key field
    hsetNX:不覆盖,不存在就自动创建
    hgetXX:覆盖,不存在不会自动创建
    可以将key理解为对象的名字,例如car,将field理解为对象的属性,例如price、type。
  2. 批量赋值和取值
    hmest key field1 value1 field2 value2
    hmget key field1 field2
    hgetall key
    该指令获取指定散列的所有信息,包括field和value。
    hkeys key
    该指令获取指定散列的所有field,返回的是一个集合(因为field不能重复)。
    hvals key
    该指令获取指定散列的所有field,返回的是一个列表(value可以重复)。
  3. 判断字段是否存在
    hexists key field
  4. 递增/递减
    hincrby key field increment/decrement
    hincrbyfloat key field increment/decrement
    递增递减操作都可以使用递增命令实现(递减就是加上一个负数),在散列中需要指定递增递减的步长。
  5. 获取长度
    hstrlen key field
    该指令返回指定散列某个field的值的长度,例如car的price是500,则返回3。
    hlen key
    该指令返回指定散列field的个数,例如car有price、color、type、city四个field,则返回4。
  6. 删除字段
    hdel key field

2.3 列表操作

Redis中的列表类似于数据结构中的双向链表实现的队列,既可以从两端取元素又可以从两端存元素,并且每个元素还有索引(序号),大大加快了获取指定索引元素的速度。

  1. 添加元素
    lpush/rpush key value1 value2 value3
    lpush表示从依次向左侧添加元素;rpush表示依次向右侧添加元素,序号是从左往右排序的。
  2. 设置指定位置元素
    lset key index value
  3. 弹出元素
    lpop/rpop key
    lpop表示从左侧弹出元素;rpop表示从右侧弹出元素。
    rpoplpush key1 key2
    该指令表示将右侧弹出元素并添加到左侧,返回被弹出的元素。
  4. 获取列表长度
    llen key
  5. 获取指定位置的元素
    lindex key index
    lrange key 0 -1
    该指令表示获取列表所有的元素,-1表示列表的最后一个元素。

2.4 集合操作

  1. 添加元素
    sadd key value1 value2 value3
    集合中不会存在相同元素。
  2. 删除/移动元素
    srem key value1 value2 value3
    smove key1 key2 value1 value2 value3
    该指令表示将集合key1中的value移动到集合key2中。
  3. 获取集合中元素个数
    smembers key
    scard key
  4. 判断元素是否在集合中
    sismember key value
  5. 集合运算
    sinter key1 key2 key3 ##交集
    sunion key1 key2 key3 ##并集
    sdiff key1 key2 key3 ##差集
    sinterstore/sunionstore/sdiffstore store key1 key2 key3
    该指令表示将key1、key2、key3集合的交、并、差操作结果存储在集合store中。

2.5 位图操作

位图是Redis中特别有意思的一种数据结构,它使用二进制数表示数据,常常用于签到次数、点击次数等应用场景中。下图显示了“A”与“a”两个字符的unicode编码和十进制数,接下来在Redis客户端中进行验证。

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

依次取出key1的前8位数值,发现前8位数值与对应unicode编码相同。

在这里插入图片描述

接着将key1的第3位值由0改为1(系统返回值为该位置原来的值),再取出key1,发现key1由“A”变成了“a”。

在这里插入图片描述

  1. 赋值和取值
    setbit key index value
    getbit key index
  2. 位元操作
    bitcount key start end
    该指令统计字符串被设置为1的bit数。
    bitpos key value start end
    该指令获取第一个为0或1的bit位。
    bitop and/or/xor destkey key1 key2
    bitop not key
    上述两条指令表示与、或、异或、非位运算。

三、Java操纵Redis

** Jedis **

Jedis是Java开发中使用最广泛的Redis客户端库之一,它封装了大多数Redis的操作指令,让Java与Redis的交互变得容易。后续操作均借助Jedis完成。

3.1 字符串操作

3.1.1 获取Redis连接

    public static Jedis getRedisConnection(){
        Jedis jedis = new Jedis("localhost",6379);
        return jedis;
    }

3.1.2 赋值与取值

    public static void setAndGet(){
        Jedis connection = new Jedis("localhost",6379);
        connection.set("hello", "redis");
        System.out.println(connection.get("hello"));
        String oldValue = connection.getSet("hello", "jedis");
        System.out.println(oldValue);
        System.out.println(connection.get("hello"));
        connection.close();
    }

3.1.3 截取与追加

    //截取字符串
    public static void subString(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.set("hello", "redis");
        System.out.println(connection.strlen("hello"));
        System.out.println(connection.getrange("hello", 1, 3));
        connection.close();
    }

    //向末尾添加字符串
    public static void appendString(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.set("hello", "redis");
        System.out.println(connection.append("hello", " 123"));
        System.out.println(connection.get("hello"));
        connection.close();
    }

3.1.4 设置过期时间

如前言中所述,Redis是一款基于内存的数据库,当数据量足够庞大时必然影响系统的运行速度,所有为“键”设置过期时间(Time To Live)十分有必要。

    //设置键的过期时间
    public static void setExpire(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.set("hello", "redis");
        //expire中传入的时间单位为“秒”
        connection.expire("hello", 1);
        try {
        	//Thread中传入的时间单位是“毫秒”
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(connection.get("hello"));
        /*
            用于显示键的过期时间
            -1表示键存在但未设置过期时间,意味着永久存在
            -2表示键不存在
            整数n表示当前键剩余过期时间
         */
        System.out.println(connection.ttl("hello"));
        connection.close();
    }

3.2 散列操作

3.2.1 赋值与取值

    public static void setAndGetHash(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.hset("car", "color", "white");
        HashMap<String, String> carMap = new HashMap<>();
        carMap.put("brand", "BMW");
        carMap.put("price", "500");
        connection.hmset("car", carMap);
        System.out.println(connection.hgetAll("car"));
        connection.close();
    }

3.2.2 递增递减操作

    public static void incrementDecrement(){
        Jedis connection = new Jedis("localhost", 6379);
        System.out.println(connection.hgetAll("car"));
        connection.hincrBy("car", "price", 500);
        System.out.println(connection.hgetAll("car"));
        connection.close();
    }

3.2.3 获取所有键和值

    //获取所有的键和值
    public static void getAllKeysAndValues(){
        Jedis connection = new Jedis("localhost", 6379);
        Set<String> keys = connection.hkeys("car");
        for (String key : keys) {
            System.out.println(key);
        }
        List<String> values = connection.hvals("car");
        for (String value : values) {
            System.out.println(value);
        }
        connection.close();
    }

3.3 列表操作

3.3.1 存取数据

    //列表操作之存取数据
    public static void listPushAndPop(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.lpush("fruit","apple","banana");
        connection.rpush("fruit", "orange","grape", "pear");
        //获取列表fruit的长度并输出其中的内容
        while (connection.llen("fruit") > 0){
            System.out.println(connection.lpop("fruit"));
        }
        connection.close();
    }

3.3.2 获取指定位置元素

    //获取列表中指定位置的元素
    public static void getListIndex(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.rpush("fruit", "apple","banana","orange","grape","pear");
        System.out.println(connection.lindex("fruit", 1));
        //此处分隔表示和后面结果相区分
        System.out.println("*************");
        List<String> fruits = connection.lrange("fruit", 2, 4);
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        connection.close();
    }

3.3.3 删除指定元素

    //删除列表中指定元素
    public static void removeListValue(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.lpush("list","a","b","c","a","a","d");
        //从左往右删除列表中的两个a
        connection.lrem("list", 2, "a");
        //通常情况下-1表示数据结构的最后一个元素
        List<String> list = connection.lrange("list", 0, -1);
        for (String s : list) {
            System.out.println(s);
        }
        connection.close();
    }

3.4 集合操作

3.4.1 存取数据

    //集合操作之存取数据
    public static void addAndRemoveValue(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.sadd("set","a","b","c","a","a","d");
        System.out.println("删除前的元素:");
        Set<String> set = connection.smembers("set");
        for (String s : set) {
            System.out.println(s);
        }
        System.out.println("删除后的元素");
        connection.srem("set", "a");
        set = connection.smembers("set");
        for (String s : set) {
            System.out.println(s);
        }
        connection.close();
    }

3.4.2 集合运算

    //集合的运算
    public static void setOperation(){
        Jedis connection = new Jedis("localhost", 6379);
        //删除redis所有的键值对
        connection.flushAll();

        connection.sadd("fruit", "apple","tomato");
        connection.sadd("vegetable", "tomato","potato", "carrot");

        //求集合的交集
        Set<String> sinter = connection.sinter("fruit", "vegetable");
        System.out.println("交集是:");
        for (String s:sinter){
            System.out.println(s);
        }

        //求集合的并集
        Set<String> sunion = connection.sunion("fruit", "vegetable");
        System.out.println("\n并集是:");
        for (String s:sunion){
            System.out.println(s);
        }

        //求集合的差集fruit减去vegetable
        Set<String> sdiff = connection.sdiff("fruit", "vegetable");
        System.out.println("\n差集是:");
        for (String s:sdiff){
            System.out.println(s);
        }

        connection.close();
    }

四、完整代码

4.1 工具类——RedisUtil

import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Set;

public class RedisUtil {
    public static void main(String[] args) {

    }

    public static Jedis getRedisConnection(){
        Jedis jedis = new Jedis("localhost",6379);
        return jedis;
    }

    //设置、获取字符串的键值
    public static void setAndGet(){
        Jedis connection = new Jedis("localhost",6379);
        connection.set("hello", "redis");
        System.out.println(connection.get("hello"));
        String oldValue = connection.getSet("hello", "jedis");
        System.out.println(oldValue);
        System.out.println(connection.get("hello"));
        connection.close();
    }

    //截取字符串
    public static void subString(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.set("hello", "redis");
        System.out.println(connection.strlen("hello"));
        System.out.println(connection.getrange("hello", 1, 3));
        connection.close();
    }

    //向末尾添加字符串
    public static void appendString(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.set("hello", "redis");
        System.out.println(connection.append("hello", " 123"));
        System.out.println(connection.get("hello"));
        connection.close();
    }

    //设置键的过期时间
    public static void setExpire(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.set("hello", "redis");
        connection.expire("hello", 1);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(connection.get("hello"));
        /*
            用于显示键的过期时间
            -1表示键存在但未设置过期时间,意味着永久存在
            -2表示键不存在
            整数n表示当前键剩余过期时间
         */
        System.out.println(connection.ttl("hello"));
        connection.close();
    }

    //散列的赋值与取值
    public static void setAndGetHash(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.hset("car", "color", "white");
        HashMap<String, String> carMap = new HashMap<>();
        carMap.put("brand", "BMW");
        carMap.put("price", "500");
        connection.hmset("car", carMap);
        System.out.println(connection.hgetAll("car"));
        connection.close();
    }

    //递增递减操作
    public static void incrementDecrement(){
        Jedis connection = new Jedis("localhost", 6379);
        System.out.println(connection.hgetAll("car"));
        connection.hincrBy("car", "price", 500);
        System.out.println(connection.hgetAll("car"));
        connection.close();
    }

    //获取所有的键和值
    public static void getAllKeysAndValues(){
        Jedis connection = new Jedis("localhost", 6379);
        Set<String> keys = connection.hkeys("car");
        for (String key : keys) {
            System.out.println(key);
        }
        List<String> values = connection.hvals("car");
        for (String value : values) {
            System.out.println(value);
        }
        connection.close();
    }

    //列表操作之存取数据
    public static void listPushAndPop(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.lpush("fruit","apple","banana");
        connection.rpush("fruit", "orange","grape", "pear");
        //获取列表fruit的长度并输出其中的内容
        while (connection.llen("fruit") > 0){
            System.out.println(connection.lpop("fruit"));
        }
        connection.close();
    }

    //获取列表中指定位置的元素
    public static void getListIndex(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.rpush("fruit", "apple","banana","orange","grape","pear");
        System.out.println(connection.lindex("fruit", 1));
        //此处分隔表示和后面结果相区分
        System.out.println("*************");
        List<String> fruits = connection.lrange("fruit", 2, 4);
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        connection.close();
    }

    //删除列表中指定元素
    public static void removeListValue(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.lpush("list","a","b","c","a","a","d");
        //从左往右删除列表中的两个a
        connection.lrem("list", 2, "a");
        //通常情况下-1表示数据结构的最后一个元素
        List<String> list = connection.lrange("list", 0, -1);
        for (String s : list) {
            System.out.println(s);
        }
        connection.close();
    }

    //集合操作之存取数据
    public static void addAndRemoveValue(){
        Jedis connection = new Jedis("localhost", 6379);
        connection.sadd("set","a","b","c","a","a","d");
        System.out.println("删除前的元素:");
        Set<String> set = connection.smembers("set");
        for (String s : set) {
            System.out.println(s);
        }
        System.out.println("删除后的元素");
        connection.srem("set", "a");
        set = connection.smembers("set");
        for (String s : set) {
            System.out.println(s);
        }
        connection.close();
    }

    //集合的运算
    public static void setOperation(){
        Jedis connection = new Jedis("localhost", 6379);
        //删除redis所有的键值对
        connection.flushAll();

        connection.sadd("fruit", "apple","tomato");
        connection.sadd("vegetable", "tomato","potato", "carrot");

        //求集合的交集
        Set<String> sinter = connection.sinter("fruit", "vegetable");
        System.out.println("交集是:");
        for (String s:sinter){
            System.out.println(s);
        }

        //求集合的并集
        Set<String> sunion = connection.sunion("fruit", "vegetable");
        System.out.println("\n并集是:");
        for (String s:sunion){
            System.out.println(s);
        }

        //求集合的差集fruit减去vegetable
        Set<String> sdiff = connection.sdiff("fruit", "vegetable");
        System.out.println("\n差集是:");
        for (String s:sdiff){
            System.out.println(s);
        }

        connection.close();
    }
}

4.2 测试类——RedisUtilTest

测试工具为Junit5,开发环境为IDEA,在Eclipse中测试方法必须以test开头,此处与IDEA有所区别。

import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;

import static org.junit.jupiter.api.Assertions.*;

class RedisUtilTest {

    @Test
    void getRedisConnection() {
        Jedis connection = RedisUtil.getRedisConnection();
        System.out.println(connection);
        connection.close();
    }

    @Test
    void setAndGet() {
        RedisUtil.setAndGet();
    }

    @Test
    void subString() {
        RedisUtil.subString();
    }

    @Test
    void appendString() {
        RedisUtil.appendString();
    }

    @Test
    void setExpire() {
        RedisUtil.setExpire();
    }

    @Test
    void setAndGetHash() {
        RedisUtil.setAndGetHash();
    }

    @Test
    void incrementDecrement() {
        RedisUtil.incrementDecrement();
    }

    @Test
    void getAllKeysAndValues() {
        RedisUtil.getAllKeysAndValues();
    }

    @Test
    void listPushAndPop() {
        RedisUtil.listPushAndPop();
    }

    @Test
    void getListIndex() {
        RedisUtil.getListIndex();
    }

    @Test
    void removeListValue() {
        RedisUtil.removeListValue();
    }

    @Test
    void addAndRemoveValue() {
        RedisUtil.addAndRemoveValue();
    }

    @Test
    void setOperation() {
        RedisUtil.setOperation();
    }
}

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

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

相关文章

【Java EE】 IoC详解(Bean的存储)

文章目录 &#x1f38d;Controller&#xff08;控制器存储&#xff09;&#x1f338;如何从Spring容器中获取对象&#xff08;ApplicationContext&#xff09;&#x1f338;获取bean对象的其他方式&#xff08;BeanFactory&#xff09;&#x1f338;Bean 命名约定&#x1f338;…

Java调用http接口的几种方式(HttpURLConnection、OKHttp、HttpClient、RestTemplate)

Java作为后端语言是开发接口实现功能供客户端调用接口&#xff0c;这些客户端中最主要是本项目的前端&#xff1b;但有时候也需要Java请求其他的接口&#xff0c;比如需要长连接转短链接&#xff08;请求百度的一个接口可以实现&#xff09;、获取三方OSS签名、微信小程序签名、…

数据结构(六)----串

目录 1.串的定义 2.串的基本操作 3.串的存储结构 (1)串的定义 •顺序存储 •链式存储 (2)求串长 (3)求子串 (4)比较串的大小 (5)定位操作 4.字符串的模式匹配 (1)朴素模式匹配算法 (2)KMP算法 •求模式串中的next数组&#xff08;重点&#xff09; •练习&#…

第四百六十回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

适配器模式:连接不兼容接口的桥梁

在软件开发中&#xff0c;适配器模式是一种结构型设计模式&#xff0c;它允许不兼容的接口之间进行交互&#xff0c;从而使它们能够一起工作。这个模式经常用于系统升级或集成第三方库的时候&#xff0c;当现有的代码无法直接使用新系统或库提供的接口时&#xff0c;适配器可以…

基于Java+Vue的中国咖啡文化宣传网站(源码+文档+包运行)

一.系统概述 本课题是根据咖啡文化宣传需要以及网络的优势建立的一个中国咖啡文化宣传网站&#xff0c;来实现中国咖啡文化宣传以及咖啡商品售卖的功能。 本中国咖啡文化宣传网站应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于SSMVue框架开发。在网站的整个开发…

【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框

往期回顾 【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客 【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件-CSDN博客 【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置-CSDN博客 【QT入门】Qt自定义控件与样式设计之自定义QLin…

找不到mfc110u.dll怎么办,总结5种有效的解决方法

在日常操作计算机的过程中&#xff0c;我们时常会遭遇各类突发状况&#xff0c;其中一种颇为常见的问题便是当试图运行某个特定软件时&#xff0c;系统突然弹出一则令人困扰的错误提示&#xff1a;“由于找不到mfc110u.dll&#xff0c;无法继续执行代码”。这个问题通常是由于缺…

Vol.44 一个分享网站的网站,每个月8.7万访问量

哈咯&#xff0c;各位朋友好啊&#xff0c;我是欧维&#xff0c;今天要给大家分享的网址是Fuun.fun&#xff0c;奇趣网站收藏家&#xff1b; 它的网址是&#xff1a;FUUN.FUN 这是一个我经常逛的网站&#xff0c;为什么我经常逛呢&#xff1f;因为可以从中发现一些有意思的网站…

Vol.46 一个在线小游戏网站,每个月50万访问量

大家好&#xff0c;我是欧维Ove&#xff0c;今天要给大家分享的网站是&#xff1a;小霸王&#xff0c;这是一个可以在线玩小霸王游戏的网站&#xff0c;网址是&#xff1a;小霸王&#xff0c;其樂無窮。紅白機&#xff0c;FC線上遊戲&#xff0c;街機遊戲&#xff0c;街機線上&…

一种驱动器的功能安全架构介绍

下图提供了驱动器实现安全功能的架构 具有如下特点&#xff1a; 1.通用基于总线或者非总线的架构。可以实现ethercat的FSOE&#xff0c;profinet的profisafe&#xff0c;或者伺服本体安全DIO现实安全功能。 2.基于1oo2D架构&#xff0c;安全等级可以达到sil3。 3.高可用性。单…

第17天:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

第十七天 本课意义 1.CMS识别到后期漏洞利用和代码审计 2.开发框架识别到后期漏洞利用和代码审计 3.开发组件识别到后期漏洞利用和代码审计 一、CMS指纹识别-不出网程序识别 1.概念 CMS指纹识别一般能识别到的都是以PHP语言开发的网页为主&#xff0c;其他语言开发的网页识…

攻防世界---Web_php_include

1.题目链接 2.补充知识&#xff1a; 3.构造&#xff1a;执行成功 /?pagedata://text/plain,<?php phpinfo()?> 4.构造下面url&#xff0c;得到目录路径 /?pagedata://text/plain,<?php echo $_SERVER[DOCUMENT_ROOT]?> 5构造下面url&#xff0c;读取该路径的…

Alibaba --- 如何写好 Prompt ?

如何写好 Prompt 提示工程&#xff08;Prompt Engineering&#xff09;是一项通过优化提示词&#xff08;Prompt&#xff09;和生成策略&#xff0c;从而获得更好的模型返回结果的工程技术。总体而言&#xff0c;其实现逻辑如下&#xff1a; &#xff08;注&#xff1a;示例图…

【C++杂货铺】模板进阶

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 泛型编程 &#x1f4c1; 函数模板 &#x1f4c2; 概念 &#x1f4c2; 格式 &#x1f4c2; class 和 typename &#x1f4c2; 原理 &#x1f4c2; 函数模板实例化 &#x1f4c2; 匹配原则 &#x1f4c1; 类模板 &#x1…

全球历年GDP增长率_探数API数据统计

以下是数据的详细说明&#xff1a; 全球GDP增长最快的年份是1964年&#xff0c;全球GDP增速达到6.65%。2021年的GDP增长率也相当高&#xff0c;主要受2020年衰退后的恢复性增长推动。 全球GDP增长最慢的年份包括&#xff1a;1974年、1975年&#xff08;第一次石油危机引发&…

clion最新安装教程

还在用Dev-C吗&#xff1f;也尝试了很多C编辑器&#xff0c;不是太老&#xff0c;就是太复杂。对于c开发者来说clion真的好用&#xff0c;CLion是一款专为开发C及C所设计的跨平台IDE。难受的是cion并不免费&#xff0c;仿佛是在证明好货不贵的道理&#xff0c;只能免费用30天。…

2024年阿里云优惠券领取攻略

阿里云作为国内领先的云计算服务提供商&#xff0c;以其稳定、高效、安全的服务赢得了众多用户的青睐。为了吸引用户上云&#xff0c;阿里云经常推出各种优惠活动&#xff0c;其中就包括阿里云优惠券。本文将为大家详细解读2024年阿里云优惠券的领券攻略&#xff0c;帮助大家轻…

【WinForm】如何在自己的程序窗口中显示并调用外部桌面程序

当你爱上一个程序的功能&#xff0c;并且希望扩展它以满足自己的需求时&#xff0c;你可能会觉得困惑。毕竟&#xff0c;你已经为此付出了很多努力&#xff0c;并希望能够有效地整合这些功能。那么&#xff0c;是否可以将这些功能嵌套到自己的程序中呢&#xff1f; 首先&#…

【操作系统专题】详解操作系统 | 操作系统的目标和功能 | 操作系统如何工作

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.操作系统的目标和功能2…