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

建筑网站编辑工作内容/怎么在百度上推广自己的店铺

建筑网站编辑工作内容,怎么在百度上推广自己的店铺,同城做哪个网站推广效果好,设计说明万能模板500字Spring缓存使用 缓存注解 对于Spring,缓存组件例如EhCache是可拔插的,而缓存注解是通用的。 Cacheable 标记在方法或者类上,标识该方法或类支持缓存。Spring调用注解标识方法后会将返回值缓存到redis,以保证下次同条件调用该方…

Spring缓存使用

缓存注解

对于Spring,缓存组件例如EhCache是可拔插的,而缓存注解是通用的。

@Cacheable

标记在方法或者类上,标识该方法或类支持缓存。Spring调用注解标识方法后会将返回值缓存到redis,以保证下次同条件调用该方法时直接从缓存中获取返回值。这样就不需要再重新执行该方法的业务处理过程,提高效率。
@Cacheable常用的三个参数如下:
cacheNames 缓存名称
key 缓存的key,需要注意key的写法哈
condition 缓存执行的条件,返回true时候执行
cacheManager 使用的cacheManager的bean名称
sync 如果多个请求同时来访问同一个key的数据,则sync表示加锁同步,等第一个请求返回数据后,其他请求直接获取缓存里的数据。

@Cacheable(value = "DICT", key = "'getDictById'+#id", sync = true)
@CachePut

标记在方法或者类上,标识该方法或类支持缓存。每次都会执行目标方法,并将执行结果以键值对的形式存入指定的缓存中。

@CachePut(value = "DICT", key = "'getDictById'+#model.getId()")
@CacheEvict

@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即
value表示清除操作是发生在哪些Cache上的(对应Cache的名称);
key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;
condition表示清除操作发生的条件。
allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。
beforeInvocation 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

@CacheEvict(value = "DICT",key = "'getDictById'+#model.getId()",beforeInvocation=false)

使用Ehcache作为缓存

pom坐标
  <dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><version>2.8.3</version></dependency><!-- Ehcache依赖此组件创建bean --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.1.5.RELEASE</version></dependency>
ehcache.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"updateCheck="false"><diskStore path="java.io.tmpdir/Tmp_EhCache" /><!-- defaultCache,是默认的缓存策略 --><!-- 如果你指定的缓存策略没有找到,那么就用这个默认的缓存策略 --><!-- external:缓存对象是否一直存在,如果设置为true的话,那么timeout就没有效果,缓存就会一直存在,一般默认就是false --><!-- maxElementsInMemory:内存中可以缓存多少个缓存条目 --><!-- overflowToDisk:如果内存不够的时候,是否溢出到磁盘 --><!-- diskPersistent:是否启用磁盘持久化的机制,在jvm崩溃的时候和重启之间 --><!-- timeToIdleSeconds:对象最大的闲置的时间,如果超出闲置的时间,可能就会过期  单位:秒 当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大--><!-- timeToLiveSeconds:对象最多存活的时间  单位:秒 当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是存活时间无穷大--><!-- memoryStoreEvictionPolicy:当缓存数量达到了最大的指定条目数的时候,需要采用一定的算法,从缓存中清除一批数据,LRU,最近最少使用算法,最近一段时间内,最少使用的那些数据,就被干掉了 --><defaultCacheeternal="false"maxElementsInMemory="1000"overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="300"timeToLiveSeconds="600"memoryStoreEvictionPolicy="LRU" /><!-- 手动指定的缓存策略 --><!-- 对不同的数据,缓存策略可以在这里配置多种 --><cachename="local"  eternal="false"maxElementsInMemory="1000"overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="300"timeToLiveSeconds="600"memoryStoreEvictionPolicy="LRU" />    
</ehcache>
EhcacheConfiguration.java
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;@Configuration
@EnableCaching
public class EhcacheConfiguration {@Beanpublic EhCacheManagerFactoryBean cacheManagerFactoryBean(){EhCacheManagerFactoryBean bean = new EhCacheManagerFactoryBean();bean.setConfigLocation(new ClassPathResource("ehcache.xml"));bean.setShared(true);return bean;}@Beanpublic EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){return new EhCacheCacheManager(bean.getObject());} 
}
使用
@Service
public class EhcahceServiceImpl implements EhcahceService {private static final String CACHE_STRATEGY = "local";@CachePut(value=CACHE_STRATEGY,key="#root.methodName+#info.getProduct_id()")@Overridepublic ProductInfo saveProductInfo(ProductInfo info) throws Exception {return info;}@Cacheable(value=CACHE_STRATEGY,key="#root.methodName+#id")@Overridepublic ProductInfo getProductInfoById(Long id) throws Exception {return null;}}

使用redis作为缓存

pom坐标
        <!--redis 配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>
yml配置
spring:# redis配置redis:password: 123456# 集群模式cluster:nodes: 127.0.0.1:1000,127.0.0.1:2000# 哨兵模式#sentinel:#master: sentinel #哨兵的名字 #下面是所有哨兵集群节点#nodes: 11.11.11.111:26379,11.11.11.111:26380jedis:pool:#最大连接数max-active: 200#最大阻塞等待时间(负数表示没限制)max-wait: -1#最大空闲max-idle: 8#最小空闲min-idle: 0#连接超时时间expireSecond: 604800 #7天
redisCacheManage配置

此处设计了两种不同cacheName的redis缓存

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;
import java.util.HashMap;
import java.util.Map;@Configuration
@EnableCaching
@Slf4j
public class CacheConfig {@Value("${spring.redis.expireSecond}")private Integer expireSecond;@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {return new RedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),this.getRedisCacheConfigurationWithTtl(600), // 默认策略,未配置的 key 会使用这个this.getRedisCacheConfigurationMap() // 指定 key 策略);}private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();redisCacheConfigurationMap.put("Dict", this.getRedisCacheConfigurationWithTtl(600));redisCacheConfigurationMap.put("COL_KEY", this.getRedisCacheConfigurationWithTtl(expireSecond));return redisCacheConfigurationMap;}private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())).entryTtl(Duration.ofSeconds(seconds));return config;}
}
使用同上

同时使用两种缓存

配置
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;@Configuration
@EnableCaching
@Slf4j
public class CacheConfig {@Value("${spring.redis.expireSecond}")private Integer expireSecond;@Beanpublic EhCacheManagerFactoryBean cacheManagerFactoryBean() {EhCacheManagerFactoryBean bean = new EhCacheManagerFactoryBean();bean.setConfigLocation(new ClassPathResource("ehcache.xml"));bean.setShared(true);return bean;}@Bean@Primarypublic EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean) {return new EhCacheCacheManager(bean.getObject());}@Beanpublic RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {// 使用缓存的默认配置RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())).entryTtl(Duration.ofSeconds(expireSecond));RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config);return builder.build();}
}
指定缓存使用
    @Cacheable(value = CACHE_NAME, key = "#root.methodName+#code",cacheManager = "redisCacheManager")

当redis出现问题时,如何禁用redis,直连数据库

1.yml配置文件忽略掉redis配置 spring.autoconfigure.exclude:org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
2.根据条件加载CacheConfig类,当spring.redis.useRedis=true时加载,否则不加载@ConditionalOnProperty(prefix = "spring.redis", value = "useRedis", havingValue = "true", matchIfMissing = true)
public class CacheConfig{}
Redis工具类

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnection;
import org.springframework.data.redis.core.RedisConnectionUtils;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;import javax.annotation.Resource;@Service
@ConditionalOnProperty(prefix = "spring.redis", value = "useRedis", havingValue = "true", matchIfMissing = true)
public class RedisService {@Resourceprivate RedisConnectionFactory redisConnectionFactory;//会出现循环依赖---Circular reference//RedisService引用JedisPool--JedisPool在RedisService,只有创建RedisService的实例才可以获取JedisPool的bean//所以需要单独拿出JedisPool的bean/*** 获取单个对象** @param prefix* @param key* @param data* @return*/public <T> T get(KeyPrefix prefix, String key, Class<T> data) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();//生成真正的key  className+":"+prefix;  BasePrefix:id1String realKey = prefix.getPrefix() + key;String sval = jedis.get(realKey);//将String转换为Bean入后传出T t = stringToBean(sval, data);return t;} finally {returnToPool(jedisConnection);}}/*** 移除对象,删除** @param prefix* @param key* @return*/public boolean delete(KeyPrefix prefix, String key) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();String realKey = prefix.getPrefix() + key;long ret = jedis.del(realKey);return ret > 0;//删除成功,返回大于0} finally {returnToPool(jedisConnection);}}/*** 设置单个、多个对象** @param prefix* @param key* @param value* @return*/public <T> boolean set(KeyPrefix prefix, String key, T value) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();String realKey = prefix.getPrefix() + key;String s = beanToString(value);if (s == null || s.length() <= 0) {return false;}int seconds = prefix.getExpireSeconds();if (seconds <= 0) { //永不过期jedis.set(realKey, s);} else {jedis.setex(realKey, seconds, s);}return true;} finally {returnToPool(jedisConnection);}}/*** 减少值** @param prefix* @param key* @return*/public <T> Long decr(KeyPrefix prefix, String key) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();String realKey = prefix.getPrefix() + key;return jedis.decr(realKey);} finally {returnToPool(jedisConnection);}}/*** 增加值** @param prefix* @param key* @return*/public <T> Long incr(KeyPrefix prefix, String key) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();String realKey = prefix.getPrefix() + key;return jedis.incr(realKey);} finally {returnToPool(jedisConnection);}}/*** 获取key的过期时间*/public <T> Long ttl(KeyPrefix prefix, String key) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();String realKey = prefix.getPrefix() + key;return jedis.ttl(realKey);} finally {returnToPool(jedisConnection);}}/*** 设置key的过期时间*/public <T> void setExpire(KeyPrefix prefix, String key, int expire) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();String realKey = prefix.getPrefix() + key;jedis.expire(realKey, expire);} finally {returnToPool(jedisConnection);}}/*** 检查key是否存在** @param prefix* @param key* @return*/public <T> boolean exitsKey(KeyPrefix prefix, String key) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();String realKey = prefix.getPrefix() + key;return jedis.exists(realKey);} finally {returnToPool(jedisConnection);}}/*** 将字符串转换为Bean对象* <p>* parseInt()返回的是基本类型int 而valueOf()返回的是包装类Integer* Integer是可以使用对象方法的  而int类型就不能和Object类型进行互相转换 。* int a=Integer.parseInt(s);* Integer b=Integer.valueOf(s);*/public static <T> T stringToBean(String s, Class<T> clazz) {if (s == null || s.length() == 0 || clazz == null) {return null;}if (clazz == int.class || clazz == Integer.class) {return ((T)Integer.valueOf(s));} else if (clazz == String.class) {return (T)s;} else if (clazz == long.class || clazz == Long.class) {return (T)Long.valueOf(s);} else {JSONObject json = JSON.parseObject(s);return JSON.toJavaObject(json, clazz);}}/*** 将Bean对象转换为字符串类型** @param <T>*/public static <T> String beanToString(T value) {//如果是nullif (value == null) {return null;}//如果不是nullClass<?> clazz = value.getClass();if (clazz == int.class || clazz == Integer.class) {return "" + value;} else if (clazz == String.class) {return "" + value;} else if (clazz == long.class || clazz == Long.class) {return "" + value;} else {return JSON.toJSONString(value);}}private void returnToPool(JedisConnection jedisConnection) {if (jedisConnection != null) {RedisConnectionUtils.releaseConnection(jedisConnection, redisConnectionFactory);}}public <T> boolean set(String key, T value) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();//将T类型转换为String类型String s = beanToString(value);if (s == null) {return false;}jedis.set(key, s);return true;} finally {returnToPool(jedisConnection);}}public <T> T get(String key, Class<T> data) {JedisConnection jedisConnection = (JedisConnection)RedisConnectionUtils.getConnection(redisConnectionFactory, true);Jedis jedis = null;try {jedis = jedisConnection.getNativeConnection();String sval = jedis.get(key);//将String转换为Bean入后传出T t = stringToBean(sval, data);return t;} finally {returnToPool(jedisConnection);}}
}

相关文章:

spring缓存的使用

Spring缓存使用 缓存注解 对于Spring&#xff0c;缓存组件例如EhCache是可拔插的&#xff0c;而缓存注解是通用的。 Cacheable 标记在方法或者类上&#xff0c;标识该方法或类支持缓存。Spring调用注解标识方法后会将返回值缓存到redis&#xff0c;以保证下次同条件调用该方…...

交换整数的二进制奇偶位

题目&#xff1a;写一个宏&#xff0c;可以将一个整数的二进制位的奇数位和偶数位交换。 假设我们举例&#xff1a;10 那么他的二进制就是&#xff1a;00000000 00000000 00000000 00001010 交换以后组成的新的数就是 5 怎么用写这个宏呢&#xff1f; 1.分别拿出奇数位和偶数位…...

在做了frp的实验室服务器不同端口间传输文件

背景 实验室有两台服务器&#xff0c;使用的是一个IP&#xff0c;两个端口&#xff0c;给人看上去是一台服务器的两个端口&#xff0c;实际是两台服务器。 现在我需要从一个端口传输一个文件夹到另外一个端口&#xff0c;实际上是从一个机器传输到另外一个机器。 操作 在两台…...

数据结构链表力扣例题AC(3)——代码以及思路记录

160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 AC写法一 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {//思…...

C++初阶:容器适配器priority_queue常用接口详解及模拟实现、仿函数介绍

介绍完了stack和queue的介绍以及模拟的相关内容后&#xff1a;C初阶&#xff1a;容器适配器介绍、stack和queue常用接口详解及模拟实现 接下来进行priority_queue的介绍以及模拟&#xff1a; 文章目录 1.priority_queue的介绍和使用1.1priority_queue的初步介绍1.2priority_que…...

提取淘宝店铺联系方式的爬虫工具

随着电子商务的快速发展&#xff0c;淘宝成为了许多人购物的首选平台。而对于一些商家来说&#xff0c;获取淘宝店铺的联系方式是非常重要的&#xff0c;以便建立更加直接和有效的沟通渠道。本文将介绍一种基于Python的爬虫工具&#xff0c;可以帮助我们提取淘宝店铺的联系方式…...

Eureka服务搭建

1️⃣搭建服务 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>启动类加注解 EnableEurekaServer SpringBootApplication public…...

SORA技术报告

文档链接&#xff1a;https://openai.com/research/video-generation-models-as-world-simulators 文章目录 Video generation models as world simulatorsTurning visual data into patchesVideo compression networkSpacetime latent patchesScaling transformers for video …...

Python Web开发记录 Day1:HTML

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、HTML1、前端引入和HTML标签①前端引入②浏览…...

六、回归与聚类算法 - 模型保存与加载

目录 1、API 2、案例 欠拟合与过拟合线性回归的改进 - 岭回归分类算法&#xff1a;逻辑回归模型保存与加载无监督学习&#xff1a;K-means算法 1、API 2、案例...

Spring事务模板及afterCommit存在的坑

大家好&#xff0c;我是墨哥&#xff08;隐墨星辰&#xff09;。今天的内容来源于两个线上问题&#xff0c;主要和大家聊聊为什么支付系统中基本只使用事务模板方法&#xff0c;而不使用声明式事务Transaction注解&#xff0c;以及使用afterCommit()出现连接未按预期释放导致的…...

【区块链】联盟链

区块链中的联盟链 写在最前面**FAQs** 联盟链&#xff1a;区块链技术的新兴力量**联盟链的定义****联盟链的技术架构**共识机制智能合约加密技术身份认证 **联盟链的特点**高效性安全性可控性隐私保护 **联盟链的应用场景****金融服务****供应链管理****身份验证****跨境支付**…...

Oracle case when end和decode的区别

Oracle中的CASE WHEN和DECODE都是条件表达式&#xff0c;但它们在某些方面有所不同。 CASE WHEN&#xff1a; CASE WHEN是一个条件表达式&#xff0c;允许您基于条件返回不同的值。它具有以下结构&#xff1a; sql CASE WHEN condition1 THEN result1 WHEN condition2 THE…...

Java导出pdf格式文件

Java实现导出pdf &#xff5c;word &#xff5c;ppt 格式文件 controller层&#xff1a; ApiOperation("导出")GetMapping("/download")public void download(RequestParam("userId") Long userId ,HttpServletResponse response) {reportResul…...

Socket、UDP、TCP协议和简单实现基于UDP的客户端服务端

目录 Socket TCP和UDP区别 UDP&#xff1a;无连接&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 TCP&#xff1a;有连接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 无连接和有连接 可靠传输和不可靠传输 面向数据报和面向字节流…...

发布订阅模式:观察者模式的一种变体

发布-订阅模型&#xff08;Publish-Subscribe Model&#xff09;的底层机制通常基于观察者模式。 发布-订阅模型是观察者模式的一种变体。 在观察者模式中&#xff0c;主题&#xff08;或被观察者&#xff09;维护了一组观察者&#xff0c;当主题的状态发生变化时&#xff0c…...

TiDB离线部署、Tiup部署TiDB

先做tidb准备工作&#xff1a; 部署 TiDB 前的环境检查操作&#xff1a;TiDB 环境与系统配置检查 | PingCAP 文档中心 1.查看数据盘 fdisk -l &#xff08;2,3&#xff09;本人的分区已经是 ext4 文件系统不用分区&#xff0c;具体官方文档的分区&#xff1a; 4.查看数据盘…...

10GBase-T万兆电口模块助力数据中心实现高效数据传输

10GBase-T万兆电口模块一种高速、高效的网络连接解决方案&#xff0c;具有快速传输速度和稳定可靠的特点。它可以在数据中心中广泛应用&#xff0c;提供出色的网络性能和可扩展性&#xff0c;为数据中心的发展做出了重要的贡献。 一、10GBase-T万兆电口模块的特点与优势 高速传…...

使用Docker中部署GitLab 避坑指南

在容器化的世界中&#xff0c;Docker已经成为了我们部署和管理应用程序的首选工具。然而&#xff0c;在使用Docker部署GitLab时&#xff0c;我们可能会遇到一些问题&#xff0c;本文将为你提供一份详细的避坑指南。网上的教程有的都没说清楚&#xff0c;或者干脆是错的。摸索了…...

我的NPI项目之设备系统启动(八) -- Android14的GKI2.0开发步骤和注意事项

GKI是什么&#xff1f; Google为什么要推行GKI&#xff1f; GKI全称General Kernel Image。GKI在framework和kernel之间提供了标准接口&#xff0c;使得android OS能够轻松适配/维护/兼容不同的设备和linux kernel。 Google引入GKI的目的是将Framework和Kernel进一步的解耦。因…...

鼠标右键助手专业版 MouseBoost PRO for Mac v3.3.6中文破解

MouseBoost Pro mac版是一款简单实用的鼠标右键助手专业版&#xff0c;MouseBoost Pro for Mac只要轻点你的鼠标右键&#xff0c;就可以激活你想要的各种功能&#xff0c;让你的工作效率大幅度提高&#xff0c;非常好用。 软件下载&#xff1a;MouseBoost PRO for Mac v3.3.6中…...

React学习计划-react-hooks补充

React Hooks 1. 使用hooks理由 高阶组件为了复用&#xff0c;导致代码层级复杂生命周期的复杂 2. useState(保存组件状态) const [state, setstate] useState(initialState)3. useEffect(处理副作用)和useLayoutEffect(同步执行副作用) 使用方式&#xff1a; useEffect(…...

KTV点歌系统vue+springboot音乐歌曲播放器系统

目前现有的KTV点歌系统对于用户而言其在线点歌流程仍然过于繁琐&#xff0c;对于歌曲而言其系统安全性并不能保障。同时整套系统所使用的技术相对较为落后&#xff0c;界面不能动态化展示。相比较于其它同类型网站而言不能体现技术先进性。 1.2 项目目标 KTV点歌系统的后台开发…...

vue video 多个视频切换后视频不显示的解决方法

先说一下我这边的需求是视频需要轮播&#xff0c;一个人员有多个视频&#xff0c;左右轮播是轮播某个人员下的视频&#xff0c;上下切换是切换人员。 vue 代码 <el-carouselindicator-position"none"ref"carousel"arrow"always":interval&qu…...

多态与代码屎山

到底什么是多态呢?多态是面向未来的,比如企业采购为例: 一般分为线上合线下两种, 我们设计一个父类叫做"采购", 里面做一些共通的处理: 申请, 承认, 支付, 购买方式. 然后让各自的子类(线上,线下)实现自己的方法.实际调用过程中传入不同的对象就可以.到此为止项目开…...

Git基本操作(2)

Git基本操作&#xff08;2&#xff09; 上交文件之后&#xff0c;git文件的变化git cat-file HEAD指针里面有啥文件被修改git statusgit diff 文件名 版本回退&#xff08;git reset&#xff09;撤销回退git reflog 撤销的三种情况还没有addgit checkout -- [file] 已经add还没…...

编程笔记 Golang基础 023 切片

编程笔记 Golang基础 023 切片 一、切片二、定义与初始化三、基本操作四、示例 Go语言中的切片&#xff08;slices&#xff09;是基于数组的抽象数据类型&#xff0c;它提供了一种灵活的方式来处理可变长度的数据序列。切片本身不存储任何数据&#xff0c;而是指向底层数组的一…...

qt 软件发布(Windows)

1. 开发环境 QtCreator MSVC编译器 2. 源码编译 生成release或者debug版本的exe可执行文件(x64或x86) 3. windeployqt 打包 ①左下角开始菜单栏找到QT的命令交互对话框&#xff0c;如下图MSVC 2017 64-bit(根据第二步编译的类型选择64位或者32位)。 ②cd 切换到第二步可…...

《汇编语言》- 读书笔记 - 第11章-标志寄存器

《汇编语言》- 读书笔记 - 第11章-标志寄存器 标志寄存器指令与标志位关系11.1 ZF&#xff08;Zero Flag&#xff0c;零标志位&#xff09;11.2 PF&#xff08;Parity Flag&#xff0c;奇偶标志位&#xff09;11.3 SF&#xff08;Sign Flag&#xff0c;符号标志位&#xff09;处…...

1.QT简介(介绍、安装,项目创建等)

1. QT介绍 Qt&#xff08;官方发音 [kju:t]&#xff09;是一个跨平台的C开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序 Qt 是纯 C 开发的&#xff0c;正常情况下需要先学习C语言、然后在学习C然后才能使用…...