Jedis(一)与Redis的关系

一、Jedis介绍:
1、背景:

Jedis是基于Java语言的Redis的客户端,Jedis = Java + Redis。Redis不仅可以使用命令来操作,现在基本上主流的语言都有API支持,比如Java、C#、C++、PHP、Node.js、Go等。在官方网站里有一些Java的客户端:Jedis、Redisson、Jredis、JDBC-Redis等,其中官方推荐使用Jedis和Redisson。简言之Jedis是Redis的Java版本API,通过使用Jedis可以操作Redis中的数据。

2、Jedis连接池介绍:

jedis连接资源的创建与销毁是很消耗程序性能,所以jedis为我们提供了jedis的连接池技术,jedis

连接池在创建时初始化一些连接对象存储到连接池中,使用jedis连接资源时不需要自己创建jedis对

象,而是从连接池中获取一个资源进行redis的操作。使用完毕后,不需要销毁该jedis连接资源,

而是将该资源归还给连接池,供其他请求使用。

二、Jedis API:
1、连接池API

JedisPoolConfig配置类

功能说明

JedisPoolConfig()

创建一个配置对象,使用无参构造方法就可以了

void setMaxTotal()

设置连接池最大的连接数

void setMaxWaitMillis()

设置得到连接对象Jedis最长等待时间

JedisPool连接池类

说明

JedisPool(配置对象,服务器名,端口号)

创建连接池

Jedis getResource()

从连接池中得到一个Jedis连接对象

void close()

连接池关闭方法,通常不关闭连接池

2、其他常用API: 

方法

功能

new Jedis(host, port)

创建Jedis的连接,参数:主机名,端口号

set(key,value)

添加一个字符串的键和值

get(key)

得到指定键的值

del(key)

删除指定键和值

hset(key,field,value)

添加一个hash类型的键-字段-值

hget(key,field)

通过hash键-字段得到它的值

lpush(key,values)

从左边添加一个list类型的键和元素

lpop(key)

从左边弹出一个元素

rpop(key)

从右边弹出一个元素

close()

关闭连接

三、SpringBoot集成Jedis: 

pom依赖:加上redis、jedis依赖

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

实际应用一般采用Redis集群,这里重点看下集群模式下的集成方式。

1、Redis集群模式:
(1)配置文件:配置redis、jedis属性信息
#redis配置
my.redis.server.jedis.pool.maxTotal=500
my.redis.server.jedis.pool.maxIdle=10
my.redis.server.jedis.pool.maxWaitMillis=5000
my.redis.server.jedis.pool.min-idle=5
my.redis.server.timeout=5000 
#哨兵配置
my.redis.sentinel.nodes=xxx.xx.xxx.111:26379,xxx.xx.xxx.222:26379,xxx.xx.333:26379
my.redis.sentinel.password=wtyy
my.redis.sentinel.master-name=mymaster
my.redis.sentinel.database=10
my.redis.sentinel.pool.max-total=10
my.redis.sentinel.pool.max-idle=5
my.redis.sentinel.pool.min-idle=5
(2)Jedis连接池配置类,连接Redis:
@Configuration
public class JedisConfig {private Logger logger = LoggerFactory.getLogger(JedisConfig.class);@Value("${my.redis.server.jedis.pool.maxTotal}")private int maxTotal;@Value("${my.redis.server.jedis.pool.maxIdle}")private int maxIdle;@Value("${my.redis.server.jedis.pool.maxWaitMillis}")private int maxWaitMillis;@Value("${my.redis.server.timeout}")private int timeout;@Value("${my.redis.sentinel.nodes}")private String redisSentinelNodes;@Value("${my.redis.sentinel.pool.max-total}")private int redisSentinelMaxTotal;@Value("${my.redis.sentinel.pool.max-idle}")private int redisSentinelMaxIdle;@Value("${my.redis.sentinel.pool.min-idle}")private int redisSentinelMinIdle;@Value("${my.redis.sentinel.master-name}")private String redisSentinelMasterName;@Value("${my.redis.sentinel.password}")private String redisSentinelPassword;@Value("${my.redis.sentinel.database}")private int dataBase;@Bean(name = "jedisPool")public JedisSentinelPool jedisPool() {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(maxTotal);jedisPoolConfig.setMaxIdle(maxIdle);jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);//sentinelString[] hosts = redisSentinelNodes.split(",");Set<String> sentinels = new HashSet<>(Arrays.asList(hosts));GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();poolConfig.setMaxTotal(redisSentinelMaxTotal);poolConfig.setMaxIdle(redisSentinelMaxIdle);poolConfig.setMinIdle(redisSentinelMinIdle);JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(redisSentinelMasterName,sentinels, jedisPoolConfig,timeout,redisSentinelPassword,dataBase);return  jedisSentinelPool;}
}
(3)Jedis工具类:
@SuppressWarnings("unused")
@Component
public class RedisClient {private static boolean BORROW = true; // 在borrow一个事例时是否提前进行validate操作private static Logger logger = Logger.getLogger(RedisClient.class);@Autowiredprivate JedisSentinelPool pool;/*** 获取连接*/public  synchronized Jedis getJedis() {try {if (pool != null) {return pool.getResource();} else {return null;}} catch (Exception e) {logger.info("连接池连接异常");return null;}}/*** @Description: 关闭连接* @param @param jedis* @return void 返回类型*/public static void getColse(Jedis jedis) {if (jedis != null) {jedis.close();}}/*** 格式化Key*/public static String format(String formatKey, String... keyValues) {if (keyValues == null || keyValues.length == 0) {return formatKey;}StringBuilder key = new StringBuilder();char[] chars = formatKey.toCharArray();int index = -1;boolean inmark = false;boolean firstinmark = false;for (int i = 0; i < chars.length; i++) {char ch = chars[i];if (ch == '{') {index++;inmark = true;firstinmark = true;} else if (ch == '}') {inmark = false;} else if (inmark) {if (firstinmark) {firstinmark = false;key.append(keyValues[index]);}} else {key.append(chars[i]);}}return key.toString();}/********************************** 针对key的操作 **************************************//*** 删除一个key** @param keyFormat*            key标识* @param keyValues*            key变量* @return 被删除的keys的数量*/public Long del(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.del(key);} finally {if (jedis != null) {jedis.close();}}}/*** 查询一个key是否存在** @param keyFormat*            key标识* @param keyValues*            key变量* @return key是否存在。*/public boolean exists(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.exists(key);} finally {if (jedis != null) {jedis.close();}}}/*** 设置一个key的过期的秒数** @param keyFormat*            key标识* @param seconds*            过期的秒数* @param keyValues*            key变量* @return 1表示设置成功, 0 表示设置失败或者无法被设置*/public Long expire(String keyFormat, int seconds, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.expire(key, seconds);} finally {if (jedis != null) {jedis.close();}}}/*** 设置一个UNIX时间戳的过期时间** @param keyFormat*            key标识* @param expireDate*            过期时间* @param keyValues*            key变量* @return 1表示设置成功, 0 表示设置失败或者无法被设置*/public Long expireAt(String keyFormat, Date expireDate, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.pexpireAt(key, expireDate.getTime());} finally {if (jedis != null) {jedis.close();}}}/*** 移除给定key的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。** @param keyFormat*            key标识* @param keyValues*            key变量* @return 当生存时间移除成功时,返回 1 . 如果 key 不存在或 key 没有设置生存时间,返回 0 .*/public Long persist(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.persist(key);} finally {if (jedis != null) {jedis.close();}}}/*** 设置一个key的过期的毫秒数** <pre>* 这个命令和 EXPIRE 命令的作用类似,但是它以毫秒为单位设置 key 的生存时间,而不像 EXPIRE 命令那样,以秒为单位。* </pre>** @param keyFormat*            key标识* @param milliSeconds*            过期的毫秒数* @param keyValues*            key变量* @return 设置成功,返回 1,不存在或设置失败,返回 0*/public Long pexpire(String keyFormat, long milliSeconds,String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.pexpire(key, milliSeconds);} finally {if (jedis != null) {jedis.close();}}}/*** 获取key的有效毫秒数** <pre>* 这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间,而不是像 TTL 命令那样,以秒为单位。* </pre>** @param keyFormat*            key标识* @param keyValues*            key变量* @return 当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以毫秒为单位,返回 key*         的剩余生存时间。*/public Long pttl(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.pttl(key);} finally {if (jedis != null) {jedis.close();}}}/*** 获取key的有效时间(单位:秒)** <pre>* 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。* </pre>** @param keyFormat*            key标识* @param keyValues*            key变量* @return 当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以秒为单位,返回 key*         的剩余生存时间。*/public Long ttl(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.ttl(key);} finally {if (jedis != null) {jedis.close();}}}/********************************** 针对字符串(string)的操作 **************************************//*** 追加一个值到key上** <pre>* 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。* 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。* </pre>** @param keyFormat*            key标识* @param value*            要追加的值* @param keyValues*            key变量* @return 返回append后字符串值(value)的长度。*/public Long append(String keyFormat, String value, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.append(key, value);} finally {if (jedis != null) {jedis.close();}}}/*** 整数原子减1** <pre>* 对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。* 如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。* 这个操作最大支持在64位有符号的整型数字。* </pre>** @param keyFormat*            key标识* @param keyValues*            key变量* @return 数字:减小之后的value*/public Long decr(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.decr(key);} finally {if (jedis != null) {jedis.close();}}}/*** 原子减指定的整数** <pre>* 将key对应的数字减decrement。如果key不存在,操作之前,key就会被置为0。* 如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。* 这个操作最多支持64位有符号的正型数字。* </pre>** @param keyFormat*            key标识* @param integer*            要减小的数值* @param keyValues*            key变量* @return 返回一个数字:减少之后的value值。*/public Long decrby(String keyFormat, long integer, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.decrBy(key, integer);} finally {if (jedis != null) {jedis.close();}}}/*** @param keyFormat*            key标识* @param keyValues*            key变量* @return key对应的value,或者null(key不存在时)*/public String get(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.get(key);} finally {if (jedis != null) {jedis.close();}}}/*** 设置一个key的value,并获取设置前的值** <pre>* 自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。* exp:* GETSET可以和INCR一起使用实现支持重置的计数功能。* 举个例子:每当有事件发生的时候,一段程序都会调用INCR给key mycounter加1,但是有时我们需要获取计数器的值,并且自动将其重置为0。* 这可以通过GETSET mycounter "0"来实现:* </pre>** @param keyFormat*            key标识* @param value*            要设置的值* @param keyValues*            key变量* @return 设置之前的值*/public String getSet(String keyFormat, String value, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.getSet(key, value);} finally {if (jedis != null) {jedis.close();}}}/*** 执行原子加1操作** <pre>* 对key对应的数字做加1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。* 如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。* 提醒:这是一个string操作,因为Redis没有专用的数字类型。key对应的string都被解释成10进制64位有符号的整型来执行这个操作。* Redis会用相应的整数表示方法存储整数,所以对于表示数字的字符串,没必要为了用字符串表示整型存储做额外开销。* </pre>** @param keyFormat*            key标识* @param keyValues*            key变量* @return 增加之后的value*/public Long incr(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.incr(key);} finally {if (jedis != null) {jedis.close();}}}/*** 执行原子加1操作,并且设置过期时间(单位:s)** <pre>* 本操作是在{@linkplain RedisClient#incr(String, String...)}之上增加了一个设置过期时间的操作* </pre>** @param keyFormat*            key标识* @param expireTime*            过期时间(单位:s)* @param keyValues*            key变量* @return 增加之后的value*/public Long incr(String keyFormat, int expireTime, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();long result = jedis.incr(key);jedis.expire(key, expireTime);return result;} finally {if (jedis != null) {jedis.close();}}}/*** 执行原子增加一个整数** <pre>* 将key对应的数字加increment。如果key不存在,操作之前,key就会被置为0。* 如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。* 查看方法{@linkplain RedisClient#incr(String, String...)}了解关于增减操作的额外信息。* </pre>** @param keyFormat*            key标识* @param increment*            要增加的数值* @param keyValues*            key变量* @return 增加后的value*/public Long incrBy(String keyFormat, long increment, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.incrBy(key, increment);} finally {if (jedis != null) {jedis.close();}}}/*** 执行原子增加一个浮点数** <pre>* 将key对应的数字加increment。如果key不存在,操作之前,key就会被置为0。* 如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。* </pre>** @param keyFormat*            key标识* @param increment*            要增加的数值* @param keyValues*            key变量* @return 增加后的value*/public Double incrByFloat(String keyFormat, double increment,String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.incrByFloat(key, increment);} finally {if (jedis != null) {jedis.close();}}}/*** 设置一个key的value值** <pre>* 警告:如果key已经存在了,它会被覆盖,而不管它是什么类型。* </pre>** @param keyFormat*            key标识* @param value*            要设置的值* @param keyValues*            key变量** @return 总是"OK"*/public String set(String keyFormat, String value, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.set(key, value);} finally {if (jedis != null) {jedis.close();}}}/*** 设置key-value并设置过期时间(单位:秒)** <pre>* 设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期。* 该命令相当于执行了{@link #set(String, String, String...) SET} + {@link #expire(String, int, String...) EXPIRE}.并且该操作是原子的* </pre>** @param keyFormat*            key标识* @param seconds*            超时时间(单位:s)* @param value*            设置的值* @param keyValues*            key变量* @return 状态码*/public String setex(String keyFormat, int seconds, String value,String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.setex(key, seconds, value);} finally {if (jedis != null) {jedis.close();}}}/*** 设置key-value并设置过期时间(单位:毫秒)** <pre>* 跟{@link #setex(String, int, String, String...)}效果差不多,唯一区别是超时时间是ms* </pre>** @param keyFormat*            key标识* @param milliseconds*            超时时间(单位:ms)* @param value*            设置的值* @param keyValues*            key变量* @return 状态码*/public String psetex(String keyFormat, int milliseconds, String value,String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.psetex(key, (long) milliseconds, value);} finally {if (jedis != null) {jedis.close();}}}/*** 设置的一个关键的价值,只有当该键不存在** <pre>* 如果key不存在,就设置key对应字符串value。在这种情况下,该命令和SET一样。* 当key已经存在时,就不做任何操作。SETNX是"SET if Not eXists"。* </pre>** @param keyFormat*            key标识* @param value*            设置的value* @param keyValues*            key变量* @return 1 如果key被set,0 如果key没有被set*/public Long setnx(String keyFormat, String value, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.setnx(key, value);} finally {if (jedis != null) {jedis.close();}}}/*** 设置hash里面一个字段的值** @param keyFormat*            key标识* @param field*            字段* @param value*            值* @param keyValues*            key变量* @return 含义如下:1如果field是一个新的字段 0如果field原来在map里面已经存在**/public Long hset(String keyFormat, String field, String value,String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.hset(key, field, value);} finally {if (jedis != null) {jedis.close();}}}/******************************* SET 操作 *************************//*** 添加一个元素到集合(set)里** <pre>* 添加一个指定的member元素到集合的 key中.* 如果已经在集合key中存在则忽略.如果集合key 不存在,则新建集合key,并添加member元素到集合key中.* 如果key 的类型不是集合则返回错误.* </pre>** @param keyFormat*            key标识* @param value*            元素* @param keyValues*            key变量* @return 返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素.*/public Long sadd(String keyFormat, String value, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.sadd(key, value);} finally {if (jedis != null) {jedis.close();}}}/*** 获取集合里面的元素数量** @param keyFormat*            key标识* @param keyValues*            key变量* @return 集合的基数(元素的数量),如果key不存在,则返回 0.*/public Long scard(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.scard(key);} finally {if (jedis != null) {jedis.close();}}}/*** 获取集合里面的所有key** @param keyFormat*            key标识* @param keyValues*            key变量* @return 集合中的所有元素.*/public Set<String> smembers(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.smembers(key);} finally {if (jedis != null) {jedis.close();}}}/*** 删除并获取一个集合里面的元素** <pre>* 移除并返回一个集合中的随机元素* 该命令与 {@link #srandmember(String, String...)}相似,不同的是srandmember命令返回一个随机元素但是不移除.* </pre>** @param keyFormat*            key标识* @param keyValues*            key变量* @return 被移除的元素, 当key不存在的时候返回 null .*/public String spop(String keyFormat, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.spop(key);} finally {if (jedis != null) {jedis.close();}}}/*** 从集合里删除一个元素** @param keyFormat*            key标识* @param member*            要删除的元素* @param keyValues*            key变量* @return 从集合中移除元素的个数,不包括不存在的成员.*/public Long srem(String keyFormat, String member, String... keyValues) {String key = format(keyFormat, keyValues);Jedis jedis = null;try {jedis = getJedis();return jedis.srem(key, member);} finally {if (jedis != null) {jedis.close();}}}/**省略 其他不常用操作**/}
2、Redis单机模式:

配置方式有两种:

(1)代码配置Redis连接:省略jedis的一些属性配置

my.redis.server.host=xxx.xx.xxx
my.redis.server.port=6379
my.redis.server.password = wtyy
my.redis.server.jedis.pool.maxTotal=500
my.redis.server.jedis.pool.maxIdle=10
my.redis.server.jedis.pool.maxWaitMillis=5000
my.redis.server.jedis.pool.min-idle=5
my.redis.server.timeout=5000 
@Configuration
public class JedisConfig {private Logger logger = LoggerFactory.getLogger(JedisConfig.class);@Value("${my.redis.server.host}")private String host;@Value("${my.redis.server.port}")private int port;@Value("${my.redis.server.password}")private String password;@Value("${my.redis.server.jedis.pool.maxTotal}")private int maxTotal;@Value("${my.redis.server.jedis.pool.maxIdle}")private int maxIdle;@Value("${my.redis.server.jedis.pool.maxWaitMillis}")private int maxWaitMillis;@Value("${my.redis.server.timeout}")private int timeout;@Bean(name = "jedisPool")public JedisPool jedisPool() {JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(maxTotal);config.setMaxIdle(maxIdle);config.setMaxWaitMillis(maxWaitMillis);return new JedisPool(config, host, port, timeout,password);}
}

(2)在配置文件中配置redis连接:不建议使用

spring.redis.database=1
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=500
spring.redis.pool.min-idle=0
spring.redis.timeout=0

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

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

相关文章

【系统DFX】如何诊断占用过多 CPU、内存、IO 等的神秘进程?

热门面试问题&#xff1a;如何诊断占用过多 CPU、内存、IO 等的神秘进程&#xff1f; 下图展示了 Linux 系统中有用的工具。 &#x1f539;’vmstat’ - 报告有关进程、内存、分页、块 IO、陷阱和 CPU 活动的信息。&#x1f539;’iostat’ - 报告系统的 CPU 和输入/输出统计信…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏2(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言添加小动物模型动画动物AI脚本效果 添加石头石头模型拾取物品效果 源码完结 系列目录 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏1&#xff08;附项目源码&#xff09; 【制作100个unity游戏之23】…

ubuntu22.04安装filebeat报错解决

1、查看报错 journalctl -u filebeat 或者 filebeat -c /etc/filebeat/filebeat.yml找到报错信息 runtime/cgo: pthread_create failed: Operation not permitted 2、解决报错 在filebeat.yml配置文件添加如下配置&#xff0c;重启filebeat seccomp:default_action: allow…

Prometheus 薪资翻倍的监控系统?

1. 介绍与架构 Prometheus是一个开源的系统监控和警报工具包&#xff0c;用于收集和存储时间序列数据&#xff0c;包括指标信息、记录时间戳以及可选的键值对标签。许多公司使用Prometheus监控K8s集群。 2. 合适与不合适场景 合适场景 Prometheus适用于记录各种数字时间序列…

构筑双品牌矩阵背后,广汽埃安讲出能源生态闭环的“新故事”

“一路繁花”用来形容广汽埃安的2023年并不为过。 2023年12月28日&#xff0c;埃安达成累计产销百万辆的目标&#xff0c;成为全球最快破百万的纯电品牌、新能源品牌以及汽车品牌&#xff1b;全年累计销量超48万辆&#xff0c;同比增长77%。 值得一提的是&#xff0c;2023年以…

C#中ArrayList运行机制及其涉及的装箱拆箱

C#中ArrayList运行机制及其涉及的装箱拆箱 1.1 基本用法1.1.1 属性1.1.2 方法 1.2 内部实现1.3 装箱1.4 拆箱1.5 object对象的相等性比较1.6 总结1.7 其他简单结构类 1.1 基本用法 命名空间&#xff1a; using System.Collections; 1.1.1 属性 Capacity&#xff1a;获取或设…

江苏省力学学会副理事长钱向东、邬萱一行来访天洑软件

近日&#xff0c;江苏省力学学会副理事长钱向东、邬萱率调研组一行来访天洑软件。 会上&#xff0c;双方就平台建设、成果转化、产品研发、品牌宣传、人才培养等方面开展了广泛深入的交流。江苏省力学学会副理事长钱向东、邬萱&#xff0c;分享了学会的平台优势和资源优势以及…

IP地址和端口

1. IP地址&#xff1a; 简介&#xff1a; IP 协议是为计算机网络相互连接进行通信而设计的协议。在因特网中&#xff0c;它是能使连接到网上的所 有计算机网络实现相互通信的一套规则&#xff0c;规定了计算机在因特网上进行通信时应当遵守的规则。任 何厂家生产的计算机系统…

ubuntu20安装网络调试助手遇到缺少qt4相关库的问题

最近需要做套接字通讯的工作&#xff0c;最好是有一个网络调试软件能够接受或者发送套接字&#xff0c;测试代码能够正常通讯。windows下有很多&#xff0c;但是linux下比较少&#xff0c;使用广泛的是下面这一款。 1、安装 首先从网盘&#xff08;链接: https://pan.baidu.c…

dom-to-image-more 使用

与网上不同的使用方式&#xff1a; 官网 dom-to-image-more - npm 这里不会出现两行缩略不行的bug yarn add dom-to-image-more 下面 生成图片并下载图片 const picture ref() const dom2img () > {var node picture.valuedomtoimage.toPng(node, { cacheBust: t…

LabVIEW高级CAN通信系统

LabVIEW高级CAN通信系统 在现代卫星通信和数据处理领域&#xff0c;精确的数据管理和控制系统是至关重要的。设计了一个基于LabVIEW的CAN通信系统&#xff0c;它结合了FPGA技术和LabVIEW软件&#xff0c;主要应用于模拟卫星平台的数据交换。这个系统的设计不仅充分体现了FPGA在…

C# 使用屏障来使多线程并发操作保持同步

写在前面 以下是微软官方对屏障类的介绍&#xff0c;System.Threading.Barrier 可用来作为实现并发同步操作的基本单元&#xff0c;让多个线程(参与者)分阶段并行处理目标算法。在达到代码中的屏障点之前&#xff0c;每个参与者将继续执行&#xff0c;屏障表示工作阶段的末尾&…

微信小程序调取相机实现拍照/录屏

1.效果 2.创建子组件 index.wxml代码 <xr-scene id"xr-scenecameraglb" ar-system bind:ready"handleReady" bind:ar-ready"handleARReady" > <!-- 初始化模型 --><xr-assets bind:loaded"handleAssetsLoaded">…

WhatsApp怎么营销引流?

随着移动互联网的普及&#xff0c;越来越多的企业开始利用社交媒体平台来进行推广和营销。其中&#xff0c;全球最流行的即时通讯软件之一 WhatsApp&#xff0c;为企业提供了一个新的营销渠道。但是&#xff0c;许多企业不知道如何利用 WhatsApp 进行营销引流。今天&#xff0c…

虚拟机网络配置及Moba工具的使用

A、设置IP和网关 1、设置IP [roothadoop00 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 &#xff08;修改如下标红内容&#xff0c;没有的就添加&#xff09; DEVICEeth0 HWADDR08:00:27:BD:9D:B5 #不用改 TYPEEthernet UUID53e4e4b6-9724-43ab-9da7-68792e611031…

不停机迁移,TDengine 在 3D 打印技术中的“焕新”之路

小T导读&#xff1a;自 2021 年我们正式使用 TDengine 至今已接近三年&#xff0c;现在 TDengine 已经成熟应用于我们多个项目当中&#xff0c;凭借着强大的读写存储能力&#xff0c;为我司多项业务的核心数据保驾护航。近期我们团队刚好完成 TDengine 2.x 到 3.x 的数据迁移&a…

VAD语音分割算法详解

1 VAD算法介绍 1.1 语音基本概念 声波通过空气传播&#xff0c;被麦克风接收&#xff0c;通过采样、量化、编码转换为离散的数字信号&#xff0c;即波形文件。音量、音高和音色是声音的基本属性。 采样&#xff1a;原始的语音信号是连续的模拟信号&#xff0c;需要对语音进行…

2024区块链应用趋势,RWA实物资产化

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 实物资产通证化&#xff0…

ffmpeg本地TS和M3U8播放流程及调试过程

本地TS播放过程 本地M3U8播放过程 http工作流程 http分两个步骤 1、获取m3u8文件&#xff0c;这个是在哪里开始读的&#xff1f; 2、获取data数据&#xff0c;这个是从http_read开始读&#xff0c;可以通过修改这里实现buffer数据和引擎对接 3、s->user_agent,s->off,…

Python tkinter (2) —— Button标签

Python的标准Tk GUI工具包的接口 目录 Button 简单示例 设置按钮宽高 设置响应事件 匿名函数调用事件 退出按钮 总结 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Button Button标签在窗口中显示按钮的控件。 简单示例 实现一个…