微服务Redis解析部署使用全流程
目录
1、什么是Redis
2、Redis的作用
3、Redis常用的五种基本类型(重要知识点)
4、安装redis
4.1、查询镜像文件【省略】
4.2、拉取镜像文件
4.3、启动redis并设置密码
4.3.1、修改redis密码【可以不修改】
4.3.2、删除密码【坚决不推荐】
5、SpringBoot整合
1、在pom.xml文件中添加maven依赖
2、添加redis配置
3、添加redisconfig
4、添加SpringBoot启动类:
5、常用方法介绍(重要)
1.redisTemplate
2.ValueOperations=>String
3.HashOperations=>Hash
4.ListOperations=>List
5.SetOperations=>Set
6.ZSetOperations=>zSet
6.redis缓存穿透、缓存击穿、缓存雪崩区别和解决方案
1、什么是Redis
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
可以理解成一个大容量的map。
2、Redis的作用
可以做为数据库存储数据,也可以用来做缓存、计数器、分布式锁等。实际工作中很少用它做数据库。
3、Redis常用的五种基本类型(重要知识点)
-
string:字符串数据类型
-
hash:类似于对象,map的形式
-
list:表示一种线性数据结构,队列或栈
-
set:无序不可重复集合
-
zset:有序不可重复集合
另外还有三种数据类型,都不是很常用。Geospatial、Bitmap、Hyperloglog
redis可以操作位(bit),但是工作中几乎不用。
4、安装redis
基于docker的安装
4.1、查询镜像文件【省略】
#可以不操作:
docker search redis
4.2、拉取镜像文件
docker pull redis:6.2.6

4.3、启动redis并设置密码
docker run -d --name redis-6379 -p 6379:6379 redis:6.2.6 --requirepass 123456


requirepass:设置密码
【工作时:】启动redis注意事项:
-
密码一定要设置,复杂一点
-
端口映射,redis一定不能用默认端口,用默认端口一定会被攻击
4.3.1、修改redis密码【可以不修改】
# 1/进入redis容器
docker exec -it redis-6379 /bin/bash
# 2/找到redis-cli可执行文件
cd /usr/local/bin
# 3/执行redis-cli
redis-cli
# 4/查看密码
config get requirepass
# 5/授权
auth 密码
# 6/修改密码
config set requirepass 新密码
第一步骤:进入redis容器

第二步骤:找到redis-cli可执行文件

第三步骤:执行redis-cli

第四步骤:查看密码(显示没有授权)

第五步骤:授权

第六步骤:修改密码(最好还是使用123456,后面整合的时候,容易忘记。)

第七步骤:退出容器

4.3.2、删除密码【坚决不推荐】
config set requirepass ''
5、SpringBoot整合
1、在pom.xml文件中添加maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jr</groupId><artifactId>redis</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version></parent><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version><jwt.version>0.7.0</jwt.version><fastjson.version>1.2.60</fastjson.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--json--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><classifier>exec</classifier></configuration></plugin></plugins></build></project>
2、添加redis配置
#host:自身ip
spring:redis:host: 192.168.146.128 port: 6379password: 123456
3、添加redisconfig
package com.jr.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {/*** 配置 RedisTemplate<String, Object>* 设置了键和值的序列化方式,键用字符串序列化,值用JSON序列化** @return RedisTemplate*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {GenericJackson2JsonRedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();StringRedisSerializer keySerialize = new StringRedisSerializer();RedisTemplate<String, Object> result = new RedisTemplate<>();result.setConnectionFactory(redisConnectionFactory);result.setKeySerializer(keySerialize);result.setValueSerializer(valueSerializer);result.setHashKeySerializer(keySerialize);result.setHashValueSerializer(valueSerializer);return result;}}
4、添加SpringBoot启动类:
@SpringBootApplication
public class SpringBootMain {public static void main(String[] args) {SpringApplication.run(SpringBootMain.class);}
}
5、常用方法介绍(重要)
1.redisTemplate
redisTemplate.hasKey(key); //判断是否有key所对应的值,有则返回true,没有则返回false
redisTemplate.opsForValue().get(key); //有则取出key值所对应的值
redisTemplate.delete(key); //删除单个key值
redisTemplate.delete(keys); //其中keys:Collection<K> keys
redisTemplate.dump(key); //将当前传入的key值序列化为byte[]类型
redisTemplate.expire(key, timeout, unit); //设置过期时间
redisTemplate.expireAt(key, date); //设置过期时间
redisTemplate.keys(pattern); //查找匹配的key值,返回一个Set集合类型
redisTemplate.rename(oldKey, newKey); //返回传入key所存储的值的类型
redisTemplate.renameIfAbsent(oldKey, newKey); //如果旧值存在时,将旧值改为新值
redisTemplate.randomKey(); //从redis中随机取出一个key
redisTemplate.getExpire(key); //返回当前key所对应的剩余过期时间
redisTemplate.getExpire(key, unit); //返回剩余过期时间并且指定时间单位
redisTemplate.persist(key); //将key持久化保存
redisTemplate.move(key, dbIndex); //将当前数据库的key移动到指定redis中数据库当中
【测试代码】
@Slf4j
@SpringBootTest(classes = DemoHelloworldApplication.class)
@SuppressWarnings("all")
public class RedisTest {private static final String KEY = "test:commonKey";@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testpublic void testCommon() {testCommon(KEY);}public void testCommon(String key) {boolean hasKey = redisTemplate.hasKey(key); //hasKey(key);log.info("hasKey {}", hasKey);boolean delete = redisTemplate.delete(key); //delete(key);log.info("delete {}", delete);}public void delete(String key) {boolean delete = redisTemplate.delete(key);}
}
2.ValueOperations=>String
ValueOperations opsForValue = redisTemplate.opsForValue();
opsForValue.set(key, value); //设置当前的key以及value值
opsForValue.set(key, value, offset);//用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
opsForValue.set(key, value, timeout, unit); //设置当前的key以及value值并且设置过期时间
opsForValue.setBit(key, offset, value); //将二进制第offset位值变为value
opsForValue.setIfAbsent(key, value);//重新设置key对应的值,如果存在返回false,否则返回true
opsForValue.get(key, start, end); //返回key中字符串的子字符
opsForValue.getAndSet(key, value); //将旧的key设置为value,并且返回旧的key
opsForValue.multiGet(keys); //批量获取值
opsForValue.size(key); //获取字符串的长度
opsForValue.append(key, value); //在原有的值基础上新增字符串到末尾
opsForValue.increment(key,double increment);//以增量的方式将double值存储在变量中
opsForValue.increment(key,long increment); //通过increment(K key, long delta)方法以增量方式存储long值(正值则自增,负值则自减)
Map valueMap = new HashMap();
valueMap.put("valueMap1","map1");
valueMap.put("valueMap2","map2");
valueMap.put("valueMap3","map3");
opsForValue.multiSetIfAbsent(valueMap); //如果对应的map集合名称不存在,则添加否则不做修改
opsForValue.multiSet(valueMap); //设置map集合到redis
【测试代码】
@Slf4j
@SpringBootTest(classes = DemoHelloworldApplication.class)
@SuppressWarnings("all")
public class RedisTest {private static final String KEY = "test:commonKey";@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** - string:字符串数据类型*/@Testpublic void testString() {String key = "test:string";String key2 = "test:increment";String key3 = "test:object";delete(key);delete(key2);delete(key3);redisTemplate.opsForValue().set(key, "zhangsan"); // set(key, "zhangsan");Object value = redisTemplate.opsForValue().get(key); // get(key);log.info("value {}", value);redisTemplate.opsForValue().set(key, "lisi");value = redisTemplate.opsForValue().get(key);log.info("value {}", value);testCommon(key);boolean hasKey = redisTemplate.hasKey(key);log.info("hasKey {}", hasKey);redisTemplate.opsForValue().increment(key2, 10);// increment(key2, 10);计数器value = redisTemplate.opsForValue().get(key2);log.info("value {}", value);redisTemplate.opsForValue().increment(key2); // increment(key2); 涨1;increment(key2,10);涨10value = redisTemplate.opsForValue().get(key2);log.info("value {}", value);User user = new User();user.setName("zhangsan");user.setPassword("123456");redisTemplate.opsForValue().set(key3, user);value = redisTemplate.opsForValue().get(key3);log.info("value {}", value);}
}
3.HashOperations=>Hash
HashOperations opsForHash = redisTemplate.opsForHash();
opsForHash.get(key, field); //获取变量中的指定map键是否有值,如果存在该map键则获取值,没有则返回null
opsForHash.entries(key); //获取变量中的键值对
opsForHash.put(key, hashKey, value); //新增hashMap值
opsForHash.putAll(key, maps); //以map集合的形式添加键值对
opsForHash.putIfAbsent(key, hashKey, value); //仅当hashKey不存在时才设置
opsForHash.delete(key, fields); //删除一个或者多个hash表字段
opsForHash.hasKey(key, field); //查看hash表中指定字段是否存在
opsForHash.increment(key, field, long increment); //给哈希表key中的指定字段的整数值加上增量increment
opsForHash.increment(key, field, double increment); //给哈希表key中的指定字段的整数值加上增量increment
opsForHash.keys(key); //获取所有hash表中字段
opsForHash.values(key); //获取hash表中存在的所有的值
opsForHash.scan(key, options); //匹配获取键值对,ScanOptions.NONE为获取全部键对
【测试代码】
@Slf4j
@SpringBootTest(classes = DemoHelloworldApplication.class)
@SuppressWarnings("all")
public class RedisTest {private static final String KEY = "test:commonKey";@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** - hash:类似于对象,map的形式*/@Testpublic void testHash() {String key = "test:hash";redisTemplate.opsForHash().put(key, "name", "zhangsan");redisTemplate.opsForHash().put(key, "age", 12);Object name = redisTemplate.opsForHash().get(key, "name");Object age = redisTemplate.opsForHash().get(key, "age");log.info("name {}", name);log.info("age {}", age);}
}
4.ListOperations=>List
ListOperations opsForList = redisTemplate.opsForList();
opsForList.index(key, index); //通过索引获取列表中的元素
opsForList.range(key, start, end); //获取列表指定范围内的元素(start开始位置, 0是开始位置,end 结束位置, -1返回所有)
opsForList.leftPush(key, value); //存储在list的头部,即添加一个就把它放在最前面的索引处
opsForList.leftPush(key, pivot, value); //如果pivot处值存在则在pivot前面添加
opsForList.leftPushAll(key, value); //把多个值存入List中(value可以是多个值,也可以是一个Collection value)
opsForList.leftPushIfPresent(key, value); //List存在的时候再加入
opsForList.rightPush(key, value); //按照先进先出的顺序来添加(value可以是多个值,或者是Collection var2)
opsForList.rightPushAll(key, value); //在pivot元素的右边添加值
opsForList.set(key, index, value); //设置指定索引处元素的值
opsForList.trim(key, start, end); //将List列表进行剪裁
opsForList.size(key); //获取当前key的List列表长度
//移除并获取列表中第一个元素(如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止)
opsForList.leftPop(key);
opsForList.leftPop(key, timeout, unit);
//移除并获取列表最后一个元素
opsForList.rightPop(key);
opsForList.rightPop(key, timeout, unit);
//从一个队列的右边弹出一个元素并将这个元素放入另一个指定队列的最左边
opsForList.rightPopAndLeftPush(sourceKey, destinationKey);
opsForList.rightPopAndLeftPush(sourceKey, destinationKey, timeout, unit);
//删除集合中值等于value的元素(index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素; index<0, 从尾部开始删除第一个值等于value的元素)
opsForList.remove(key, index, value);
【测试代码】
@Slf4j
@SpringBootTest(classes = DemoHelloworldApplication.class)
@SuppressWarnings("all")
public class RedisTest {private static final String KEY = "test:commonKey";@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** - list:表示一种线性数据结构,队列或栈*/@Testpublic void testList() {String key = "test:list";log.info("----------------------- {}", "模拟队列");/*模拟队列*/for (int i = 0; i < 5; i++) {redisTemplate.opsForList().leftPush(key, i);}long listSize = redisTemplate.opsForList().size(key);log.info("listSize {}", listSize);for (int i = 0; i < listSize; i++) {log.info("test:list {}", redisTemplate.opsForList().rightPop(key));}listSize = redisTemplate.opsForList().size(key);log.info("listSize {}", listSize);log.info("----------------------- {}", "模拟栈");/*模拟栈*/for (int i = 0; i < 5; i++) {redisTemplate.opsForList().leftPush(key, i);}listSize = redisTemplate.opsForList().size(key);log.info("listSize {}", listSize);for (int i = 0; i < listSize; i++) {log.info("test:list {}", redisTemplate.opsForList().leftPop(key));}listSize = redisTemplate.opsForList().size(key);log.info("listSize {}", listSize);}
}
5.SetOperations=>Set
SetOperations opsForSet = redisTemplate.opsForSet();
opsForSet.add(key, values); //添加元素
opsForSet.remove(key, values); //移除元素(单个值、多个值)
opsForSet.pop(key); //删除并且返回一个随机的元素
opsForSet.size(key); //获取集合的大小
opsForSet.isMember(key, value); //判断集合是否包含value
opsForSet.intersect(key, otherKey); //获取两个集合的交集(key对应的无序集合与otherKey对应的无序集合求交集)
opsForSet.intersect(key, otherKeys);//获取多个集合的交集(Collection var2)
opsForSet.intersectAndStore(key, otherKey, destKey); //key集合与otherKey集合的交集存储到destKey集合中(其中otherKey可以为单个值或者集合)
opsForSet.intersectAndStore(key, otherKeys, destKey); //key集合与多个集合的交集存储到destKey无序集合中
opsForSet.union(key, otherKeys); //获取两个或者多个集合的并集(otherKeys可以为单个值或者是集合)
opsForSet.unionAndStore(key, otherKey, destKey); //key集合与otherKey集合的并集存储到destKey中(otherKeys可以为单个值或者是集合)
opsForSet.difference(key, otherKeys); //获取两个或者多个集合的差集(otherKeys可以为单个值或者是集合)
opsForSet.differenceAndStore(key, otherKey, destKey); //差集存储到destKey中(otherKeys可以为单个值或者集合)
opsForSet.randomMember(key); //随机获取集合中的一个元素
opsForSet.members(key); //获取集合中的所有元素
opsForSet.randomMembers(key, count); //随机获取集合中count个元素
opsForSet.distinctRandomMembers(key, count); //获取多个key无序集合中的元素(去重),count表示个数
opsForSet.scan(key, options); //遍历set类似于Interator(ScanOptions.NONE为显示所有的)
【测试代码】
@Slf4j
@SpringBootTest(classes = DemoHelloworldApplication.class)
@SuppressWarnings("all")
public class RedisTest {private static final String KEY = "test:commonKey";@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** - set:无序不可重复集合*/@Testpublic void testSet() {String key = "test:set";redisTemplate.opsForSet().add(key, "zhangsan", "lisi", "wangwu", 12, 22, 32, "wangwu", 12, "12");long listSize = redisTemplate.opsForSet().size(key);log.info("listSize {}", listSize);for (int i = 0; i < listSize; i++) {log.info("test:set {}", redisTemplate.opsForSet().pop(key));}listSize = redisTemplate.opsForSet().size(key);log.info("listSize {}", listSize);}
}
6.ZSetOperations=>zSet
ZSetOperations提供了一系列方法对有序集合进行操作
ZSetOperations opsForZSet = redisTemplate.opsForZSet();opsForZSet.add(key, value, score); //添加元素(有序集合是按照元素的score值由小到大进行排列)
opsForZSet.remove(key, values); //删除对应的value,value可以为多个值
opsForZSet.incrementScore(key, value, delta); //增加元素的score值,并返回增加后的值
opsForZSet.rank(key, value); //返回元素在集合的排名,有序集合是按照元素的score值由小到大排列
opsForZSet.reverseRank(key, value); //返回元素在集合的排名,按元素的score值由大到小排列
opsForZSet.reverseRangeWithScores(key, start,end); //获取集合中给定区间的元素(start 开始位置,end 结束位置, -1查询所有)
opsForZSet.reverseRangeByScore(key, min, max); //按照Score值查询集合中的元素,结果从小到大排序
opsForZSet.reverseRangeByScoreWithScores(key, min, max); //返回值为:Set<ZSetOperations.TypedTuple<V>>
opsForZSet.count(key, min, max); //根据score值获取集合元素数量
opsForZSet.size(key); //获取集合的大小
opsForZSet.zCard(key); //获取集合的大小
opsForZSet.score(key, value); //获取集合中key、value元素对应的score值
opsForZSet.removeRange(key, start, end); //移除指定索引位置处的成员
opsForZSet.removeRangeByScore(key, min, max); //移除指定score范围的集合成员
opsForZSet.unionAndStore(key, otherKey, destKey);//获取key和otherKey的并集并存储在destKey中(其中otherKeys可以为单个字符串或者字符串集合)
opsForZSet.intersectAndStore(key, otherKey, destKey); //获取key和otherKey的交集并存储在destKey中(其中otherKeys可以为单个字符串或者字符串集合)
【测试代码】
@Slf4j
@SpringBootTest(classes = DemoHelloworldApplication.class)
@SuppressWarnings("all")
public class RedisTest {private static final String KEY = "test:commonKey";@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** - zset:有序不可重复集合*/@Testpublic void testZset() {String key = "test:zset";redisTemplate.opsForZSet().add(key, "zhangsan", 12);redisTemplate.opsForZSet().add(key, "lisi", 22);redisTemplate.opsForZSet().add(key, "wangwu", 32);redisTemplate.opsForZSet().add(key, "wangwu1", 121);redisTemplate.opsForZSet().add(key, "wangwu2", 122);redisTemplate.opsForZSet().add(key, "wangwu3", 123);redisTemplate.opsForZSet().add(key, "wangwu4", 124);redisTemplate.opsForZSet().add(key, "wangwu5", 125);redisTemplate.opsForZSet().add(key, "wangwu6", 126);Long zCard = redisTemplate.opsForZSet().zCard(key);//long listSize = redisTemplate.opsForZSet().size(key);log.info("zCard {}", zCard);log.info("listSize {}", listSize);
// for (int i = 0; i < listSize; i++) {
// log.info("test:set {}", redisTemplate.opsForZSet().popMax(key));
// }listSize = redisTemplate.opsForZSet().size(key);log.info("listSize {}", listSize);log.info("----------------------- {}", "华丽的分割线");Set<Object> range = redisTemplate.opsForZSet().range(key, 1, 3);for (Object o : range) {log.info("range {}", o);}listSize = redisTemplate.opsForZSet().size(key);log.info("listSize {}", listSize);}
}
6.redis缓存穿透、缓存击穿、缓存雪崩区别和解决方案
https://blog.csdn.net/m0_71240584/article/details/142527527?spm=1001.2014.3001.5502
相关文章:
微服务Redis解析部署使用全流程
目录 1、什么是Redis 2、Redis的作用 3、Redis常用的五种基本类型(重要知识点) 4、安装redis 4.1、查询镜像文件【省略】 4.2、拉取镜像文件 4.3、启动redis并设置密码 4.3.1、修改redis密码【可以不修改】 4.3.2、删除密码【坚决不推荐】 5、S…...
C++之STL—常用排序算法
sort (iterator beg, iterator end, _Pred) // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // _Pred 谓词 random_shuffle(iterator beg, iterator end); // 指定范围内的元素随机调…...
【驱动】地平线X3派:备份与恢复SD卡镜像
1、备份镜像 1.1 安装gparted GParted是硬盘分区软件GNU Parted的GTK+图形界面前端,是GNOME桌面环境的默认分区软件。 GParted可以用于创建、删除、移动分区,调整分区大小,检查、复制分区等操作。可以用于调整分区以安装新操作系统、备份特定分区到另一块硬盘等。 在Ubun…...
【C++报错已解决】std::ios_base::failure
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...
matlab入门学习(四)多项式、符号函数、数据统计
一、多项式 %多项式(polynomial)%创建 p[1,2,3,4] %系数向量,按x降幂排列,最右边是常数(x的0次幂) f1poly2str(p,x) %系数向量->好看的字符串 f x^3 2 x^2 3 x 4(不能运算的式子…...
leetcode621. 任务调度器
给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个 相同种类 的任务之间必须有长度为 n 的冷却时…...
Spark 的 Skew Join 详解
Skew Join 是 Spark 中为了解决数据倾斜问题而设计的一种优化机制。数据倾斜是指在分布式计算中,由于某些 key 具有大量数据,而其他 key 数据较少,导致某些分区的数据量特别大,造成计算负载不均衡。数据倾斜会导致个别节点出现性能…...
讯飞星火编排创建智能体学习(一)最简单的智能体构建
目录 开篇 智能体的概念 编排创建智能体 创建第一个智能体 编辑 大模型节点 测试与调试 开篇 前段时间在华为全联接大会上看到讯飞星火企业级智能体平台的演示,对于拖放的可视化设计非常喜欢,刚开始以为是企业用户才有的,回来之后查…...
mac-m1安装nvm,docker,miniconda
1.安装minicondaMAC OS(M1)安装配置miniconda_mac-mini m1 conda-CSDN博客 2.安装nvm(用第二个方法)Mac电脑安装nvm(node包版本管理工具)-CSDN博客 3.安装docker dmg下载链接docker-toolbox-mac-docker-for-mac安装包下载_开源镜像站-阿里云 教程MacOS系…...
STM32F407之Flash
寄存器分类 一般寄存器分为只读存储器 (ROM) 随机存储器(RAM) 只读存储器 只读存储器也被称为ROM 在正常工作时只能读不能写。 只读存储器经历的阶段 ROM->PROM->EPROM->EEPROM ->Flash 优点:掉电不丢失,解构简单 缺点:只适…...
优化 Go 语言数据打包:性能基准测试与分析
场景:在局域网内,需要将多个机器网卡上抓到的数据包同步到一个机器上。 原有方案:tcpdump -w 写入文件,然后定时调用 rsync 进行同步。 改造方案:使用 Go 重写这个抓包逻辑及同步逻辑,直接将抓到的包通过网…...
【SQL】未订购的客户
目录 语法 需求 示例 分析 代码 语法 SELECT columns FROM table1 LEFT JOIN table2 ON table1.common_field table2.common_field; LEFT JOIN(或称为左外连接)是SQL中的一种连接类型,它用于从两个或多个表中基于连接条件返回左表…...
Qt(9.28)
widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {QPushButton *btn1 new QPushButton("登录",this);this->setFixedSize(640,480);btn1->resize(80,40);btn1->move(200,300);btn1->setIcon(QIcon("C:…...
javascript-冒泡排序
前言:好久没学习算法了,今天看了一个视频课,之前掌握很好的冒泡排序居然没写出来? <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"…...
第九届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)
一.题目分析 (1).题目 (2).题目分析 按键功能分析----存储位置的切换键 a. B1按下切换存储位置,切换后定时时间设定为当前位置存储的时间 b. B2短按切换时分秒高亮,设置完成后,长按把设置的时…...
MATLAB云计算集成:在云端扩展计算能力
摘要 MATLAB云计算集成是指将MATLAB的计算能力与云平台的弹性资源相结合,以实现高性能计算、数据处理和算法开发。本文详细介绍了MATLAB云计算的基本概念、优势、配置要点以及编程实践。 1. 云计算概述 云计算是一种通过互联网提供计算资源(如服务器、…...
基于BeagleBone Black的网页LED控制功能(flask+gpiod)
目录 项目介绍硬件介绍项目设计开发环境功能实现控制LED外设构建Webserver 功能展示项目总结 👉 【Funpack3-5】基于BeagleBone Black的网页LED控制功能 👉 Github: EmbeddedCamerata/BBB_led_flask_web_control 项目介绍 基于 BeagleBoard Black 开发板…...
【C语言】单片机map表详细解析
1、RO Size、RW Size、ROM Size分别是什么 首先将map文件翻到最下面,可以看到 1.1 RO Size:只读段 Code:程序的代码部分(也就是 .text 段),它存放了程序的指令和可执行代码。 RO Data:只读…...
Java中的继承和实现
Java中的继承和实现在面向对象编程中扮演着不同的角色,它们之间的主要区别可以从以下几个方面进行阐述: 1. 定义和用途 继承(Inheritance):继承是面向对象编程中的一个基本概念,它允许我们定义一个类&…...
uniapp云打包
ios打包 没有mac电脑,使用香蕉云编 先登录香蕉云编这个工具,新建csr文件——把csr文件下载到你电脑本地: 然后,登录苹果开发者中心 生成p12证书 1、点击+号创建证书 创建证书的时候一定要选择ios distribution app store and ad hoc类型的证书 2、上传刚才从本站生成的…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
