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

Redis客户端(Jedis、RedisTemplate、Redisson)

1. 简介

        Redis作为一个当下很火热的非关系型数据库,Java从业人员基本都离不开对Redis的使用。在Java程序中该数据库,需要借助于市面上的开源客户端,如Jedis、Spring Data Redis、Redisson,它们可以作为操作Redis非关系型数据库的桥梁。

2. 实例

2.1 Jedis

Jedis 是一个用 Java 编写的 Redis 客户端库,它提供了丰富的 API 来访问 Redis 支持的所有数据结构。Jedis 是同步的和阻塞的,这意味着在执行操作时,当前线程会被阻塞直到操作完成。

2.1.1 添加依赖

在Spring中集成Jedis。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>

2.1.2 添加配置

application.yml:

spring:redis:host: 116.198.242.56port: 26379
server:port: 8999

生成bean:

package com.xiaokai.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;/*** Author:yang* Date:2024-12-09 13:42*/
@Component
public class JedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Beanpublic Jedis jedisClient() {Jedis jedis = new Jedis(new HostAndPort(host, port));return jedis;}
}

2.1.3 测试

package com.xiaokai;import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import redis.clients.jedis.Jedis;/*** Author:yang* Date:2024-12-09 10:58*/
@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
@Slf4j
public class ApiTest {@Autowiredprivate Jedis jedisClient;@Testpublic void testJedis() {String s = jedisClient.set("jedis", "jedis");log.info("设置成功:{}", s);String value = jedisClient.get("jedis");log.info("获取成功:{}", value);}
}# 设置成功:OK
# 获取成功:jedis

可以看到Redis中已经存下了当前key-value

127.0.0.1:6379> get jedis
"jedis"

2.1.4 Jedis API

2.1.4.1 连接与断开连接
  • Jedis jedis = new Jedis("localhost", 6379);:创建一个新的 Jedis 实例连接到本地的 Redis 服务器。

  • jedis.connect();:建立连接(现在这个步骤通常是自动的,不建议手动调用)。

  • jedis.disconnect();:断开连接。

2.1.4.2 键操作
  • jedis.exists(String key);:检查给定的键是否存在。

  • jedis.del(String key);:删除给定的键。

  • jedis.keys(String pattern);:返回匹配给定模式的所有键。

  • jedis.ttl(String key);:返回给定键的剩余生存时间(以秒为单位)。

2.1.4.3 字符串(String)操作
  • jedis.set(String key, String value);:设置键的值。

  • jedis.get(String key);:获取与给定键相关联的值。

  • jedis.append(String key, String value);:将值追加到键的当前值。

  • jedis.incr(String key);:将键的值增加 1。

  • jedis.decr(String key);:将键的值减少 1。

2.1.4.4 列表(List)操作
  • jedis.lpush(String key, String... values);:将一个或多个值插入到列表的头部。

  • jedis.rpush(String key, String... values);:将一个或多个值插入到列表的尾部。

  • jedis.lpop(String key);:移除并返回列表的第一个元素。

  • jedis.rpop(String key);:移除并返回列表的最后一个元素。

  • jedis.lrange(String key, long start, long end);:返回列表中指定范围内的元素。

2.1.4.5 集合(Set)操作
  • jedis.sadd(String key, String... members);:向集合添加一个或多个成员。

  • jedis.smembers(String key);:返回集合中的所有成员。

  • jedis.srem(String key, String... members);:移除集合中的一个或多个成员。

  • jedis.sismember(String key, String member);:检查成员是否是集合的成员。

2.1.4.6 有序集合(Sorted Set)操作
  • jedis.zadd(String key, double score, String member);:向有序集合添加一个成员。

  • jedis.zrange(String key, long start, long end);:返回有序集合中指定范围内的成员。

  • jedis.zrem(String key, String... members);:移除有序集合中的一个或多个成员。

  • jedis.zscore(String key, String member);:返回成员的分数。

2.1.4.7 哈希(Hash)操作
  • jedis.hset(String key, String field, String value);:将哈希表的字段设置为值。

  • jedis.hget(String key, String field);:获取哈希表中字段的值。

  • jedis.hgetAll(String key);:获取哈希表中所有的字段和值。

  • jedis.hdel(String key, String... fields);:删除哈希表中的一个或多个字段。

2.1.4.8 发布/订阅(Pub/Sub)操作
  • jedis.publish(String channel, String message);:发布消息到频道。

  • JedisPubSub jedisPubSub = new JedisPubSub() {...};:创建一个新的 JedisPubSub 实例来订阅频道。

2.1.4.9 事务
  • jedis.multi();:开始一个事务。

  • jedis.exec();:执行事务。

2.1.4.10 脚本
  • jedis.eval(String script, int keyCount, String... params);:执行 Lua 脚本。

2.2 Spring Data Redis

Spring Data Redis 是 Spring 提供的一套操作 Redis 的抽象,它包括 RedisTemplateStringRedisTemplate 等模板类,简化了 Redis 的操作。Spring Data Redis 默认使用 Lettuce 作为客户端,但也支持 Jedis。

2.2.1 添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.2.2 添加配置

application.yml:

spring:redis:host: 116.198.242.56port: 26379
server:port: 8999

序列化配置:

import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.DefaultBaseTypeLimitingValidator;
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 使用StringRedisSerializer来序列化keyStringRedisSerializer stringRedisSerializer = new StringRedisSerializer();template.setKeySerializer(stringRedisSerializer);template.setHashKeySerializer(stringRedisSerializer);// 使用Jackson2JsonRedisSerializer来序列化valueJackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();// 配置ObjectMapper以处理多态objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(),ObjectMapper.DefaultTyping.NON_FINAL,JsonTypeInfo.As.PROPERTY);objectMapper.setDefaultTyping(new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.NON_FINAL,new DefaultBaseTypeLimitingValidator(Object.class)).init(null,Jackson2JsonRedisSerializer.Typing.NON_FINAL,null).inclusion(JsonTypeInfo.As.PROPERTY));jsonRedisSerializer.setObjectMapper(objectMapper);template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);template.afterPropertiesSet();return template;}
}

注:如果不设置序列化器,默认使用jdk序列化,存储的key为\xac\xed\x00\x05t\x00\x04test

2.2.3 测试

@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
@Slf4j
public class ApiTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedis() {try{redisTemplate.opsForValue().set("test", "test");log.info("设置成功");}catch (Exception e){log.error("设置失败", e);}String test = (String) redisTemplate.opsForValue().get("test");log.info("获取成功:{}", test);String bless = (String) redisTemplate.opsForValue().get("Bless");log.info("获取成功:{}", bless);}@Testpublic void testRedisList() {redisTemplate.opsForList().leftPush("list", "1");redisTemplate.opsForList().leftPush("list", "2");redisTemplate.opsForList().leftPush("list", "3");String list = (String) redisTemplate.opsForList().rightPop("list");log.info("获取成功:{}", list);}@Testpublic void testRedisMap() {redisTemplate.opsForHash().put("user", "key1", "value1");}
}

注:RedisTemplate可以直接使用,不需要去生成一个专有bean。

2.2.4 相关API

2.2.4.1 设置和获取键值
  • set(key, value):设置键值。

  • opsForValue().set(key, value):设置字符串(简单值)。

  • opsForValue().get(key):获取字符串值。

  • opsForValue().getAndSet(key, value):将旧的值替换为新的值,并返回旧的值。

2.2.4.2 过期时间操作
  • expire(key, timeout, unit):设置键的过期时间。

  • getExpire(key):返回键的剩余过期时间。

  • getExpire(key, unit):返回剩余过期时间并且指定时间单位。

2.2.4.3 键的操作
  • hasKey(key):判断键是否存在。

  • delete(key):删除单个键。

  • delete(Collection<K> keys):批量删除键。

  • keys(pattern):查找匹配的键值,返回一个 Set 集合类型。

2.2.4.4 列表操作
  • opsForList().leftPush(key, value):在列表左侧插入值。

  • opsForList().rightPush(key, value):在列表右侧插入值。

  • opsForList().multiGet(keys):批量获取列表中的值。

2.2.4.5集合操作
  • opsForSet().add(key, value):向集合中添加元素。

  • opsForSet().members(key):获取集合中的所有成员。

2.2.4.6 有序集合操作
  • opsForZSet().add(key, value, score):向有序集合中添加元素。

  • opsForZSet().range(key, start, end):获取有序集合中指定范围的元素。

2.2.4.7 哈希操作
  • opsForHash().put(key, hashKey, hashValue):向哈希中添加键值对。

  • opsForHash().entries(key):获取哈希中的所有键值对。

2.2.4.8 地理空间操作
  • opsForGeo().add(key, geoLocation):向地理空间添加位置。

  • opsForGeo().radius(key, circle):根据半径查询地理空间中的位置。

2.2.4.9 事务操作
  • execute(SessionCallback action):执行 Redis 事务。

2.2.4.10 流操作
  • opsForStream().add(record):向 Redis 流中添加记录。

  • opsForStream().read(recordClass, StreamOffset):从 Redis 流中读取记录。

2.3 Redisson

Redisson 是一个基于 Java 的 Redis 客户端库,它提供了多种分布式数据结构和服务,如分布式锁、原子变量、集合等。Redisson 支持多种 Redis 模式,包括单机、主从、集群和哨兵模式。

2.3.1 添加依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.17.6</version>
</dependency>

2.3.2 添加配置

application.yml(使用配置文件)

spring:redis:host: 116.198.242.56port: 26379
server:port: 8999

2.3.3 测试

@SpringBootTest(classes = Application.class)
@RunWith(SpringRunner.class)
@Slf4j
public class ApiTest {@Autowiredprivate RedissonClient redissonClient;@Testpublic void testRedissonClient() {RBucket<String> bucket = redissonClient.getBucket("test");bucket.set("test");log.info("设置成功");String test = bucket.get();log.info("获取成功:{}", test);RBucket<Object> bless = redissonClient.getBucket("Bless");bless.set("Bless");String value = (String) bless.get();log.info("获取成功:{}", value);}}

注:

  • 配置文件不需要额外的bean可以直接使用。

  • 编程式使用:

单机模式

Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("password").setDatabase(0);
RedissonClient redisson = Redisson.create(config);

集群模式

Config config = new Config();
ClusterServersConfig clusterConfig = config.useClusterServers().addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001").addNodeAddress("redis://127.0.0.1:7002");
clusterConfig.setPassword("password");
RedissonClient redisson = Redisson.create(config);

2.3.4 相关API

2.3.4.1 连接与断开连接
// 创建 Redisson 客户端实例,默认连接到本地的 Redis 服务器
RedissonClient redisson = Redisson.create();// 断开连接
redisson.shutdown();
2.3.4.2 键操作
// 检查给定的键是否存在
boolean exists = redisson.getKeys().exists("key");// 删除给定的键
redisson.getKeys().delete("key");// 返回匹配给定模式的所有键
Set<String> keys = redisson.getKeys().getKeysByPattern("pattern");// 返回给定键的剩余生存时间(以秒为单位)
long ttl = redisson.getKeys().getTTL("key");
2.3.4.3 字符串(String)操作
// 设置键的值
RBucket<String> bucket = redisson.getBucket("key");
bucket.set("value");// 获取与给定键相关联的值
String value = bucket.get();// 将值追加到键的当前值
long length = bucket.append("value");// 将键的值增加 1
RAtomicLong atomicLong = redisson.getAtomicLong("key");
atomicLong.increment();// 将键的值减少 1
atomicLong.decrement();
2.3.4.4 列表(List)操作
// 将一个或多个值插入到列表的头部
RList<String> list = redisson.getList("list");
list.leftPush("value");// 将一个或多个值插入到列表的尾部
list.rightPush("value");// 移除并返回列表的第一个元素
String element = list.leftPop();// 移除并返回列表的最后一个元素
element = list.rightPop();// 返回列表中指定范围内的元素
List<String> range = list.range(0, -1);
2.3.4.5 集合(Set)操作
// 向集合添加一个或多个成员
RSet<String> set = redisson.getSet("set");
set.add("value");// 返回集合中的所有成员
Set<String> members = set.readAll();// 移除集合中的一个或多个成员
set.remove("value");// 检查成员是否是集合的成员
boolean isMember = set.contains("value");
2.3.4.6 有序集合(Sorted Set)操作
// 向有序集合添加一个成员
RScoredSortedSet<String> sortedSet = redisson.getScoredSortedSet("sortedSet");
sortedSet.add(10.0, "value");// 返回有序集合中指定范围内的成员
List<String> range = sortedSet.getValues(0, -1);// 移除有序集合中的一个或多个成员
sortedSet.remove("value");// 返回成员的分数
Double score = sortedSet.getScore("value");
2.3.4.7 哈希(Hash)操作
// 将哈希表的字段设置为值
RMap<String, String> map = redisson.getMap("map");
map.fastPut("field", "value");// 获取哈希表中字段的值
String value = map.get("field");// 获取哈希表中所有的字段和值
Map<String, String> entries = map.readAllMap();// 删除哈希表中的一个或多个字段
map.fastRemove("field");
2.3.4.8 发布/订阅(Pub/Sub)操作
// 发布消息到频道
RTopic<String> topic = redisson.getTopic("channel");
topic.publish("message");// 创建一个新的订阅实例来订阅频道
topic.addListener(String.class, (channel, message) -> {System.out.println("Received message: " + message);
});
2.3.4.9 事务
// 开始一个事务
TransactionResult result = redisson.multi();// 执行事务中的所有命令
result.exec();
2.3.4.10 脚本
// 执行 Lua 脚本
RScript script = redisson.getScript();
RObject eval = script.eval(RScript.Mode.READ_ONLY, "return redis.call('get', KEYS[1])", RScript.ReturnType.VALUE, "myKey");

相关文章:

Redis客户端(Jedis、RedisTemplate、Redisson)

1. 简介 Redis作为一个当下很火热的非关系型数据库&#xff0c;Java从业人员基本都离不开对Redis的使用。在Java程序中该数据库&#xff0c;需要借助于市面上的开源客户端&#xff0c;如Jedis、Spring Data Redis、Redisson&#xff0c;它们可以作为操作Redis非关系型数据库的桥…...

Mybatis中SQL的执行过程

文章目录 Mybatis 框架SQL执行过程数据库操作映射方式SQL的执行过程- SQL解析- SQL参数映射- SQL预编译- SQL执行- 结果映射- 事务处理- 缓存处理- 日志记录与监控 扩展#与$的区别- $ 符号- # 符号总结示例 Mybatis SQL分类- 动态 SQL- 静态 SQL静态SQL和动态SQL选择${}、#{}与…...

【数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现顺序栈的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取…...

【论文阅读】PRIS: Practical robust invertible network for image steganography

内容简介 论文标题&#xff1a;PRIS: Practical robust invertible network for image steganography 作者&#xff1a;Hang Yang, Yitian Xu∗, Xuhua Liu∗, Xiaodong Ma∗ 发表时间&#xff1a;2024年4月11日 Engineering Applications of Artificial Intelligence 关键…...

在Linux桌面系统普及化方面的一些建议

在推动Linux桌面系统普及化的过程中&#xff0c;可以考虑以下几个方案和策略&#xff1a; 用户友好性改进&#xff1a; 界面设计&#xff1a;提升用户界面的美观性和易用性&#xff0c;使其更接近或超越主流操作系统的用户体验。软件兼容性&#xff1a;确保常用软件&#xff08…...

LLM - 多模态大模型的开源评估工具 VLMEvalKit 部署与测试 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144353087 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 VLMEva…...

数据结构(Queue队列)

前言&#xff1a; 在计算机科学中&#xff0c;数据结构是构建高效算法和程序的基础&#xff0c;而队列&#xff08;Queue&#xff09;作为一种经典的线性数据结构&#xff0c;具有重要的地位。与栈&#xff08;Stack&#xff09;不同&#xff0c;队列遵循“先进先出”&#xf…...

Qt 图形框架下图形拖动后位置跳动问题

在使用Qt 的图形框架QGraphicsScene&#xff0c;QGraphicsView实现图形显示时。遇到一个很棘手的BUG。 使用的图形是自定义的QGraphicsObject的子类。 现象是将图形添加到画布上之后&#xff0c;用鼠标拖动图形&#xff0c;图形能正常改变位置&#xff0c;当再次用鼠标点击图…...

【Linux篇】走进Linux — 开启开源操作系统之旅

文章目录 初识Linux一.Linux的起源与发展二.Linux的特点三.Linux的应用四.Linux的发行版本 Linux环境搭建一.Linux环境的搭建方式二.购买云服务器三.使用XShell远程登陆到Linux 初识Linux 一.Linux的起源与发展 1.初始动机&#xff1a; Linux是一个功能强大的开源操作系统&am…...

如何利用DBeaver配置连接MongoDB和人大金仓数据库

最近根据国产化要求&#xff0c;需要使用国产数据库&#xff0c;但习惯使用DBeaver连接各种成熟的商业或开源数据库。因此&#xff0c;就想着如何继续基于该工具&#xff0c;连接MongoDB和人大金仓数据库&#xff0c;查了半天很多地方说法不统一&#xff0c;所以自己就简单整理…...

Android 车载虚拟化底层技术-Kernel 5.10 -Android12(multi-cards)技术实现

详细代码实现见 Android Display Graphics系列文章-汇总​​​​​​Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 本文主要包括部分&#xff1a; 一、Android12的Kernel 5.10版本 1.1 Kernel 5…...

Qt之点击鼠标右键创建菜单栏使用(六)

Qt开发 系列文章 - menu&#xff08;六&#xff09; 目录 前言 一、示例演示 二、菜单栏 1.MenuBar 2.Menu 总结 前言 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08;menubar&#xff09;、多个工具栏(toolbars)、一个状态栏(status…...

开发一套SDK 第一弹

自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…...

sftp+sshpass

实现场景&#xff0c;要求客户端定时将本地的日志文件传输到服务器。 工作环境ubuntu&#xff0c;注意不通操作系统的版本不通&#xff0c;依赖的工具的版本也有所不同 实现目标需要客户端满足安装工具&#xff1a; 1、下载安装sshpass ---安装命令&#xff1a;sudo apt-ge…...

【机器学习与数据挖掘实战】案例01:基于支持向量回归的市财政收入分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支&#xff0c;专注于让计算机系统通过数据学习和改进。它利用统计和计算方法&#xff0c;使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…...

Idea实现定时任务

定时任务 什么是定时任务&#xff1f; 可以自动在项目中根据设定的时长定期执行对应的操作 实现方式 Spring 3.0 版本之后自带定时任务&#xff0c;提供了EnableScheduling注解和Scheduled注解来实现定时任务功能。 使用SpringBoot创建定时任务非常简单&#xff0c;目前主要…...

Linux 安装NFS共享文件夹

程序默认使用2049端口&#xff0c;如果被占用需要修改端口104设置为服务端 122设置为客户端 一、在线安装&#xff08;服务端和客户端执行&#xff09; yum install nfs-utils rpcbind -y二、配置启动参数&#xff08;服务端执行&#xff09; 104服务器/mnt路径下创建shareda…...

bash 判断内存利用率是否高于60%

在 Bash 脚本中&#xff0c;可以通过 free 命令获取内存利用率&#xff0c;然后结合 awk 和条件判断语句实现监控内存利用率是否高于 60%。以下是一个示例脚本&#xff1a; 1. 示例脚本 #!/bin/bash# 获取总内存和已使用内存 total_mem$(free | awk /Mem:/ {print $2}) used_…...

推送(push)项目到gitlab

文章目录 1、git init1.1、在当前目录中显示隐藏文件&#xff1a;1.2、查看已有的远程仓库1.3、确保你的本地机器已经生成了 SSH 密钥&#xff1a;1.4、将生成的公钥文件&#xff08;通常位于 ~/.ssh/id_rsa.pub&#xff09;复制到 GitLab 的 SSH 设置中&#xff1a;1.5、测试 …...

centos9升级OpenSSH

需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2&#xff08;根据需求进行升级&#xff09; 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…...

硬件成本5元-USB串口采集电表数据完整方案-ThingsPanel快速入门

ThingsPanel开源物联网平台支持广泛的协议&#xff0c;灵活自由&#xff0c;本文介绍ThingsPanel通过串口来采集电表数据&#xff0c;简单易行&#xff0c;成本低廉&#xff0c;适合入门者学习试验&#xff0c;也适合一些特定的应用场景做数据采集。 适用场景&#xff1a; 降低…...

在AWS EMR上用Hive、Spark、Airflow构建一个高效的ETL程序

在AWS EMR&#xff08;Elastic MapReduce&#xff09;上构建一个高效的ETL程序&#xff0c;使用Hive作为数据仓库&#xff0c;Spark作为计算引擎&#xff0c;Airflow作为调度工具时&#xff0c;有几个关键的设计与实施方面需要注意。 在AWS EMR上构建高效的ETL程序&#xff0c;…...

前端(四)css选择器、css的三大特性

css选择器、css的三大特性 文章目录 css选择器、css的三大特性一、css介绍二、css选择器2.1 基本选择器2.2 组合选择器2.3 交集并集选择器2.4序列选择器2.5属性选择器2.6伪类选择器2.7伪元素选择器 三、css三大特性3.1 继承性3.2 层叠性3.3 优先级 一、css介绍 CSS全称为Casca…...

vscode 打开 setting.json

按下Ctrl Shift P&#xff08;Windows/Linux&#xff09;或Cmd Shift P&#xff08;Mac&#xff09;来打开命令面板。输入open settings&#xff0c;然后选择 Open User Settings(JSON)。打开settings.json文件 ------修改设置-----&#xff1a; 1、 html代码的行长度&am…...

关于网络安全攻防演化博弈的研究小议

1. 拉高视角&#xff0c;从宏观看网络安全攻防 伴随着信息化的发展&#xff0c;网络安全的问题就一直日益突出&#xff0c;与此同时&#xff0c;网络安全技术也成为研究热点&#xff0c;直到今日也没有停止。 从微观来看&#xff0c;网络安全技术研究指的是针对某项或某几项…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(7)

1.问题描述&#xff1a; 推送通知到手机&#xff0c;怎么配置拉起应用指定的页面&#xff1f; 解决方案&#xff1a; 1、如果点击通知栏打开默认Ability的话&#xff0c; actionType可以设置为0&#xff0c; 同时可以在.clickAction.data中&#xff0c;指定待跳转的page页面…...

远程桌面防护的几种方式及优缺点分析

远程桌面登录是管理服务器最主要的方式&#xff0c;于是很多不法分子打起了远程桌面的歪心思。他们采用暴力破解或撞库的方式破解系统密码&#xff0c;悄悄潜入服务器而管理员不自知。 同时远程桌面服务中的远程代码执行漏洞也严重威胁着服务器的安全&#xff0c;攻击者可以利…...

ASP.NET|日常开发中连接Sqlite数据库详解

ASP.NET&#xff5c;日常开发中连接Sqlite数据库详解 前言一、安装和引用相关库1.1 安装 SQLite 驱动1.2 引用命名空间 二、配置连接字符串2.1 连接字符串的基本格式 三、建立数据库连接3.1 创建连接对象并打开连接 四、执行数据库操作4.1 创建表&#xff08;以简单的用户表为例…...

python的自动化seleium安装配置(包含谷歌的chromedriver)

目录 前言介绍 一、下载谷歌浏览器chromedriver (一)查看谷歌浏览器版本 (二)去官网下载谷歌驱动(chromdriver) (三)谷歌浏览器安装位置解压 (四)配置环境变量 二、pychram里下载安装selenium 三、测试selenium是否成功 前言介绍 Selenium是一个开源的自动化测试工具&…...

QT requested database does not belong to the calling thread.线程中查询数据报错

QT requested database does not belong to the calling thread.线程中查询数据报错 QString name "ttx"; QSqlQueryModel* sql_model; QString sql_comm QString("select * from dssb_moddve_loddt_tab where name%1").arg(name); sql_model->set…...

美术馆网站建设总体要求/说到很多seo人员都转行了

关于切片 按照我的理解的话&#xff0c;切片相当于是一个循环&#xff0c;语法就是for...in 列表或tuple名称&#xff0c;然后逐个遍历出来 但是切片可以根据自己想要的数据进行取舍 首先定义一个列表 Numberlist(range(100)) #0-99的数字如若想取出前20个数字的话&#xff0c;…...

电子商务网站建设与规划/百度上怎么免费开店

目 录 摘 要 i Abstract ii 1 绪论 1 1.1 课题背景及意义 1 1.2 开发工具的选用及介绍 1 1.3 选题目的和意义 2 1.4 本文主要研究的内容 2 2 需求分析 3 2.1 可行性分析 3 2.2 扫雷游戏功能描述 3 2.3 扫雷游戏用例图 4 2.4 扫雷游戏功能需求 4 2.5 扫雷游戏界面需求 5 2.6 扫雷…...

网站设计弹窗/百度怎么推广产品

L1-033 出生年&#xff08;15 分&#xff09; 以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y…...

兴仁企业建站公司/谷歌手机版下载安装

01. ip address show/ip a 检查网卡地址配置02. ping 测试网络连通性03. nmtui 图形界面修改网卡地址信息04. exit 注销05. shutdown 关机命令shutdown -h 5 指定关机时间 &#xff08;推荐&#xff09;shutdown -r 5 重启主机时间 &#xff08;推荐&#xff09;shutdown -…...

国内可访问的海外网站和应用/百度网盘怎么找片

我们直接看代码&#xff1a; <meta http-equiv"refresh" content"跳转时间&#xff08;秒数&#xff09;;urlhttps://blog.csdn.net/PanDaoxi2020&#xff08;跳转链接&#xff09;">...

出入西安最新通知今天/快排seo排名软件

根据&#xff0c;我写的一篇文章《让程序产生bug&#xff0c;从而达到自我进化&#xff0c;是否能产生真正的智能生命&#xff0c;与人类沟通》的文章&#xff08;点击打开链接&#xff09;。我们在在超级计算机里&#xff0c;进化出智能程序&#xff0c;然后将智能程序转移到机…...