SpringBoot--中间件技术-2:整合redis,redis实战小案例,springboot cache,cache简化redis的实现,含代码

SpringBoot整合Redis

实现步骤

  1. 导pom文件坐标

    <!--redis依赖-->
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. yaml主配置文件,配置redis端口号

    spring:redis:host: localhostport: 6379
    
  3. 测试类

    字符串专用类:StringRedisTemplate stringRedisTemplate

    @Autowired
    public RedisTemplate redisTemplate;
    @Test
    public void stringTest(){// 各种类型支持stringRedisTemplate.opsForValue();stringRedisTemplate.opsForList();stringRedisTemplate.opsForSet();stringRedisTemplate.opsForHash();stringRedisTemplate.opsForZSet();// 字符串stringRedisTemplate.opsForValue().set("teacher","刘老板");String teacher = stringRedisTemplate.opsForValue().get("teacher");System.out.println("stringRedisTemplate输出结果"+teacher);// 操作list列表stringRedisTemplate.opsForList().leftPush("tang","李白");stringRedisTemplate.opsForList().leftPush("tang","杜甫");stringRedisTemplate.opsForList().leftPushAll("songAll","欧阳修","苏轼","苏辙");List<String> songAll = stringRedisTemplate.opsForList().range("songAll", 0, 2);songAll.forEach(System.out::println);}
    

    对象专用类:RedisTemplate redisTemplate

    @Autowired(required = false)
    public RedisTemplate redisTemplate;
    @Test
    public void redisTemplate(){// 各种类型支持redisTemplate.opsForValue();redisTemplate.opsForList();redisTemplate.opsForSet();redisTemplate.opsForHash();redisTemplate.opsForZSet();ValueOperations valueOperations = redisTemplate.opsForValue();valueOperations.set("panda","花花");String panda = (String) valueOperations.get("panda");System.out.println(panda);Student student = new Student(1,"惠晨怡","女");redisTemplate.opsForValue().set("stu",student);Student student1 = (Student) redisTemplate.opsForValue().get("stu");System.out.println(student1);redisTemplate.opsForList().leftPushAll("animal","狗","猫","龙","鼠");List animal = redisTemplate.opsForList().range("animal", 0, 3);animal.forEach(System.out::println);}
    

    在可视化页面中查看对象存入的键和值,看不明白,没有可读性,可以使用自定义类

    自定义类实现步骤:

    pom文件导入fastJson

    <!--fastjson工具包 -->
    <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.3</version>
    </dependency><dependency><groupId>com.colobu</groupId><artifactId>fastjson-jaxrs-json-provider</artifactId><version>0.3.1</version>
    </dependency>
    

    添加配置类RedisConfig

    @Configuration
    public class RedisConfig {@Beanpublic RedisTemplate<Object,Object> jsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {// 创建自定义模板RedisTemplate<Object, Object> template = new RedisTemplate<>();//配置json类型的序列化工具template.setKeySerializer(new StringRedisSerializer());template.setDefaultSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
    template.setConnectionFactory(redisConnectionFactory);return template;}
    }
    

    测试:装配的redis模板类需要和自定义的同名

    @Autowired
    public RedisTemplate jsonRedisTemplate;
    @Test
    public void test03(){jsonRedisTemplate.opsForValue();jsonRedisTemplate.opsForList();jsonRedisTemplate.opsForSet();jsonRedisTemplate.opsForHash();jsonRedisTemplate.opsForZSet();Student student1 = new Student(2,"惠晨怡","男");Student student2 = new Student(3,"尚恒通","男");Student student3 = new Student(4,"李竟坡","男");ArrayList<Student> students = new ArrayList<>(Arrays.asList(student1,student2,student3));jsonRedisTemplate.opsForValue().set("stus",students);Object stus = jsonRedisTemplate.opsForValue().get("stus");String s = JSON.toJSONString(stus);List<Student> list = JSONObject.parseArray(s, Student.class);list.forEach(System.out::println);
    }
    

SpringBoot整合Redis实战案例

redis在项目中起到缓存作用,案例演示redis在项目中的实现

  1. 导入pom.xml文件

    springboot版本2.7.14

    <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>test</scope>
    </dependency><!--mysql-->
    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version>
    </dependency><!--mybatis-->
    <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.1</version>
    </dependency><!--redis-->
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. yaml配置文件配置数据源和redis

    # 配置数据源
    spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/spring?serverTimezone=GMTusername: rootpassword: 123456# 配置redisredis:host: localhostport: 6379mybatis:configuration:map-underscore-to-camel-case: true
    

    用到了mybatis,所以配置了一个自动驼峰映射

  3. Redis自定义模板配置类

    @Component
    public class RedisConfig {@Beanpublic RedisTemplate<Object,Object> jsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setKeySerializer(new StringRedisSerializer());template.setDefaultSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));template.setConnectionFactory(redisConnectionFactory);return template;}
    }
    
  4. 导入redisUtil工具类,工具栏中封装了大量redis操作代码,一般真实开发环境中都可以看到一个公司自己封装的RedisUtil

    @Component
    public  class RedisUtil {@Autowired(required = false)private RedisTemplate jsonRedisTemplate;// =========================================================/*** 指定缓存失效时间* @param key  键* @param time 时间(秒)*/public boolean expire(String key, long time) {try {if (time > 0) {jsonRedisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据key 获取过期时间* @param key 键 不能为null* @return 时间(秒) 返回0代表为永久有效*/public long getExpire(String key) {return jsonRedisTemplate.getExpire(key, TimeUnit.SECONDS);}/*** 判断key是否存在* @param key 键* @return true 存在 false不存在*/public boolean hasKey(String key) {try {return jsonRedisTemplate.hasKey(key);} catch (Exception e) {return false;}}/*** 删除缓存* @param key 可以传一个值 或多个*/@SuppressWarnings("unchecked")public void del(String... key) {if (key != null && key.length > 0) {if (key.length == 1) {jsonRedisTemplate.delete(key[0]);} else {jsonRedisTemplate.delete(CollectionUtils.arrayToList(key));}}}// ============================String=============================/*** 普通缓存获取* @param key 键* @return 值*/public Object get(String key) {return key == null ? null : jsonRedisTemplate.opsForValue().get(key);}/*** 普通缓存放入* @param key   键* @param value 值* @return true成功 false失败*/public boolean set(String key, Object value) {try {jsonRedisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {return false;}}/*** 普通缓存放入并设置时间* @param key   键* @param value 值* @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期* @return true成功 false 失败*/public boolean set(String key, Object value, long time) {try {if (time > 0) {jsonRedisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);} else {set(key, value);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 递增* @param key   键* @param delta 要增加几(大于0)*/public long incr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递增因子必须大于0");}return jsonRedisTemplate.opsForValue().increment(key, delta);}/*** 递减* @param key   键* @param delta 要减少几(小于0)*/public long decr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递减因子必须大于0");}return jsonRedisTemplate.opsForValue().increment(key, -delta);}// ================================Map=================================/*** HashGet* @param key  键 不能为null* @param item 项 不能为null*/public Object hget(String key, String item) {return jsonRedisTemplate.opsForHash().get(key, item);}/*** 获取hashKey对应的所有键值* @param key 键* @return 对应的多个键值*/public Map<Object, Object> hmget(String key) {return jsonRedisTemplate.opsForHash().entries(key);}/*** HashSet* @param key 键* @param map 对应多个键值*/public boolean hmset(String key, Map<String, Object> map) {try {jsonRedisTemplate.opsForHash().putAll(key, map);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** HashSet 并设置时间* @param key  键* @param map  对应多个键值* @param time 时间(秒)* @return true成功 false失败*/public boolean hmset(String key, Map<String, Object> map, long time) {try {jsonRedisTemplate.opsForHash().putAll(key, map);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key   键* @param item  项* @param value 值* @return true 成功 false失败*/public boolean hset(String key, String item, Object value) {try {jsonRedisTemplate.opsForHash().put(key, item, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key   键* @param item  项* @param value 值* @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间* @return true 成功 false失败*/public boolean hset(String key, String item, Object value, long time) {try {jsonRedisTemplate.opsForHash().put(key, item, value);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除hash表中的值** @param key  键 不能为null* @param item 项 可以使多个 不能为null*/public void hdel(String key, Object... item) {jsonRedisTemplate.opsForHash().delete(key, item);}/*** 判断hash表中是否有该项的值** @param key  键 不能为null* @param item 项 不能为null* @return true 存在 false不存在*/public boolean hHasKey(String key, String item) {return jsonRedisTemplate.opsForHash().hasKey(key, item);}/*** hash递增 如果不存在,就会创建一个 并把新增后的值返回** @param key  键* @param item 项* @param by   要增加几(大于0)*/public double hincr(String key, String item, double by) {return jsonRedisTemplate.opsForHash().increment(key, item, by);}/*** hash递减** @param key  键* @param item 项* @param by   要减少记(小于0)*/public double hdecr(String key, String item, double by) {return jsonRedisTemplate.opsForHash().increment(key, item, -by);}// ============================set=============================/*** 根据key获取Set中的所有值* @param key 键*/public Set<Object> sGet(String key) {try {return jsonRedisTemplate.opsForSet().members(key);} catch (Exception e) {e.printStackTrace();return null;}}/*** 根据value从一个set中查询,是否存在** @param key   键* @param value 值* @return true 存在 false不存在*/public boolean sHasKey(String key, Object value) {try {return jsonRedisTemplate.opsForSet().isMember(key, value);} catch (Exception e) {e.printStackTrace();return false;}}/*** 将数据放入set缓存** @param key    键* @param values 值 可以是多个* @return 成功个数*/public long sSet(String key, Object... values) {try {return jsonRedisTemplate.opsForSet().add(key, values);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 将set数据放入缓存** @param key    键* @param time   时间(秒)* @param values 值 可以是多个* @return 成功个数*/public long sSetAndTime(String key, long time, Object... values) {try {Long count = jsonRedisTemplate.opsForSet().add(key, values);if (time > 0)expire(key, time);return count;} catch (Exception e) {e.printStackTrace();return 0;}}/*** 获取set缓存的长度** @param key 键*/public long sGetSetSize(String key) {try {return jsonRedisTemplate.opsForSet().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 移除值为value的** @param key    键* @param values 值 可以是多个* @return 移除的个数*/public long setRemove(String key, Object... values) {try {Long count = jsonRedisTemplate.opsForSet().remove(key, values);return count;} catch (Exception e) {e.printStackTrace();return 0;}}// ===============================list=================================/*** 获取list缓存的内容** @param key   键* @param start 开始* @param end   结束 0 到 -1代表所有值*/public List<Object> lGet(String key, long start, long end) {try {return jsonRedisTemplate.opsForList().range(key, start, end);} catch (Exception e) {e.printStackTrace();return null;}}/*** 获取list缓存的长度** @param key 键*/public long lGetListSize(String key) {try {return jsonRedisTemplate.opsForList().size(key);} catch (Exception e) {e.printStackTrace();return 0;}}/*** 通过索引 获取list中的值** @param key   键* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推*/public Object lGetIndex(String key, long index) {try {return jsonRedisTemplate.opsForList().index(key, index);} catch (Exception e) {e.printStackTrace();return null;}}/*** 将list放入缓存** @param key   键* @param value 值*/public boolean lSet(String key, Object value) {try {jsonRedisTemplate.opsForList().rightPush(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存* @param key   键* @param value 值* @param time  时间(秒)*/public boolean lSet(String key, Object value, long time) {try {jsonRedisTemplate.opsForList().rightPush(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @return*/public boolean lSet(String key, List<Object> value) {try {jsonRedisTemplate.opsForList().rightPushAll(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 将list放入缓存** @param key   键* @param value 值* @param time  时间(秒)* @return*/public boolean lSet(String key, List<Object> value, long time) {try {jsonRedisTemplate.opsForList().rightPushAll(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据索引修改list中的某条数据** @param key   键* @param index 索引* @param value 值* @return*/public boolean lUpdateIndex(String key, long index, Object value) {try {jsonRedisTemplate.opsForList().set(key, index, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 移除N个值为value** @param key   键* @param count 移除多少个* @param value 值* @return 移除的个数*/public long lRemove(String key, long count, Object value) {try {Long remove = jsonRedisTemplate.opsForList().remove(key, count, value);return remove;} catch (Exception e) {e.printStackTrace();return 0;}}}
    
  5. 实体类POJO

    public class Student {private int stuId;private String stuName;private String stuSex;// get,set,构造,toString等
    }
    
  6. Dao层:Mapper

    @Mapper
    public interface StudentMapper {@Delete("delete from student where stu_id = #{id}")public int delete(Integer id);@Select("select * from student where stu_id = #{id}")public Student find(Integer id);
    }
    
  7. 业务层:

    接口

    public interface IStudentService {public void delete(int id);public Student find(int id);}
    

    实现类

    @Service
    public class StudentServiceImp implements IStudentService {@Autowired(required = false)private StudentMapper mapper;@Autowiredprivate RedisUtil redisUtil;// 删除用户策略:删除数据表中数据,然后删除缓存@Overridepublic void delete(int id) {// 删除数据库int res = mapper.delete(id);String key = "student:id:"+id;// 判断数据库是否删除成功if(res != 0){boolean hasKey = redisUtil.hasKey(key);if(hasKey){redisUtil.del(key);System.out.println("删除了缓存中的key:" + key);}}}// 获取用户策略:先从缓存中获取用户,没有则取数据表中数据,再将数据写入缓存@Overridepublic Student find(int id) {String key = "student:id:" + id;//1.1判断key在redis中是否存在boolean hasKey = redisUtil.hasKey(key);if (hasKey) {//1.2存在缓存则直接获取Object stu = redisUtil.get(key);ObjectMapper change = new ObjectMapper();Student student =   change.convertValue(stu,Student.class);System.out.println("==========从缓存中获得数据=========");System.out.println(student.getStuName());System.out.println("==============================");return student;} else {//1.3不存在缓存,先从数据库中获取,在保存至redis,最后返回用户Student student = mapper.find(id);System.out.println("==========从数据表中获得数据=========");System.out.println(student.getStuName());System.out.println("==============================");if (student != null){redisUtil.set(key, student);//写入缓存}return student;}}
    }
    
  8. 控制器

    @RestController
    public class StudentController {@AutowiredIStudentService service;@RequestMapping("/delete/{id}")public Integer delete(@PathVariable("id") int id){service.delete(id);return id;}@RequestMapping("/find/{id}")public Student find(@PathVariable("id") int id){Student student = service.find(id);return student;}}
    
  9. 启动服务,地址栏中测试查看控制台打印结果,(测试时一定要保证redis服务正在运行,否则存不进redis

    第一次访问localhost:8080/find/1显示从数据表中获得的数据,第二次访问显示缓存中获取的数据

    在这里插入图片描述

SpringBoot Cache

SpringBoot Cache介绍

Spring Cache是一个框架, 实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能

Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。

CacheManager缓存管理器是Spring提供的各种缓存技术抽象接口

针对不同的缓存技术需要实现不同的CacheManager:

CacheManager描述
EhCacheCacheManager使用EhCache作为缓存技术(Spring Cache框架操作的默认缓存)
GuavaCacheManager使用Google的GuavaCache作为缓存技术
RedisCacheManager使用Redis作为缓存技术

SpringBoot Cache常用注解

注解说明
@EnableCaching开启缓存注解功能
@Cacheable在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或多条数据从缓存中删除

使用步骤:

  1. 引入缓存启动器:spring-boot-starter-cache,spring-boot-starter-data-redis

  2. @EnableCaching:在启动类上,开启基于注解的缓存

  3. @Cacheable : 标在方法上,返回的结果会进行缓存

属性: value/cacheNames缓存的名字

​ key : 作为缓存中的Key值,可自已使用 SpEL表达式指定(不指定就是参数值), 缓存结果是

​ 方法返回值

名字描述示例
methodName当前被调用的方法名#root.methodName
target当前被调用的目标对象#root.target
targetClass当前被调用的目标对象类#root.targetClass
args当前被调用的方法的参数列表#root.args[0]
caches当前方法调用使用的缓存列表(如@Cacheable(value={“cache1”,“cache2”})),则有两个cache#root.caches[0].name
argument name方法参数的名字. 可以直接 #参数名 ,也可以使用 #p0或#a0 的形式,0代表参数的索引;#iban 、 #a0 、 #p0
result方法执行后的返回值(仅当方法执行之后的判断有效,在@CachePut 使用于更新数据后可用)#result

SpringBoot Cache案例简化Redis

代码实现演示:

  1. pom文件导坐标

    <!--redis依赖-->
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
    </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.1</version>
    </dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
    </dependency>
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
    </dependency>
    
  2. yaml或properties主配置文件

    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/spring?serverTimezone=GMT%2B8#开启日志管理,可以查看sql语句
    logging.level.com.apesource.springboot_redis03.mapper=debug
    debug=true#配置要连接redis的地址
    spring.redis.host=localhost
    spring.redis.port=6379
    
  3. POJO实体类

    根据要操作的表写,演示为student

    public class Student implements Serializable{private Integer stuId;private String stuName;private String stuSex;// get、set、toString、有参、无参构造
    }
    
  4. Dao层StudentMapper

    public interface StudentMapper {@Select("select * from Student where stu_id = #{id}")public Student getStudentById(Integer id);@Delete("delete from student where stu_id = #{id}")public int deleteStudentById(Integer id);@Update("update student  set stu_name=#{stuName},stu_sex=#{stuSex} where stu_id = #{stuId}")public int updateById(Student student);}
    
  5. Service层

    演示Cache简化redis实现,业务直接写实现类,没写接口

    @Service
    public class StudentService {@Autowired(required = false)StudentMapper mapper;//根据@Cacheable注解中的cacheNames+key拼接后的值为key@Cacheable(cacheNames = "students",key = "#id")public Student findById(Integer id){return mapper.getStudentById(id);}@CacheEvict(cacheNames = "students",key = "#id")public void deleteStudentById(Integer id){mapper.deleteStudentById(id);}@CachePut(cacheNames = "students",key = "#result.stuId")public Student updateById(Student student){mapper.updateById(student);return student;}}
    

    在业务层的方法中,加SpringBoot Cache的注解:

    cacheNames会在缓存中开辟一块儿叫"students"的空间,以键值对的形式存放数据,键是cacheNames+key拼接组成,value就是被标注注解的方法返回值

  6. 控制器StudentController

    @RestController
    public class UserController {@AutowiredStudentService userService;@GetMapping("/findById/{id}")public Student findById(@PathVariable("id") Integer id) {Student stu = userService.findById(id);return stu;}@GetMapping("/delete/{id}")public Integer delete(@PathVariable("id") Integer id) {userService.deleteStudentById(id);return id;}@GetMapping("/update/{id}/{name}/{hobby}")public Integer update(@PathVariable Integer id,@PathVariable String name,@PathVariable String sex) {userService.updateById(new Student(id,name,sex));return id;}}	
    
  7. 启动类上添加注解

    @SpringBootApplication
    @MapperScan("com.apesource.springboot_redis03")
    @EnableCaching
    public class SpringbootRedis03Application {public static void main(String[] args) {SpringApplication.run(SpringbootRedis03Application.class, args);}}
    
  8. 启动服务,浏览器访问localhost:8080/findById/1,访问之后刷新再次访问

    注意启动程序服务之前,需要先把redis运行起来

    在这里插入图片描述

    第一次访问时,从数据库中获取的数据

    第二次访问,没有SQL语句,但是也得到了数据,证明cache实现了缓存的作用

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

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

相关文章

React【axios、全局处理、 antd UI库、更改主题、使用css module的情况下修改第三方库的样式、支持sass less】(十三)

文件目录 Proxying in Development http-proxy-middleware fetch_get fetch 是否成功 axios 全局处理 antd UI库 更改主题 使用css module的情况下修改第三方库的样式 支持sass & less Proxying in Development 在开发模式下&#xff0c;如果客户端所在服务器跟后…

讯飞录音笔误删除WAV录音文件恢复成功案例

讯飞录音笔删除恢复的难点 难点一&#xff0c;电脑无法识别为普通电脑盘符。这个是厂家系统设计上的问题&#xff0c;本博文不涉及。 难点二&#xff0c;一般恢复后播放有间隙性噪音问题。这个是数据碎片问题&#xff0c;是本博文的关注点。 大多数情况下&#xff0c;讯飞录…

智慧城市照明为城市节能降耗提供支持继电器开关钡铼S270

智慧城市照明&#xff1a;为城市节能降耗提供支持——以钡铼技术S270继电器开关为例 随着城市化进程的加速&#xff0c;城市照明系统的需求也日益增长。与此同时&#xff0c;能源消耗和环境污染问题日益严重&#xff0c;使得城市照明的节能减排成为重要议题。智慧城市照明系统…

PDF Expert for mac(专业pdf编辑器)苹果电脑

PDF Expert for Mac 是一款功能强大、界面简洁的PDF阅读、编辑和转换工具&#xff0c;为Mac用户提供了全面而便捷的PDF处理体验。无论是日常工作中的文档阅读、标注&#xff0c;还是专业需求下的编辑、转换&#xff0c;PDF Expert 都能满足您的各种需求。 首先&#xff0c;PDF…

25期代码随想录算法训练营第十四天 | 二叉树 | 递归遍历、迭代遍历

目录 递归遍历前序遍历中序遍历后序遍历 迭代遍历前序遍历中序遍历后序遍历 递归遍历 前序遍历 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # …

[蓝桥杯复盘] 第 3 场双周赛20231111

[蓝桥杯复盘] 第 3 场双周赛20231111 总结深秋的苹果1. 题目描述2. 思路分析3. 代码实现 鲜花之海1. 题目描述2. 思路分析3. 代码实现 斐波拉契跳跃2. 思路分析3. 代码实现 星石传送阵2. 思路分析3. 代码实现 六、参考链接 总结 做了后4题。https://www.lanqiao.cn/oj-contes…

iview实现table里面每行数据的跳转

我的需求是跳转到第三方网站&#xff0c;看官方是写了如何跳转站内路由&#xff0c;不符合我的要求&#xff0c;在csdn发现了一篇文章&#xff0c;我贴一下代码 <template><Table border :columns"ReportColumns" :data"ReportData"><templ…

aws亚马逊:什么是 Amazon EC2?

Amazon Elastic Compute Cloud&#xff08;Amazon EC2&#xff09;在 Amazon Web Services&#xff08;AWS&#xff09;云中按需提供可扩展的计算容量。使用 Amazon EC2 可以降低硬件成本&#xff0c;因此您可以更快地开发和部署应用程序。您可以使用 Amazon EC2 启动所需数量的…

Spring Cloud 微服务入门篇

文章目录 什么是微服务架构 Microservice微服务的发展历史微服务的定义微小的服务微服务 微服务的发展历史1. 微服务架构的发展历史2. 微服务架构的先驱 微服务架构 Microservice 的优缺点1. 微服务 e Microservice 优点2. 微服务 Microservice 缺点微服务不是银弹&#xff1a;…

【开源】基于Vue.js的生活废品回收系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨…

51单片机应用从零开始(一)

1. 单片机在哪里 单片机是一种集成电路芯片&#xff0c;通常被嵌入到电子设备中用于控制和处理数据&#xff0c;例如家电、汽车、电子玩具、智能家居等。因此&#xff0c;你可以在许多电子设备中找到单片机的存在。单片机通常被放置在设备的主板或控制板上。 2. 单片机是什么…

数据分析实战 | 贝叶斯分类算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://download.csdn.net/d…

NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

常见面试题-分布式锁

Redisson 分布式锁&#xff1f;在项目中哪里使用&#xff1f;多久会进行释放&#xff1f;如何加强一个分布式锁&#xff1f; 答&#xff1a; 什么时候需要使用分布式锁呢&#xff1f; 在分布式的场景下&#xff0c;使用 Java 的单机锁并不可以保证多个应用的同时操作共享资源…

VB.NET—Bug调试(参数话查询、附近语法错误)

目录 前言: BUG是什么&#xff01; 事情的经过: 过程: 错误一: 错误二: 总结: 前言: BUG是什么&#xff01; 在计算机科学中&#xff0c;BUG是指程序中的错误或缺陷&#xff0c;它通过是值代码中的错误、逻辑错误、语法错误、运行时错误等相关问题&#xff0c;这些问题…

Linux技能篇-yum源搭建(本地源和公网源)

文章目录 前言一、yum源是什么&#xff1f;二、使用镜像搭建本地yum源1.搭建临时仓库第一步&#xff1a;挂载系统ios镜像到虚拟机第二步&#xff1a;在操作系统中挂载镜像第三步&#xff1a;修改yum源配置文件 2.搭建本地仓库第一步&#xff1a;搭建临时yum源来安装httpd并做文…

golang工程组件——redigo使用(redis协议,基本命令,管道,事务,发布订阅,stream)

redisgo redis 与 client 之间采用请求回应模式&#xff0c;一个请求包对应一个回应包&#xff1b;但是也有例外&#xff0c;pub/sub 模 式下&#xff0c;client 发送 subscribe 命令并收到回应包后&#xff0c;之后被动接收 redis 的发布包&#xff1b;所以若需要使 用 pub/s…

ARM day4

LED灯亮灭控制 .text .global _start _start: 1ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x3<<4)str r1,[r0] 2ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1,#(0x1<<20)bic r1,r1,#(0x3<<16)orr r1,r1,#(0x1<<16)str r1,[r0]…

2023年05月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下列程序段的运行结果是?( ) def s(n):if n==0:return 1else:

中断 NVIC的概念和原理

1.什么是中断 中断&#xff1a; 由于中断源的触发&#xff0c;常规程序被打断&#xff0c; CPU转 而运行中断响应函数&#xff0c;而后又回到常规程序的执行&#xff0c; 这一过程叫做中断。 中断优先级的概念 中断的意义和作用 中断处理的过程和术语 STM32 GPIO外部中断简…