Spring Data Redis + Redis数据缓存学习笔记

文章目录

  • 1 Redis 入门
    • 1.1 简介
    • 1.2 Redis服务启动与停止(Windows)
      • 1.2.1 服务启动命令
      • 1.2.2 客户端连接命令
      • 1.2.3 修改Redis配置文件
      • 1.2.4 Redis客户端图形工具
  • 2. Redis数据类型
    • 2.1 五种常用数据类型介绍
  • 3. Redis常用命令
    • 3.1 字符串操作命令
    • 3.2 哈希操作命令
    • 3.3 列表操作命令
    • 3.4 集合操作命令
    • 3.5 有序集合操作命令
    • 3.6 通用命令
  • 2 Spring Data Redis使用方式
    • 2.1 导入依赖(maven 坐标)
    • 2.2 配置数据源
    • 2.3 编写配置类
    • 2.4 测试 redis 连接和操作
    • 2.5 使用 Java 操作 Redis
    • 2.6 五种常见数据类型的一般使用场景
      • 字符串(String)
      • 哈希(Hash)
      • 列表(List)
      • 集合(Set)
      • 有序集合(Sorted Set)

1 Redis 入门

1.1 简介

Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。官网:https://redis.io 中文网:https://www.redis.net.cn/
key-value结构存储主要特点:

  • 基于内存存储,读写性能高
  • 适合存储热点数据(热点商品、资讯、新闻)
  • 企业应用广泛

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。所谓的 NoSql(Not Only SQL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。
关系型数据库(RDBMS):Mysql、Oracle、DB2、SQLServer
非关系型数据库(NoSql):Redis、Mongo db、MemCached

1.2 Redis服务启动与停止(Windows)

1.2.1 服务启动命令

redis-server.exe redis.windows.confRedis服务默认端口号为 6379 ,通过快捷键Ctrl + C 即可停止Redis服务,当Redis服务启动成功后,可通过客户端进行连接。

1.2.2 客户端连接命令

通过redis-cli.exe命令默认连接的是本地的redis服务,并且使用默认6379端口。也可以通过指定如下参数连接:

  • -h ip地址
  • -p 端口号
  • -a 密码(如果需要)

1.2.3 修改Redis配置文件

设置Redis服务密码,修改redis.windows.conf 文件,添加 requirepass 123456
注意:修改密码后需要重启Redis服务才能生效,Redis配置文件中 # 表示注释。
重启Redis后,再次连接Redis时,需加上密码,否则连接失败。此时,-h 和 -p 参数可省略不写。

redis-cli.exe -h localhost -p 6379 -a 123456

1.2.4 Redis客户端图形工具

默认提供的客户端连接工具界面不太友好,同时操作也较为麻烦,接下来,引入一个Redis客户端图形工具。
image.png

2. Redis数据类型

2.1 五种常用数据类型介绍

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set / zset

各种数据类型特点

  • 字符串(string):普通字符串,Redis中最简单的数据类型
  • 哈希(hash):也叫散列,类似于Java中的HashMap结构
  • 列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
  • 集合(set):无序集合,没有重复元素,类似于Java中的HashSet
  • 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

3. Redis常用命令

3.1 字符串操作命令

Redis 中字符串类型常用命令:

SET key value           # 设置指定key的值
GET key                 # 获取指定key的值
SETEX key seconds value # 设置指定key的值,并将 key 的过期时间设为 seconds 秒
SETNX key value         # 只有在 key 不存在时设置 key 的值

更多命令可以参考Redis中文网:https://www.redis.net.cn

3.2 哈希操作命令

Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:

HSET key field value # 将哈希表 key 中的字段 field 的值设为 value
HGET key field       # 获取存储在哈希表中指定字段的值
HDEL key field       # 删除存储在哈希表中的指定字段
HKEYS key            # 获取哈希表中所有字段
HVALS key            # 获取哈希表中所有值

3.3 列表操作命令

Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:

# 将一个或多个值插入到列表头部
LPUSH key value1 [value2]

# 获取列表指定范围内的元素
LRANGE key start stop 

# 移除并获取列表最后一个元素
RPOP key 

LLEN key # 获取列表长度

# 移出并获取列表的最后一个元素
# 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
BRPOP key1 [key2 ] timeout

3.4 集合操作命令

Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:

SADD key member1 [member2] #向集合添加一个或多个成员
SMEMBERS key               #返回集合中的所有成员
SCARD key                  #获取集合的成员数
SINTER key1 [key2]         #返回给定所有集合的交集
SUNION key1 [key2]         #返回所有给定集合的并集
SREM key member1 [member2] #移除集合中一个或多个成员

3.5 有序集合操作命令

Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数。常用命令:

ZADD key score1 member1 [score2 member2] #向有序集合添加一个或多个成员
ZRANGE key start stop [WITHSCORES]       #通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member             #有序集合中对指定成员的分数加上增量 increment
ZREM key member [member ...]             #移除有序集合中的一个或多个成员

3.6 通用命令

Redis的通用命令是不分数据类型的,都可以使用的命令:

KEYS pattern 	#查找所有符合给定模式( pattern)的 key 
EXISTS key 		#检查给定 key 是否存在
TYPE key 		  #返回 key 所储存的值的类型
DEL key 		  #该命令用于在 key 存在是删除 key

2 Spring Data Redis使用方式

Redis 的 Java 客户端很多,常用的几种:

  • Jedis
  • Lettuce
  • Spring Data Redis

Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。

Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。
网址:https://spring.io/projects/spring-data-redis

2.1 导入依赖(maven 坐标)

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

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,对相关api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:string数据操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:hash类型的数据操作
  • ListOperations:list类型的数据操作

2.2 配置数据源

在application.yml中添加 redis 的相关配置(确保已安装 redis)

redis:
    host: localhost
    port: 6379
    password: 123456
    database: 10 # 指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15

database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。可以通过修改Redis配置文件来指定数据库的数量。
添加数据后,记得使用 select 10 选择到配置使用的数据库中,方可查看到添加的数据。

2.3 编写配置类

@Configuration
@Slf4j
public class RedisConfiguration {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建redis模板对象...");
        RedisTemplate redisTemplate = new RedisTemplate();
        //设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

解释说明:
当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,故设置为StringRedisSerializer序列化器。

@Bean注解用于告诉Spring容器,被注解的方法将返回一个对象,该对象要注册为Spring应用上下文中的bean。当Spring容器启动时,它会查找所有带有@Bean注解的方法,并调用这些方法,将返回的实例注册到Spring容器中,以便在需要时能够自动装配(autowire)这些bean。

疑问:为什么要在模版配置方法前面添加@Bean注解?

  1. 配置RedisTemplateRedisTemplate是Spring Data Redis提供的一个高级抽象,用于简化Redis数据的访问。通过@Bean注解,你能够自定义RedisTemplate的配置,比如设置连接工厂、序列化器等,然后将这个配置好的RedisTemplate实例注册到Spring容器中。这样,在Spring应用的其他部分,你就可以通过自动装配(如使用@Autowired注解)来使用这个配置好的RedisTemplate实例了。
  2. 解耦:将RedisTemplate的配置和使用解耦。你不需要在每个需要使用Redis的地方都手动创建和配置RedisTemplate。相反,你只需要在配置类中配置一次,然后在需要的地方通过Spring的依赖注入机制来使用它。
  3. 可重用性:由于RedisTemplate是作为一个bean注册在Spring容器中的,因此它是可重用的。你可以在应用的多个部分中注入同一个RedisTemplate实例,而不需要为每个使用场景都创建一个新的实例。
  4. 易于测试:通过将RedisTemplate的配置和创建逻辑封装在配置类中,并使用@Bean注解来注册它,你可以更容易地编写针对使用RedisTemplate的代码的单元测试。你可以使用Spring的测试支持来模拟或替换RedisTemplate,以便在测试环境中运行你的代码,而无需连接到实际的Redis服务器。
  5. 支持多种配置:如果你的应用需要多种配置的RedisTemplate实例(例如,用于不同的Redis数据库或具有不同序列化设置的实例),你可以通过在同一配置类中定义多个带有@Bean注解的方法来轻松实现这一点。Spring容器将能够区分这些不同的bean,并在需要时将它们注入到正确的位置。

2.4 测试 redis 连接和操作

可以通过一个 main 方法测试,这里介绍单元测试方式:

@SpringBootTest
public class SpringDataRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testRedisTemplate(){
        System.out.println(redisTemplate);
        //string数据操作
        ValueOperations valueOperations = redisTemplate.opsForValue();
        //hash类型的数据操作
        HashOperations hashOperations = redisTemplate.opsForHash();
        //list类型的数据操作
        ListOperations listOperations = redisTemplate.opsForList();
        //set类型数据操作
        SetOperations setOperations = redisTemplate.opsForSet();
        //zset类型数据操作
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    }
}

运行后,提示测试成功即可!

2.5 使用 Java 操作 Redis

主要分为以下几种操作:

  1. 操作字符串类型
  2. 操作集合数据类型
  3. 操作列表数据类型
  4. 操作哈希数据类型
  5. 操作有序集合数据类型
  6. 通用的操作命令
/**
     * 操作字符串类型的数据
     */
    @Test
    public void testString() {
        // 设置键值对
        redisTemplate.opsForValue().set("name", "小明");
        // 获取对应key的值
        String city = (String) redisTemplate.opsForValue().get("name");
        System.out.println(city);
        // 添加String类型的数据,同时设置过期时间
        redisTemplate.opsForValue().set("code", "1234", 3, TimeUnit.MINUTES);

        // 在某个key不存在是设置值
        redisTemplate.opsForValue().setIfAbsent("lock", "1");
        redisTemplate.opsForValue().setIfAbsent("lock", "2");
    }

    /**
     * 操作集合类型的数据
     */
    @Test
    public void testSet() {
        SetOperations setOperations = redisTemplate.opsForSet();

        // 添加元素 set1不存在创建并添加,存在直接添加
        setOperations.add("set1", "a", "b", "c");
        setOperations.add("set2", "a", "c", "f");

        // 获取set1中的所有成员
        Set member = setOperations.members("set1");
        System.out.println(member);

        // 统计元素数量
        Long size = setOperations.size("set1");
        System.out.println(size);

        // 计算交集
        Set intersect = setOperations.intersect("set1", "set2");
        System.out.println(intersect);

        // 计算并集
        Set union = setOperations.union("set1", "set2");
        System.out.println(union);

        // 移除局部元素
        setOperations.remove("set1", "a", "b");
    }

    /**
     * 操作列表类型的数据
     */
    @Test
    public void testList() {
        ListOperations listOperations = redisTemplate.opsForList();

        // 将对多个值从左到右插入到list中
        listOperations.leftPushAll("mylist", "a", "b", "c");
        // 将多个值从左到右插入到list中(头部插入)
        listOperations.leftPush("mylist", "d");

        // 获取从0到-1的所有元素(即全部元素)
        List muList = listOperations.range("mylist", 0, -1);
        System.out.println(muList);

        // 从list的右边移除并返回最后一个元素
        listOperations.rightPop("mylist");

        // 统计元素数量
        Long size = listOperations.size("mylist");
        System.out.println(size);
    }

    /**
     * 操作哈希类型的数据
     */
    @Test
    public void testHash() {
        HashOperations hashOperations = redisTemplate.opsForHash();

        // 添加一个hash字段并赋值==对象和属性的关系
        hashOperations.put("100", "name", "tom");
        hashOperations.put("100", "age", "20");

        // 获取字段中某个元素
        String name = (String) hashOperations.get("100", "name");
        System.out.println(name);

        // 获取所有的字段名
        Set keys = hashOperations.keys("100");
        System.out.println(keys);

        // 获取所有的字段值
        List values = hashOperations.values("100");
        System.out.println(values);

        // 删除字段age
        hashOperations.delete("100", "age");
    }

    /**
     * 操作有序集合类型的数据
     */
    @Test
    public void testZset() {
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        // 像zset中添加元素并设置其分数
        zSetOperations.add("zset1", "a", 10);
        zSetOperations.add("zset1", "b", 12);
        zSetOperations.add("zset1", "c", 9);

        // 按照分数高低获取zset中的所有元素
        Set zset1 = zSetOperations.range("zset1", 0, -1);
        System.out.println(zset1);

        // 将zset1中的c分数改为10
        zSetOperations.incrementScore("zset1", "c", 10);
        // 移除两个元素
        zSetOperations.remove("zset1", "a", "b");
    }


    /**
     * 通用命令操作
     */
    @Test
    public void testCommon() {
        // 获取所有键 * 通配符
        Set keys = redisTemplate.keys("*");
        System.out.println(keys);

        // 检查是否存在某个键 key = ?
        Boolean name = redisTemplate.hasKey("name");
        Boolean set1 = redisTemplate.hasKey("set1");

        // 遍历keys集合获取每个keys的类型 DataType是枚举了redis的list\string\set\zset\hash等类型
        for (Object key : keys) {
            DataType type = redisTemplate.type(key);
            System.out.println(type.name());
        }

        // 删除某个键关联的数据
        redisTemplate.delete("mylist");
    }

运行之后配合 redis 可视化工具可以看到以上代码添加的数据,一定要先切换到数据库号为 10 的 redis 数据库方可查看到相关数据。
控制台查看效果:
image.png
可视化工具查看效果:
image.png

2.6 五种常见数据类型的一般使用场景

字符串(String)

适用场景

  • 缓存:将常用的数据(如用户信息、页面内容等)存储在 Redis 的 String 类型中,以减轻数据库的压力,提高访问速度。
  • 计数器:利用 Redis 的自增(INCR)和自减(DECR)操作,可以很方便地实现计数功能,如网站的访问次数、点赞数等。
  • 分布式锁:基于 String 类型的特性,可以实现分布式锁,保证在分布式系统中的数据一致性和并发控制。

哈希(Hash)

适用场景

  • 对象属性存储:将对象的各个属性存储在 Hash 类型中,每个字段对应一个属性,方便快速查找和更新用户信息、商品信息等。
  • 缓存对象:对于一些复杂的对象,可以将其序列化后存储在 Hash 类型中,避免多次数据库查询。
  • 配置信息:使用 Hash 类型来存储配置信息,如数据库连接参数、日志级别等,方便快速读取和更新。

列表(List)

适用场景

  • 消息队列:List 类型可以实现简单的消息队列,将消息依次插入到列表的一端,消费者从另一端取出消息,实现异步处理和解耦。
  • 动态数据流:如社交平台中的朋友圈,可以使用 List 存储用户的动态内容,新的动态插入到列表头部,用户读取动态时从头部获取最新内容。

集合(Set)

适用场景

  • 标签系统:在开发博客系统或商品系统时,可以使用 Set 存储每篇文章或商品的标签,方便根据标签进行分类和搜索。
  • 共同好友:在社交应用中,可以利用 Set 存储用户的好友列表,通过求交集来找出共同的好友,实现共同兴趣的推荐。
  • 黑名单管理:将需要屏蔽的用户或信息存储在 Set 中,方便快速查找和删除。

有序集合(Sorted Set)

适用场景

  • 排行榜:在游戏应用或社交应用中,可以使用 Sorted Set 存储用户的得分信息,根据分数排名,实现排行榜功能。
  • 延时任务:将任务的执行时间作为分数,将任务存储在 Sorted Set 中,定时从集合中取出需要执行的任务。
  • 热度排名:在新闻、视频等应用中,可以根据内容的点击量、观看时长等作为分数,使用 Sorted Set 进行热度排名。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库的约束条件和用户管理

约束条件&#xff1a; 主键&#xff1a;主键约束 primary key 用于标识表中的主键列的值&#xff0c;而且这个值是全表当中唯一的&#xff0c;而且只不能为null 一个表只能有一个主键。 外键&#xff1a;用来建立表与表之间的关系。确保外键中的值于另一个表的主键值匹配&a…

golang AST语法树解析

1. 源码示例 package mainimport ("context" )// Foo 结构体 type Foo struct {i int }// Bar 接口 type Bar interface {Do(ctx context.Context) error }// main方法 func main() {a : 1 }2. Golang中的AST golang官方提供的几个包&#xff0c;可以帮助我们进行A…

集线器、交换机、路由器的区别,冲突域、广播域

冲突域 定义&#xff1a;同一时间内只能有一台设备发送信息的范围。 分层&#xff1a;基于OSI模型的第一层物理层。 广播域 定义&#xff1a;如果某个站点发出一个广播信号&#xff0c;所有能接受到这个信号的设备的范围称为一个广播域。 分层&#xff1a;基于OSI模型的第二…

为ppt中的文字配色

文字的颜色来源于ppt不可删去的图像的颜色 从各类搜索网站中搜索ppt如何配色&#xff0c;有如下几点&#xff1a; 1.可以使用对比色&#xff0c;表示强调。 2.可以使用近似色&#xff0c;使得和谐统一。 3.最好一张ppt中&#xff0c;使用的颜色不超过三种主要颜色。 但我想强调…

第二证券:电影暑期档持续升温 农机自动驾驶驶入快车道

农机自动驾驶打开驶入快车道 得益于农机补贴、土地流通、高标准农田制造等方针引导&#xff0c;叠加技术突围和用户降本增效的内生需求&#xff0c;我国正处于农业2.0向农业3.0的过渡阶段。其间农机自动驾驶系统是结束农业3.0&#xff08;即自动化&#xff09;的要害并迎来快速…

【瑞吉外卖 | day07】移动端菜品展示、购物车、下单

文章目录 瑞吉外卖 — day71. 导入用户地址簿相关功能代码1.1 需求分析1.2 数据模型1.3 代码开发 2. 菜品展示2.1 需求分析2.2 代码开发 3. 购物车3.1 需求分析3.2 数据模型3.3 代码开发 4. 下单4.1 需求分析4.2 数据模型4.3 代码开发 瑞吉外卖 — day7 移动端相关业务功能 —…

Java实验4

实验内容 考试题 要求在一个界面内至少显示5道选择题&#xff0c;每道题4个选项。题目从数据库读取。表结构自定义。 另有2个命令按钮&#xff0c;分别为“重新答题”&#xff08;全部选项及正确答题数清空&#xff09;和“提交”&#xff08;计算&#xff09;&#xff0c;在…

【芯片设计- RTL 数字逻辑设计入门 9.1 -- CRG模块】

请阅读【芯片设计 RTL 数字逻辑设计扫盲 】 转自&#xff1a;芯片设计基础 – CRG模块 文章目录 CRG模块CRG时钟系统CRG复位系统同步复位同步复位的优点同步复位的缺点 异步复位异步复位的优点异步复位的缺点 异步复位同步释放 CRG模块 CRG是芯片里的时钟和复位生成模块&#…

27.js实现鼠标拖拽

e.offsetX是鼠标距离准确事件源的左上角距离 e.clientX是鼠标距离浏览器可视窗口左上角的距离 e.pageX是鼠标距离文档左上角的距离 /* 当鼠标点击div时开始挪动&#xff0c;当鼠标抬起&#xff0c;div静止——事件源是div 当鼠标点击后,鼠标在移动——事件源…

Web开发:卡片翻转效果(HTML、CSS)

目录 一、实现效果 二、完整代码 三、实现过程 1、页面结构 2、初始样式 3、翻转效果 4、图片大小问题 一、实现效果 如下图所示&#xff0c;当鼠标移入某个盒子&#xff0c;就反转这个盒子&#xff0c;并显示其背面的内容——卡片翻转效果&#xff1b; 卡片翻转效果 二…

【STM32 IDE】使用STM32CubeIDE创建一个工程

关于IDE的下载安装和环境配置这里暂且不介绍&#xff0c;我们直接使用STM32F407ZGT6创建工程。 这里需要注意两点&#xff1a; 创建工程时&#xff0c;默认使用最新版本的固件包&#xff08;HAL库&#xff09;&#xff0c;好像还不让更改。如果本地电脑位置没有该版本的包&…

webpack优化

优化方向 热更新 概念 /** hmr: hot module replacement 热模块替换 / 模块热更新作用&#xff1a; 一个模块发生改变&#xff0c;只会重新打包这一个模块&#xff08;而不是打包所有模块&#xff09;&#xff0c;极大的提升了构建速度样式文件&#xff1a; 可以使用hmr功能…

防火墙-NAT策略和智能选路

一、背景技术 在日常网络环境&#xff0c;内部网络想要访问外网无法直接进行通信&#xff0c;这时候就需要进行NAT地址转换&#xff0c;而在防火墙上配置NAT和路由器上有点小区别&#xff0c;思路基本一致&#xff0c;这次主要就以防火防火墙配置NAT策略为例&#xff0c;防火墙…

【学习css3】使用flex和grid实现等高元素布局

过往的实现方法是使用浮动加计算布局来实现&#xff0c;当flex和grid问世时&#xff0c;这一切将变得简单起来 一、简单的两列实现 1、先看页面效果 2、css代码 .container {padding: 10px;width: 100ch;margin: 0 auto;box-shadow: inset 0 0 0 2px #ccc;}.column {margin: 2…

git clone 报错 Unable to negotiate

Unable to negotiate with 192.168.110.10 port 39418: no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc fatal: Could not read from remote repository. 查询支持哪些加密算法 ssh -Q cipher 修改文件 /etc/ssh/ssh_config…

AR0132AT 1/3 英寸 CMOS 数字图像传感器(AR0132AT6R、AR0132AT6C)适用于监控和高清视频等多种应用

AR0132AT 1/3 英寸 CMOS 数字图像传感器&#xff0c;带 1280H x 960V 有效像素阵列。它能在线性或高动态模式下捕捉图像&#xff0c;且带有卷帘快门读取。它包含了多种复杂的摄像功能&#xff0c;如自动曝光控制、开窗&#xff0c;以及视频和单帧模式。它适用于低光度和高动态范…

基于AT89C51单片机构造波形发生器设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机构造波形发生器设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 摘要 仿真图 总体结构框图 仿真程序效果图 原理图 代码 系统论文&#xff08;部分&…

Qcom平台通过Hexagon IDE 测试程序性能指导

Qcom平台通过Hexagon IDE 测试程序性能指导 1 安装Hexagon IDE工具2 测试工程2.1 打开Hexagon IDE2.2 新建工程2.3 添加测试案例2.3.1 方法一&#xff1a;新建2.3.2 方法二&#xff1a;拷贝 2.4 配置测试环境2.4.1 包含头文件2.4.2 添加程序优化功能(需先bulid一下)2.4.3 添加g…

【14】Github Copilot环境搭建

环境搭建 这里以Visual Studio Code为例&#xff0c;安装好vs code&#xff0c;打开扩展侧边菜单栏&#xff0c;搜索“Github Copilot”&#xff0c;会出现如下图的两个插件&#xff0c;点击安装第一个&#xff0c;另一个会附带一起安装&#xff0c;然后弹出提示重新启动vs co…

阿里云CDN- https(设计支付宝春节开奖业务)

HTTP相关概念 1. HTTP概述 http是最广泛的网络协议&#xff0c;是客户端与服务器之间的请求与应答的标准&#xff08;TCP&#xff09;&#xff0c;用于www服务器传输超文本到本地浏览器的传输协议&#xff0c;使浏览器更加高效&#xff0c;网络传输减少。 2.HTTPS概述 http…