当前位置: 首页 > news >正文

Redis的Java客户端的使用

Redis 的 Java 客户端使用

C++ 追求极致的性能, 而 Java没有这样的追求.

Redis 在官网公开了所使用的应用层协议 (RESP). 任何一个第三方都可以通过这个协议, 来实现出一个和 Redis 服务器通信的客户端程序.

已经有很多大佬, 做好了库, 可以让我们直接调用 (不必关注 RESP 协议的细节). 在java 生态中, 封装了 RESP 协议的 Redis 客户端是很多的. 咱们此处使用的是 jedis (jedis 提供的 api 和 redis 命令高度一致). jedis 也可以通过 maven 来下载安装.

我们这里选择 jedis 4.4.2 版本.

我们的电脑是无法直接连到云服务器的6379端口上的, 但是我们可以通过 配置 SSH 来实现在本机就能访问云服务器的6379端口.

云服务器 6379 端口 — 映射— 本机 8888 端口

image-20250305113108226

1. Java 客户端连接到 Redis 服务器

关键代码:

JedisPool jedisPool = new JedisPool("url");
Jedis jedis = jedisPool.getResource()

示例:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;public class Main {public static void main(String[] args) {// 连接到Redis服务器上JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");try (Jedis jedis = jedisPool.getResource()) {// Redis的各种命令, 就对应到Jedis对象的各种方法String p = jedis.ping();System.out.println(p);}}
}

2. Java 客户端使用通用命令

2.1 get 和 set 方法
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;public class RedisDemo1 {public static void test1(Jedis jedis) {System.out.println("get 和 set 的使用");// 先清空数据库,要避免上一组测试的残留数据影响到下一组测试的结果jedis.flushAll();// 使用set方法jedis.set("key", "111");jedis.set("key2", "222");SetParams params = new SetParams(); //设置参数params.ex(10);//params.nx(); //不存在才能创建params.xx(); //存在才能修改jedis.set("key", "333", params);String value = jedis.get("key");System.out.println("value=" + value);}
}
  • 运行结果:

image-20250305112957995

2.2 exists 和 del 方法
import redis.clients.jedis.Jedis;public class RedisDemo2 {public static void test2(Jedis jedis) {System.out.println("exists 和 del");jedis.flushAll();jedis.set("key", "111");jedis.set("key2", "222");jedis.set("key3", "333");boolean result1 = jedis.exists("key");System.out.println("result1: " + result1);long result2 = jedis.del("key");System.out.println("result2: " + result2);boolean result3 = jedis.exists("key");System.out.println("result3: " + result3);long result4 = jedis.del("key", "key2", "key3");System.out.println("result4: " + result4);}
}
  • 运行结果:

image-20250305112909233

2.3 keys 方法
import redis.clients.jedis.Jedis;import java.util.Set;public class RedisDemo3 {public static void test3(Jedis jedis) {System.out.println("keys");jedis.flushAll();jedis.set("key1", "111");jedis.set("key2", "222");jedis.set("key3", "333");jedis.set("key4", "444");// redis 中的 key 不能重复,而且也是不在意顺序的Set<String> keys = jedis.keys("*"); //获取所有的keySystem.out.println(keys);}
}
  • 运行结果:

image-20250305112809945

2.4 expire, ttl 方法
import redis.clients.jedis.Jedis;public class RedisDemo4 {public static void test4(Jedis jedis) {System.out.println("expire 和 ttl");jedis.flushAll();jedis.set("key", "111");jedis.expire("key", 10);long time1 = jedis.ttl("key");System.out.println("time1: " + time1); //10stry {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}long time2 = jedis.ttl("key");System.out.println("time2: " + time2); //7s}
}
  • 运行结果:

image-20250305112355698

2.5 type 方法
package com.wang;import redis.clients.jedis.Jedis;public class RedisDemo5 {public static void test5(Jedis jedis) {System.out.println("type");jedis.flushAll();jedis.set("key1", "111");String type = jedis.type("key1");System.out.println("type1: " + type);jedis.lpush("key2", "111", "222", "333");type = jedis.type("key2");System.out.println("type2: " + type);jedis.hset("key3", "f1", "111");type = jedis.type("key3");System.out.println("type3: " + type);jedis.sadd("key4", "111", "222", "333");type = jedis.type("key4");System.out.println("type4: " + type);jedis.zadd("key5", 10, "zhangsan");type = jedis.type("key5");System.out.println("type5: " + type);}
}
  • 运行结果:

image-20250305112627565

3. Java 客户端使用 string 命令

3.1 mset 和 mget
import redis.clients.jedis.Jedis;import java.util.List;public class RedisDemoString1 {public static void test1(Jedis jedis) {System.out.println("mget 和 mset");jedis.flushAll();//mset: 一次设置多个key.jedis.mset("key1", "111", "key2", "222", "key3", "333");//mget: 一次获取多个key.List<String> values = jedis.mget("key1", "key2", "key100", "key3");System.out.println("values: " + values);}
}
  • 运行结果:

image-20250305115638137

3.2 getrange 和 setrange
import redis.clients.jedis.Jedis;public class RedisDemoString2 {public static void test2(Jedis jedis) {System.out.println("getrange 和 setrange");jedis.flushAll();jedis.set("key", "abcdefghijk");// 得到指定范围的子字符串String result = jedis.getrange("key", 2, 5);System.out.println("result: " + result);// 修改字符串jedis.setrange("key", 2, "xyz");String value = jedis.get("key");System.out.println("value: " + value);}
}
  • 运行结果:

image-20250305115941016

3.3 append
import redis.clients.jedis.Jedis;public class RedisDemoString3 {public static void test3(Jedis jedis) {System.out.println("append");jedis.flushAll();jedis.set("key", "abcdef");System.out.println("value1: " + jedis.get("key"));jedis.append("key", "ghij");System.out.println("value2: " +  jedis.get("key"));}
}
  • 运行结果:

image-20250305120720219

3.4 incr 和 decr
import redis.clients.jedis.Jedis;public class RedisDemoString4 {public static void test4(Jedis jedis) {System.out.println("incr 和 decr");jedis.flushAll();jedis.set("key", "100");long result1 = jedis.incr("key");System.out.println("result1: " + result1);System.out.println("value1: " + jedis.get("key"));long result2 = jedis.decr("key");System.out.println("result2: " + result2);System.out.println("value2: " + jedis.get("key"));}
}
  • 运行结果:

image-20250305121204443

4. Java 客户端使用 list 命令

4.1 lpush 和 lrange
import redis.clients.jedis.Jedis;import java.util.List;public class RedisDemoList1 {public static void test1(Jedis jedis) {System.out.println("lpush 和 lrange");jedis.flushAll();jedis.lpush("key", "111", "222", "333");List<String> result = jedis.lrange("key", 0, -1);System.out.println(result);}}
  • 运行结果:

image-20250305122740741

4.2 rpush
import redis.clients.jedis.Jedis;import java.util.List;public class RedisDemoList2 {public static void test2(Jedis jedis) {System.out.println("rpush");jedis.flushAll();jedis.rpush("key", "111", "222", "333");List<String> result = jedis.lrange("key", 0, -1);System.out.println("result: " + result);}}
  • 运行结果:

image-20250305122908674

4.3 lpop 和 rpop
import redis.clients.jedis.Jedis;public class RedisDemoList3 {public static void test3(Jedis jedis) {System.out.println("lpop");jedis.flushAll();jedis.rpush("key", "111", "222", "333");String result = jedis.lpop("key");System.out.println("result: " + result);result = jedis.lpop("key");System.out.println("result: " + result);result = jedis.lpop("key");System.out.println("result: " + result);result = jedis.lpop("key");System.out.println("result: " + result);}
}
  • 运行结果:

image-20250305152037802

  • rpop:
import redis.clients.jedis.Jedis;public class RedisDemoList4 {public static void test4(Jedis jedis) {System.out.println("rpop");jedis.flushAll();jedis.rpush("key", "111", "222", "333");String result = jedis.rpop("key");System.out.println("result: " + result);result = jedis.rpop("key");System.out.println("result: " + result);result = jedis.rpop("key");System.out.println("result: " + result);result = jedis.rpop("key");System.out.println("result: " + result);}
}
  • 运行结果:

image-20250305152252467

4.4 blpop

blpop 在当 key 中有元素时, 作用和 lpop 完全相同. 当 key 中没有元素时, blpop 会阻塞, 直到 key 中有元素添加进来, 停止阻塞.

import redis.clients.jedis.Jedis;import java.util.List;public class RedisDemoList5 {public static void test5(Jedis jedis) {System.out.println("blpop");jedis.flushAll();// 返回结果是一个 "二元组",一个表示从哪个 key 对应的list中删除的,一个表示删除的元素是什么.List<String> results = jedis.blpop(100, "key"); //设置超时时间为100sSystem.out.println("results[0]: " + results.get(0));System.out.println("results[1]: " + results.get(1));}
}

image-20250305152740203

在 key 中添加元素222之后:

image-20250305152905257

4.5 llen
import redis.clients.jedis.Jedis;public class RedisDemoList6 {public static void test6(Jedis jedis) {System.out.println("llen");jedis.flushAll();jedis.rpush("key", "111", "222", "333");long length = jedis.llen("key");System.out.println("列表长度: " + length);}
}
  • 运行结果:

image-20250305153038788

5. Java 客户端使用 set 命令

5.1 sadd 和 smembers

sadd: 往 set 中添加元素

smembers: 返回 set 中所有的元素.

    public static void test1(Jedis jedis) {System.out.println("sadd 和 smembers");jedis.flushAll();jedis.sadd("key", "111", "222", "333");Set<String> result = jedis.smembers("key");System.out.println("result: " + result);}
  • 运行结果:

image-20250305154238761

5.2 sismember

用于判断指定元素是否存在于集合中

    public static void test2(Jedis jedis) {System.out.println("sismember");jedis.flushAll();jedis.sadd("key", "111", "222", "333");boolean result = jedis.sismember("key", "100");// 判断100是不是key中的元素System.out.println("result: " + result);}
  • 运行结果:

image-20250305154532295

5.3 scard

判断 set 中的元素个数

    public static void test3(Jedis jedis) {System.out.println("scard");jedis.flushAll();jedis.sadd("key", "111", "222", "333");long result = jedis.scard("key");System.out.println("result: " + result);}

运行结果:

image-20250305154713382

5.4 spop

随机删除 set 中的元素.

    public static void test4(Jedis jedis) {System.out.println("spop");jedis.flushAll();jedis.sadd("key", "111", "222", "333", "444", "555");String result = jedis.spop("key");System.out.println("result: " + result);}
  • 运行结果:

image-20250305155010343

5.5 sinter 和 sinterstore

sinter:

    public static void test5(Jedis jedis) {System.out.println("sinter");jedis.flushAll();jedis.sadd("key1", "111", "222", "333");jedis.sadd("key2", "111", "222", "444");Set<String> result = jedis.sinter("key1", "key2");System.out.println("result: " + result);}
  • 运行结果:

image-20250305155811677

sinterstore:

    public static void test6(Jedis jedis) {System.out.println("sinterstore");jedis.flushAll();jedis.sadd("key1", "111", "222", "333");jedis.sadd("key2", "111", "222", "444");long len = jedis.sinterstore("key3", "key1", "key2");System.out.println("len: " + len);Set<String> result = jedis.smembers("key3");System.out.println("result: " + result);}
  • 运行结果:

image-20250305160027811

6. Java 客户端使用 hash 命令

6.1 hset 和 hget
    public static void test1(Jedis jedis) {System.out.println("hset 和 hget");jedis.flushAll();jedis.hset("key", "f1", "111");Map<String, String> fields = new HashMap<>();fields.put("f2", "222");fields.put("f3", "333");jedis.hset("key", fields);System.out.println("result1: " + jedis.hget("key", "f1"));System.out.println("result2: " + jedis.hget("key", "f2"));System.out.println("result3: " + jedis.hget("key", "f100"));}
  • 运行结果:

image-20250305161922391

6.2 hexists 和 hdel

hexists:

    public static void test2(Jedis jedis) {System.out.println("hexists");jedis.flushAll();jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "222");jedis.hset("key", "f3", "333");boolean result1 = jedis.hexists("key", "f1");System.out.println("result: " + result1);boolean result2 = jedis.hexists("key", "f100");System.out.println("result: " + result2);}
  • 运行结果:

image-20250305161900134

hdel:

    public static void test3(Jedis jedis) {System.out.println("hdel");jedis.flushAll();jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "222");jedis.hset("key", "f3", "333");long result = jedis.hdel("key", "f1", "f2");System.out.println("result: " + result);System.out.println("f1.exists: " + jedis.hexists("key", "f1"));System.out.println("f2.exists: " + jedis.hexists("key", "f2"));}
  • 运行结果:

image-20250305162237787

6.3 hkeys 和 hvalues

hkeys: 获取指定 key 中的所有 field.

hvalues: 获取指定 key 中的所有 value.

    public static void test4(Jedis jedis) {System.out.println("hkeys 和 hvals");jedis.flushAll();jedis.hset("key", "f1", "111");jedis.hset("key", "f2", "222");jedis.hset("key", "f3", "333");Set<String> fields = jedis.hkeys("key");List<String> vals = jedis.hvals("key");System.out.println("fields: " + fields);System.out.println("vals: " + vals);}
  • 运行结果:

image-20250305163804677

6.4 hmset 和 hmget

hmset: 一次设置多组 field-value.

hmget: 一次获取多组 field-value.

    public static void test5(Jedis jedis) {System.out.println("hmset 和 hmget");jedis.flushAll();Map<String, String> map = new HashMap<>();map.put("f1", "111");map.put("f2", "222");map.put("f3", "333");jedis.hmset("key", map);List<String> values = jedis.hmget("key", "f2", "f1", "f3");System.out.println("values: " + values);}
  • 运行结果:

image-20250305164219360

7. Java 客户端使用 zset 命令

  • zset 中 存储的元素是 element-score 类型的.
7.1 zadd 和 zrange
    public static void test1(Jedis jedis) {System.out.println("zadd 和 zrange");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");Map<String, Double> map = new HashMap<>();map.put("lisi", 20.0);map.put("wangwu", 30.0);jedis.zadd("key", map);List<String> members = jedis.zrange("key", 0, -1);System.out.println("members: " + members);List<Tuple> membersWithScore = jedis.zrangeWithScores("key", 0, -1);System.out.println("membersWithScore: " + membersWithScore);String member = membersWithScore.get(0).getElement();double score = membersWithScore.get(0).getScore();System.out.println("member: " + member + ", score: " + score);}
  • 运行结果:

image-20250305165702079

7.2 zcard
    public static void test2(Jedis jedis) {System.out.println("zcard");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");jedis.zadd("key", 20, "lisi");jedis.zadd("key", 30, "wangwu");System.out.println("len: " + jedis.zcard("key"));}
  • 运行结果:

image-20250305170516099

7.3 zrem
    public static void test3(Jedis jedis) {System.out.println("zrem");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");jedis.zadd("key", 20, "lisi");jedis.zadd("key", 30, "wangwu");long n = jedis.zrem("key", "zhangsan");System.out.println("n: " + n);List<Tuple> result = jedis.zrangeWithScores("key", 0, -1);System.out.println("result: " + result);}
  • 运行结果:

7.4 zscore
    public static void test4(Jedis jedis) {System.out.println("zscore");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");jedis.zadd("key", 20, "lisi");jedis.zadd("key", 30, "wangwu");Double score = jedis.zscore("key", "zhangsan");System.out.println("zhangsan.score: " + score);}
  • 运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.5 zrank
    public static void test5(Jedis jedis) {System.out.println("zrank");jedis.flushAll();jedis.zadd("key", 10, "zhangsan");jedis.zadd("key", 20, "lisi");jedis.zadd("key", 30, "wangwu");Long rank = jedis.zrank("key", "zhangsan");System.out.println("rank: " + rank);}
  • 运行结果:

image-20250305171135626

8. 小结

本质上来说, Jedis 库就是对 Redis 所有命令的一个简单封装, 这里不再过多介绍. 如果有其他问题, 我们可以查看 Jedis 的官方文档 (在 github 上).

相关文章:

Redis的Java客户端的使用

Redis 的 Java 客户端使用 C 追求极致的性能, 而 Java没有这样的追求. Redis 在官网公开了所使用的应用层协议 (RESP). 任何一个第三方都可以通过这个协议, 来实现出一个和 Redis 服务器通信的客户端程序. 已经有很多大佬, 做好了库, 可以让我们直接调用 (不必关注 RESP 协议…...

双向链表示例

#include <stdio.h> #include <stdlib.h>// 定义双向链表节点结构体 typedef struct list {int data; // 数据部分struct list *next; // 指向下一个节点的指针struct list *prev; // 指向前一个节点的指针 } list_t;// 初始化链表&#xff0c;将链表的…...

Unity如何把一个物体下物体复制很多到别的物体下

C# 脚本批量复制 如果需批量复制到多个父物体下&#xff0c;推荐用脚本实现&#xff1a; using UnityEngine;public class CopyChildren : MonoBehaviour {// 原父物体&#xff08;拖拽赋值&#xff09;public Transform sourceParent;// 目标父物体数组&#xff08;可拖拽多个…...

Java Properties 类详解

Java Properties 类详解 Properties 是 Java 中用于处理 键值对配置文件 的特殊类&#xff0c;继承自 Hashtable<Object,Object>。以下是其核心知识点&#xff1a; 1. 核心特性 特性说明存储格式纯文本文件&#xff08;.properties&#xff09;&#xff0c;每行 keyval…...

进程内存分布--之理论知识

一个由C/C编译的程序占用的内存分为以下几个部分 &#xff1a; 1、栈区&#xff08;stack&#xff09;&#xff1a;由编译器自动分配释放 &#xff0c;存放函数调用函数的参数值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区&#xff08;heap&#xf…...

TDengine 窗口预聚集

简介 在大数据量场景下&#xff0c;经常需要查询某段时间内的汇总结果&#xff0c;当历史数据变多或者时间范围变大时&#xff0c;查询时间也会相应增加。通过预聚集的方式可以将计算结果提前存储下来&#xff0c;后续查询可以直接读取聚集结果&#xff0c;而不需要扫描原始数…...

高精度加法与乘法

原理就是模拟我们列竖式的过程。 一、加法 加法很简单&#xff0c;我们这里不再赘述 string solve(string s, string t) {string ans;int tmp 0;int n s.size()-1;int m t.size()-1;while(n>0||m>0||tmp){if(n>0){tmp s[n--]-0;}if(m>0){tmp t[m--]-0;}ans…...

macOS可视化桌面配置docker加速器

macOS可视化桌面配置docker加速器 在镜像settings->docker Engine改为国内镜像修改为国内镜像重启docker(可视化界面启动或者使用命令行)使用命令重启可视化界面重启 在镜像settings->docker Engine改为国内镜像 修改为国内镜像 {"registry-mirrors": ["…...

不用训练,集成多个大模型产生更优秀的输出

论文标题 Collab: Controlled Decoding using Mixture of Agents for LLM Alignment 论文地址 https://arxiv.org/pdf/2503.21720 作者背景 JP摩根&#xff0c;马里兰大学帕克分校&#xff0c;普林斯顿大学 动机 大模型对齐&#xff08;alignment&#xff09;的主要目的…...

【大模型】DeepSeek + 蓝耕MaaS平台 + 海螺AI生成高质量视频操作详解

目录 一、前言 二、蓝耘智能云MaaS平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 平台核心能力 三、海螺AI视频介绍 3.1 海螺AI视频是什么 3.2 海螺AI视频主要功能 3.3 海螺AI视频应用场景 3.4 海螺AI视频核心优势 3.5 项目git地址 四、蓝耘MaaS平台DeepSeek海…...

RobotFrameWork环境搭建及使用

RF环境搭建 首先安装python并且配置python环境变量pip install robotframeworkpip install robotframework-ride 生产桌面快捷方式 不行换豆瓣源检查一下pip list RF类库和扩展库 标准库 按F5快捷键查询&#xff0c;可以看到rf自带的库不需要额外安装这些标准库在python的 …...

Flutter之设计与主题字体

目录&#xff1a; 1、共享主题样式2、文字3、使用自定义字体4、以 package 的方式使用字体1. 将字体添加到 package2. 将 package 和字体添加到应用3. 使用字体 1、共享主题样式 MaterialApp(title: appName,theme: ThemeData(// Define the default brightness and colors.col…...

发生梯度消失, 梯度爆炸问题的原因,怎么解决?

目录 一、梯度消失的原因 二、梯度爆炸的原因 三、共同的结构性原因 四、解决办法 五、补充知识 一、梯度消失的原因 梯度消失指的是在反向传播过程中&#xff0c;梯度随着层数的增加指数级减小&#xff08;趋近于0&#xff09;&#xff0c;导致浅层网络的权重几乎无法更新…...

脑电学习笔记

一&#xff0c;原理简介 使用eprime或者matlab给被试呈现刺激&#xff0c;并在某个时间发送Mark&#xff0c;脑电帽会同步采集被试的脑电信号&#xff0c;经放大器放大后&#xff0c;控制盒会把脑电信号和mark 信号同步到一起&#xff0c;通过usb线传入到采集系统&#xff08;比…...

Java面试黄金宝典37

1. 转发与重定向的区别 定义 转发:服务器内部的一种请求处理方式,当客户端向服务器发送请求后,服务器将该请求转发到另一个资源(如 JSP、Servlet)进行处理,整个过程在服务器端完成,客户端并不知道请求被转发,且使用的是同一个请求对象和响应对象。重定向:服务器向客户…...

嵌入式rodata段

在嵌入式软件开发中&#xff0c;将数据放入只读数据段&#xff08;.rodata&#xff09;具有以下好处及典型应用示例&#xff1a; 好处 数据保护 .rodata段的内容在程序运行时不可修改&#xff0c;防止意外或恶意篡改&#xff0c;提升系统稳定性。 节省RAM资源 只读数据可直接…...

Python学习之numpy

Python学习之numpy 数组是Numpy库的核心数据结构。 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric&#xff0c;即 NumPy 的前身&#xff0c;是由 Jim Hugunin 开发的。 也开发了另一个包 Numarr…...

ext4磁盘扩容

ext4扩容示例 当前虚机中&#xff0c;逻辑卷名称data_lv&#xff0c;卷组名称data_vg&#xff0c;物理卷名称data_pv&#xff0c;他们的大小都为100G&#xff0c;由于磁盘空间不够使用&#xff0c;申请扩容硬盘至200G&#xff0c;以下操作将ext4的/data分区扩容至200G。 # 1.…...

PostgreSQL 16深度解析(从16.0-16.8)

作为开源关系型数据库的标杆&#xff0c;PostgreSQL持续通过版本迭代展现其技术生命力。本文将以技术视角深度剖析PostgreSQL 16系列&#xff08;16.0至16.8&#xff09;的核心演进&#xff0c;重点解读新增功能、性能优化及实践价值&#xff0c;为数据库管理者与开发者提供升级…...

10个DeepSeek、ChatGPT提示词更快更好的学术文献阅读!

目录 AIGC助力快速阅读文献 10个文献阅读提示词 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ AIGC助力快速阅读文献 在当今学术界&#xff0c;海量的论文如潮水般涌来&#xff0c;想要跟上最新研究进展简直比在图书馆里找到一本没被借走的…...

基于spring boot 鲜花销售系统PPT(源码+lw+部署文档+讲解),源码可白嫖!

课题意义 随着网络不断的普及发展&#xff0c;鲜花销售系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性的信息管理系统&#xff0c;利用目前网络给用户带来的方便快捷这一特点对系统进行调整&am…...

Spring Boot 与 TDengine 的深度集成实践(三)

创建 RESTful API 编写控制器类 在 Spring Boot 项目中&#xff0c;控制器类负责处理 HTTP 请求&#xff0c;并将请求转发到相应的服务或数据访问层进行处理&#xff0c;最后返回响应结果给客户端。我们通过使用RestController和RequestMapping注解来定义控制器类和 API 路由…...

物理日志和逻辑日志

在 MySQL 的日志系统中&#xff0c;物理日志 和 逻辑日志 是两种不同类型的日志记录方式&#xff0c;它们的设计目标和实现方式有本质区别。以下是它们的详细解释和对比&#xff1a; 1. 物理日志 定义 物理日志记录的是数据页&#xff08;Page&#xff09;的物理修改&#x…...

[Deep-ML]Reshape Matrix(重塑矩阵)

Reshape Matrix&#xff08;重塑矩阵&#xff09; 题目链接&#xff1a; Reshape Matrix&#xff08;重塑矩阵&#xff09;https://www.deep-ml.com/problems/3 题目描述&#xff1a; 难度&#xff1a; easy&#xff08;简单&#xff09;。 分类&#xff1a; Linear Alg…...

Linux文件系统中的Page Cache和内存管理中的Page之间的关系

Linux文件系统中的Page Cache和内存管理中的Page之间有密切的关联&#xff0c;两者在底层机制上紧密结合&#xff0c;共同实现高效的内存和文件系统管理。以下是它们的关系和关键点&#xff1a; 核心关系 Page Cache的底层是内存Page Page Cache是由内存管理中的物理内存页&…...

day25-回溯__491.递增子序列 __46.全排列__47.全排列 II

491.递增子序列 这道题要求输出一个数组的所有非递减子序列&#xff0c;并且数组中是可以存在重复元素的&#xff0c;那么我们需要考虑的就一定是之前的树层去重的方法 并且要求非递减&#xff0c;所以我们每次添加元素到path要先判断两个条件&#xff1a; 该元素的值是否在同…...

微型导轨的制造工艺中,热处理的目的是什么?

热处理是指将金属或合金加热到一定温度&#xff0c;保温一段时间&#xff0c;然后通过适当的冷却方式使其发生物理变化&#xff0c;从而使其性能发生改变的加工技术&#xff0c;而在微型导轨的制造工艺中&#xff0c;热处理是必须的&#xff0c;那么热处理的目的是什么呢&#…...

学透Spring Boot — 018. 优雅支持多种响应格式

这是我的专栏《学透Spring Boot》的第18篇文章&#xff0c;想要更系统的学习Spring Boot&#xff0c;请访问我的专栏&#xff1a;学透 Spring Boot_postnull咖啡的博客-CSDN博客。 目录 返回不同格式的响应 Spring Boot的内容协商 控制器不用任何修改 启动内容协商配置 访…...

数据结构与算法----顺序表和复杂度

嘻嘻&#xff0c;我们用c语言来手撕顺序表&#xff01;&#xff01;&#xff01;全程高能比喻代码实战&#xff0c;保证你笑着学会&#xff01;&#xff01;&#xff01; 引言 1、数据结构是计算机存储、组织数据的方式。算法是一系列计算步骤&#xff0c;用来将输入数据转化…...

Android studio局域网屏幕共享(旧手机可以用来当监控啦)

项目地址 https://github.com/Anyuersuper/ScreenSharing 百度网盘 通过网盘分享的文件&#xff1a;ScreenSharing-master.zip 链接: https://pan.baidu.com/s/1URQnyI8zJF-IFl5_-ttXBg?pwdyuer 提取码: yuer &#x1f4f1; 屏幕分享应用 (ScreenSharing) &#x1f4cb; 项目…...

Redis持久化之RDB

RDB持久化是将当前进程数据生成快照保存到硬盘的过程&#xff0c;触发RDB持久化过程分为手动触发和自动触发。 1.触发机制 手动触发费别对应save和bgsave命令&#xff1a; save命令&#xff1a;阻塞当前Redis服务器&#xff0c;直到RDB过程完成为止&#xff0c;对于内存比较…...

Ubuntu 64-bit 交叉编译 FFmpeg(高级用户指南)

适用于 ​​ARM (aarch64)、Windows (mingw)、Android、Raspberry Pi​​ 等平台的交叉编译。 ​​&#x1f539; 1. 安装交叉编译工具链​​ ​​ARM (aarch64) 示例​ sudo apt update sudo apt install gcc-aarch64-linux-gnu g-aarch64-linux-gnu binutils-aarch64-linux…...

YOLO V8中的​“中心点邻近区域 + 动态IoU匹配“

它是联合优化正样本分配的策略&#xff0c;旨在更精准地匹配预测框与真实目标的位置关系。以下分步详解其原理&#xff1a; 1. 中心点邻近区域&#xff08;Central Region&#xff09;​​ ​​1.1 目标中心区域定义​​ ​​基础思想​​&#xff1a;将真实边界框&#xff…...

【MySQL | 八、 事务管理】

文章目录 什么是事务&#xff1f;事务的特性&#xff1a;事务的意义事务的提交查看事务提交方式事务的自动提交事务的手动提交开始事务执行SQL操作事务操作提交事务示例&#xff1a; 事务的隔离级别并发访问的基本概念并发事务的典型问题对ACID特性的影响查看和设置隔离属性各个…...

Ubuntu 下搭建 MCU 开发环境全流程指南(以 STM32 为例)

在嵌入式开发中,许多工程师都习惯于在 Windows 平台使用 Keil、IAR 等 IDE。然而,随着对自动化、可定制性以及开放工具链的需求增长,越来越多的开发者开始尝试在 Linux 环境下进行 MCU 开发。 本篇文章将以 STM32F1 系列 为例,手把手带你在 Ubuntu 下搭建一个完整的 MCU 开…...

Redis淘汰策略详解!

目录 一、为什么需要淘汰策略&#xff1f; &#x1f914;二、Redis 的淘汰策略详解 &#x1f447;三、如何选择合适的淘汰策略&#xff1f; &#x1f914;➡️✅四、如何切换 Redis 的淘汰策略&#xff1f; ⚙️&#x1f527;五、总结 &#x1f389; &#x1f31f;我的其他文章…...

基于51单片机和TM1638模块的小游戏《打地鼠》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、TM1638模块2、定时器03、定时器1 四、主函数总结 系列文章目录 前言 有两个版本&#xff0c;普中开发板版本和最小系统板版本&#xff0c;两个版本差别在于晶振频率不一样&#xff0c;其他的都相同。 本文代码…...

机器学习之数据预处理(一):缺失值处理和异常值识别的几种常用方法

始终致力于将复杂知识通俗化的不断追求中&#xff0c;不足之处欢迎批评指正。 1、噪声处理 噪声是一个测量变量中的随机错误或偏差&#xff0c;是观测值和真实值之间的误差&#xff0c;包括错误值或偏离期望的孤立点值。对于噪声的处理&#xff0c;通常可以采用数据平滑技术来…...

25/4/6 算法笔记<仿真O2DES>基础知识学习

此文章就来整理一下我学习到的O2DES仿真框架的一些核心知识 核心概念&#xff1a; 模拟器&#xff08;Simulator&#xff09;&#xff1a;模拟器是O2DES框架的核心组件&#xff0c;用来管理模拟时钟&#xff0c;事件调度和执行。可以通过Simulator类创建模拟环境&#…...

Three.js 系列专题 3:光照与阴影

内容概述 光照是 3D 场景真实感的关键。Three.js 提供了多种光源类型,每种光源有不同的效果和用途。本专题还将介绍如何启用和优化阴影效果,提升场景的深度感。 学习目标 理解不同光源类型及其应用场景。掌握在 Three.js 中添加光源并启用阴影。学会调整阴影效果以平衡真实…...

接口自动化学习五:mock工具使用

Moco简介&#xff1a; Mock是一个简单搭建模拟服务器的框架&#xff0c;可以用来模拟http、https、socket等协议。 原理&#xff1a; Mock会根据一些配置&#xff0c;启动一个真正的HTTP服务&#xff08;会监听本地的某个端口&#xff09;,当发起的请求满足某个条件时&#xf…...

Java学习——day22(Java反射基础入门)

文章目录 1.反射的定义2. 认识反射的关键API2.1 Class2.2 Field2.3 Method2.4 Constructor 3. 示例代码讲解与分析4. 编写反射示例代码的步骤4.1 定义测试类4.2 编写主程序&#xff0c;使用反射获取信息4.3 通过反射创建对象并调用方法 5. 总结6.今日生词 Java反射笔记 1.反射的…...

字符串、列表、元组、字典

字符串 双引号或者单引号中的数据&#xff0c;就是字符串 字符串输入 之前在学习input的时候&#xff0c;通过它能够完成从键盘获取数据&#xff0c;然后保存到指定的变量中&#xff1b; 注意&#xff1a;input获取的数据&#xff0c;都以字符串的方式进行保存&#xff0c;即…...

数据分析-Excel-学习笔记

Day1 复现报表聚合函数&#xff1a;日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格&#xff0c;首先要看这个表格个构成&#xff08;包含了哪些数据&#xff09;&#xff0c;几行几列&#xff0c;每一列的名称…...

Nginx 常见面试题

一、nginx常见错误及处理方法 1.1 404 bad request 一般原因&#xff1a;请求的Header过大 解决办法&#xff1a; 配置nginx.conf 相关设置1. client_header_buffer_size 16k; 2. large_client_header_buffers 4 64k;1.2 413 Request Entity Too Large 一般原因&#xff1…...

Spring 中的 @Autowired 和 @Resource

&#x1f9e9; 一、Autowired 和 Resource 的基本作用 注解来源作用AutowiredSpring 提供&#xff08;org.springframework.beans.factory.annotation.Autowired&#xff09;按类型 自动注入ResourceJDK 提供&#xff08;javax.annotation.Resource&#xff09;默认按名称 注入…...

IAGCN:登上《Nature》的深度学习可解释性情感分析模型突破

IAGCN&#xff1a;登上《Nature》的深度学习可解释性情感分析模型突破 一、技术突破背景 社交媒体时代&#xff0c;用户生成内容的情感分析需求激增。传统方面级情感分析模型在复杂语境下存在特征交互捕捉不足、情感极性判定偏差等问题。微软亚洲研究院联合清华大学提出的交互…...

Go 学习笔记 · 进阶篇 · 第一天:接口与多态

&#x1f436;Go接口与多态&#xff1a;继承没了&#xff0c;但自由炸裂&#xff01; 最近翻 Go 的代码&#xff0c;突然看到这么一段&#xff1a; type Animal interface {Speak() string }我一愣&#xff0c;咦&#xff1f;这不就是 Java 里常见的“接口”吗&#xff1f; …...

模运算:数字世界中的时空扭曲法则——从密码学到量子计算的跨维演绎

一、模宇宙基本定理&#xff1a;重构数字时空的底层逻辑 1.1 同余关系的时空折叠效应 在模运算创造的离散时空中&#xff0c;数字呈现出环状拓扑结构。当我们在模7空间观察时&#xff0c;12与5通过时空折叠达成量子纠缠&#xff1a;12 ≡ 5 (mod 7)。这种性质使得RSA加密算法…...

0303hooks-react-仿低代码平台项目

文章目录 1. 副作用2.其他内置hooks2.1 useEffect2.2 useRef2.3useMemo2.4 useCallback 3.自定义hooks4. 第三方hooks5. hooks使用原则6. hooks闭包陷阱7. 总结结语 1. 副作用 当组件渲染完成时&#xff0c;加载一个Ajax网络请求当某个state更新时&#xff0c;加载一个Ajax网络…...