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

Spring+redis集成redis缓存

  1、引入maven依赖

        <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.7.0</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.6.2.RELEASE</version></dependency>

2、配置文件redis.properties

#redis的配置文件
#服务的ip地址
redis.host=127.0.0.1
#服务器连接端口号
redis.port=6379
#服务器连接密码(默认为空)
redis.password=1234567
#连接超时时间(毫秒)
redis.timeout=3
#连接池中的最大连接数
redis.poolMaxTotal=10
#连接池中的最大空闲连接
redis.poolMaxIdle=10
#连接池中最大阻塞等待时间(使用负数表示没有限制)
redis.poolMaxWait=3
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。  
redis.maxIdle=300
#连接池的最大数据库连接数。设为0表示无限制  
redis.maxActive=600
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。  
redis.maxWait=1000 
#在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;  
redis.testOnBorrow=true 

3、redis的配置bean的xml文件redis-config.xml

<beans	xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd"><!-- 引入配置文件 --><context:property-placeholder ignore-unresolvable="true" location="classpath:redis.properties"/><!-- redis连接池 --><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">  <property name="maxIdle" value="${redis.maxIdle}" />  <property name="maxTotal" value="${redis.maxActive}" /><property name="testOnBorrow" value="${redis.testOnBorrow}" />  </bean><!-- redis连接池配置,类似于数据连接池 --><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="hostName" value="${redis.host}"></property><property name="port" value="${redis.port}"></property><property name="password" value="${redis.password}"></property><property name="poolConfig" ref="jedisPoolConfig"></property></bean><!--redis操作模版,使用该对象可以操作redis  -->  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >    <property name="connectionFactory" ref="jedisConnectionFactory" />    <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!  -->    <property name="keySerializer" >    <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />    </property>    <property name="valueSerializer" >    <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />    </property>    <property name="hashKeySerializer">    <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    </property>    <property name="hashValueSerializer">    <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>    </property>    <!--开启事务  -->  <property name="enableTransactionSupport" value="true"></property>  </bean > </beans>

       注意:如果在多个spring配置文件中引入<context:property-placeholder .../>标签,最后需要加上ignore-unresolvable="true",否则会报错。

4、测试

       4.1基于RedisTemplate基本数据类型类

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = { "classpath:/redis-config.xml" })
@SuppressWarnings("all")
public class TestRedis {@SuppressWarnings("rawtypes")@Resource(name="redisTemplate")private RedisTemplate redisTemplate;@Testpublic void testRedis() {		//String读写redisTemplate.delete("myString");redisTemplate.opsForValue().set("myString","zhangsan");System.out.println(redisTemplate.opsForValue().get("myString"));System.out.println("---------------");//List读写redisTemplate.delete("myList");redisTemplate.opsForList().rightPush("myList","T");redisTemplate.opsForList().rightPush("myList", "A");redisTemplate.opsForList().leftPush("myList", "B");List<String> listCache  = redisTemplate.opsForList().range("myList", 0, -1);for (String str : listCache) {System.out.println(str);}System.out.println("---------------");//Set读写redisTemplate.delete("mySet");redisTemplate.opsForSet().add("mySet", "A");redisTemplate.opsForSet().add("mySet", "B");redisTemplate.opsForSet().add("mySet", "C");Set<String> set  = redisTemplate.opsForSet().members("mySet");for (String s : set) {System.out.println(s);}System.out.println("---------------");//Hash读写redisTemplate.delete("myHash");redisTemplate.opsForHash().put("myHash", "BJ", "北京");redisTemplate.opsForHash().put("myHash", "TJ", "天津");redisTemplate.opsForHash().put("myHash","HN","河南");Map<String,String> map = redisTemplate.opsForHash().entries("myHash");for (String key : map.keySet()) {System.out.println(map.get(key));}System.out.println("---------------");//ZSet读写redisTemplate.delete("myZSet");redisTemplate.opsForZSet().add("myZSet", "A",1);redisTemplate.opsForZSet().add("myZSet", "B",3);redisTemplate.opsForZSet().add("myZSet", "C",2);redisTemplate.opsForZSet().add("myZSet", "D",5);Set<String> zset = redisTemplate.opsForZSet().range("myZSet", 0, -1);for (String s : zset) {System.out.println(s);}}
}

       输出内容为:

zhangsan
---------------
B
T
A
---------------
A
B
C
---------------
河南
北京
天津
---------------
A
C
B
D

       4.2基于封装了RedisTemplate的基本数据类型类

             首先封装一个RedisTemplate的工具类

@Component
public class RedisUtil {@Autowired//(自动注入redisTemplet)private RedisTemplate<String, Object> redisTemplate;  public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {  this.redisTemplate = redisTemplate;  }  //=============================common============================  /** * 指定缓存失效时间 * @param key 键 * @param time 时间(秒) * @return */  public boolean expire(String key,long time){  try {  if(time>0){  redisTemplate.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 redisTemplate.getExpire(key,TimeUnit.SECONDS);  }  /** * 判断key是否存在 * @param key 键 * @return true 存在 false不存在 */  public boolean hasKey(String key){  try {  return redisTemplate.hasKey(key);  } catch (Exception e) {  e.printStackTrace();  return false;  }  }  /** * 删除缓存 * @param key 可以传一个值 或多个 */  @SuppressWarnings("unchecked")  public void del(String ... key){  if(key!=null&&key.length>0){  if(key.length==1){  redisTemplate.delete(key[0]);  }else{  redisTemplate.delete(CollectionUtils.arrayToList(key));  }  }  }  //============================String=============================  /** * 普通缓存获取 * @param key 键 * @return 值 */  public Object get(String key){  return key==null?null:redisTemplate.opsForValue().get(key);  }  /** * 普通缓存放入 * @param key 键 * @param value 值 * @return true成功 false失败 */  public boolean set(String key,Object value) {  try {  redisTemplate.opsForValue().set(key, value);  return true;  } catch (Exception e) {  e.printStackTrace();  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){  redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);  }else{  set(key, value);  }  return true;  } catch (Exception e) {  e.printStackTrace();  return false;  }  }  /** * 递增 * @param key 键 * @param by 要增加几(大于0) * @return */  public long incr(String key, long delta){    if(delta<0){  throw new RuntimeException("递增因子必须大于0");  }  return redisTemplate.opsForValue().increment(key, delta);  }  /** * 递减 * @param key 键 * @param by 要减少几(小于0) * @return */  public long decr(String key, long delta){    if(delta<0){  throw new RuntimeException("递减因子必须大于0");  }  return redisTemplate.opsForValue().increment(key, -delta);    }    //================================Map=================================  /** * HashGet * @param key 键 不能为null * @param item 项 不能为null * @return 值 */  public Object hget(String key,String item){  return redisTemplate.opsForHash().get(key, item);  }  /** * 获取hashKey对应的所有键值 * @param key 键 * @return 对应的多个键值 */  public Map<Object,Object> hmget(String key){  return redisTemplate.opsForHash().entries(key);  }  /** * HashSet * @param key 键 * @param map 对应多个键值 * @return true 成功 false 失败 */  public boolean hmset(String key, Map<String,Object> map){    try {  redisTemplate.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 {  redisTemplate.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 {  redisTemplate.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 {  redisTemplate.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){    redisTemplate.opsForHash().delete(key,item);  }   /** * 判断hash表中是否有该项的值 * @param key 键 不能为null * @param item 项 不能为null * @return true 存在 false不存在 */  public boolean hHasKey(String key, String item){  return redisTemplate.opsForHash().hasKey(key, item);  }   /** * hash递增 如果不存在,就会创建一个 并把新增后的值返回 * @param key 键 * @param item 项 * @param by 要增加几(大于0) * @return */  public double hincr(String key, String item,double by){    return redisTemplate.opsForHash().increment(key, item, by);  }  /** * hash递减 * @param key 键 * @param item 项 * @param by 要减少记(小于0) * @return */  public double hdecr(String key, String item,double by){    return redisTemplate.opsForHash().increment(key, item,-by);    }    //============================set=============================  /** * 根据key获取Set中的所有值 * @param key 键 * @return */  public Set<Object> sGet(String key){  try {  return redisTemplate.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 redisTemplate.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 redisTemplate.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 = redisTemplate.opsForSet().add(key, values);  if(time>0) expire(key, time);  return count;  } catch (Exception e) {  e.printStackTrace();  return 0;  }  }  /** * 获取set缓存的长度 * @param key 键 * @return */  public long sGetSetSize(String key){  try {  return redisTemplate.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 = redisTemplate.opsForSet().remove(key, values);  return count;  } catch (Exception e) {  e.printStackTrace();  return 0;  }  }  //===============================list=================================  /** * 获取list缓存的内容 * @param key 键 * @param start 开始 * @param end 结束  0 到 -1代表所有值 * @return */  public List<Object> lGet(String key,long start, long end){  try {  return redisTemplate.opsForList().range(key, start, end);  } catch (Exception e) {  e.printStackTrace();  return null;  }  }  /** * 获取list缓存的长度 * @param key 键 * @return */  public long lGetListSize(String key){  try {  return redisTemplate.opsForList().size(key);  } catch (Exception e) {  e.printStackTrace();  return 0;  }  }  /** * 通过索引 获取list中的值 * @param key 键 * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 * @return */  public Object lGetIndex(String key,long index){  try {  return redisTemplate.opsForList().index(key, index);  } catch (Exception e) {  e.printStackTrace();  return null;  }  }  /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */  public boolean lSet(String key, Object value) {  try {  redisTemplate.opsForList().rightPush(key, value);  return true;  } catch (Exception e) {  e.printStackTrace();  return false;  }  }  /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */  public boolean lSet(String key, Object value, long time) {  try {  redisTemplate.opsForList().rightPush(key, value);  if (time > 0) expire(key, time);  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) {  try {  redisTemplate.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 {  redisTemplate.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 {  redisTemplate.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 = redisTemplate.opsForList().remove(key, count, value);  return remove;  } catch (Exception e) {  e.printStackTrace();  return 0;  }  }  }

测试上面封装的类是否好用

@RunWith(SpringJUnit4ClassRunner.class)//这个地方因为在工具类上加了注解,所以需要引入spring的配置文件
@ContextConfiguration(locations = { "classpath:/redis-config.xml" , "classpath*:/spring-mybatis.xml"})
public class TestRedisUtils {@Autowiredprivate RedisUtil redisUtil;@Testpublic void testRedisUtils() {String  str = "string";//1.字符串List<String> list = new ArrayList<String>();//listlist.add("0");list.add("中国");list.add("2");Set<String> set = new HashSet<String>();//setset.add("0");set.add("中国");set.add("2");Map<String, Object> map = new HashMap();//mapmap.put("key1", "str1");map.put("key2", "中国");map.put("key3", "str3");//删除数据,可以删除多个redisUtil.del("list","str","set","map");//1.字符串操作redisUtil.set("str", str);redisUtil.expire("str", 120);//指定失效时间为2分钟String str1 = (String) redisUtil.get("str");System.out.println(str1);//2.list操作redisUtil.lSet("list", list);redisUtil.expire("list", 120);//指定失效时间为2分钟List<Object> list1 = redisUtil.lGet("list", 0, -1);System.out.println(list1);//3.set操作redisUtil.sSet("set", set);redisUtil.expire("set", 120);//指定失效时间为2分钟Set<Object> set1 = redisUtil.sGet("set");System.out.println(set1);//3.map操作redisUtil.hmset("map", map);redisUtil.expire("map", 120);//指定失效时间为2分钟Map<Object, Object> map1 = redisUtil.hmget("map");System.out.println(map1);}
}

        输出结果:

string
[[0, 中国, 2]]
[[0, 2, 中国]]
{key3=str3, key1=str1, key2=中国}

       4.3基于封装了RedisTemplate的javaBean类

        首先创建java Bean--Student,需要一个默认无参的构造方法且类上面需要序列化,否则会报错

//序列化很重要
public class Student implements Serializable{/*** */private static final long serialVersionUID = 1L;private int age;private String name;private Date birthday;//没有这个会报错public Student() {}public Student(int age, String name, Date birthday) {this.age = age;this.name = name;this.birthday = birthday;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "Student [age=" + age + ", name=" + name + ", birthday=" + birthday + "]";}
 编写测试javaBean的方法
@RunWith(SpringJUnit4ClassRunner.class)//这个地方因为在工具类上加了注解,所以需要引入spring的配置文件
@ContextConfiguration(locations = { "classpath:/redis-config.xml" , "classpath*:/spring-mybatis.xml"})
public class TestRedisBean {@Autowiredprivate RedisUtil redisUtil;@Testpublic void testRedisBean() {List<Student> list = new ArrayList<Student>();//listlist.add(new Student(20,"张三list",new Date()));list.add(new Student(21,"李四list",new Date()));list.add(new Student(22,"王五list",new Date()));Set<Student> set = new HashSet<Student>();//listset.add(new Student(20,"张三set",new Date()));set.add(new Student(21,"李四set",new Date()));set.add(new Student(22,"王五set",new Date()));Map<String, Object> map = new HashMap();//mapmap.put("key1",new Student(20,"张三set",new Date()));map.put("key2",new Student(21,"李四set",new Date()));map.put("key3",new Student(22,"王五set",new Date()));redisUtil.del("list","set","map");//1.list操作redisUtil.lSet("list", list,1200);List<Object> list1 = redisUtil.lGet("list", 0, -1);System.out.println(list1);//3.set操作redisUtil.sSet("set", set);redisUtil.expire("set", 1200);//指定失效时间为2分钟Set<Object> set1 = redisUtil.sGet("set");System.out.println(set1);//3.map操作redisUtil.hmset("map", map);redisUtil.expire("map", 120);//指定失效时间为2分钟Map<Object, Object> map1 = redisUtil.hmget("map");System.out.println(map1);}

       输出结果为:

[[Student [age=20, name=张三list, birthday=Fri Aug 02 17:22:55 GMT+08:00 2019], Student [age=21, name=李四list, birthday=Fri Aug 02 17:22:55 GMT+08:00 2019], Student [age=22, name=王五list, birthday=Fri Aug 02 17:22:55 GMT+08:00 2019]]]
[[Student [age=20, name=张三set, birthday=Fri Aug 02 17:22:55 GMT+08:00 2019], Student [age=21, name=李四set, birthday=Fri Aug 02 17:22:55 GMT+08:00 2019], Student [age=22, name=王五set, birthday=Fri Aug 02 17:22:55 GMT+08:00 2019]]]
{key2=Student [age=21, name=李四set, birthday=Fri Aug 02 17:22:55 GMT+08:00 2019], key1=Student [age=20, name=张三set, birthday=Fri Aug 02 17:22:55 GMT+08:00 2019], key3=Student [age=22, name=王五set, birthday=Fri Aug 02 17:22:55 GMT+08:00 2019]}

参考博客:https://www.cnblogs.com/qlqwjy/p/8562703.html

相关文章:

Spring+redis集成redis缓存

1、引入maven依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.7.0</version></dependency><dependency><groupId>org.springframework.data</groupId><art…...

聊聊springboot的启动事件

序 本文主要研究一下springboot的启动事件 SpringApplicationEvent org/springframework/boot/context/event/SpringApplicationEvent.java public abstract class SpringApplicationEvent extends ApplicationEvent {private final String[] args;public SpringApplicatio…...

jmeter HTTP请求默认值

首先&#xff0c;打开JMeter并创建一个新的测试计划。 右键单击测试计划&#xff0c;选择"添加" > “配置元件” > “HTTP请求默认值”。 在HTTP请求默认值中&#xff0c;您可以设置全局的HTTP请求属性&#xff0c;例如&#xff1a; 服务器地址&#xff1a…...

CSS选择器-CSS3属性

CSS选择器-CSS3属性 持续更新… 1、CSS3的概念和优势 css3概念:是css的升级版本,新增加了一些模块 css3优点:完全向后兼容,可使用新的选择器和属性,能实现新的设计效果CSS3是CSS技术的升级版本&#xff0c;CSS3语言开发是朝着模块化发展的。以前的规范作为一个模块实在是太庞…...

线性代数的学习和整理8:行列式相关

目录 1 从2元一次方程组求解说起 1.1 直接用方程组消元法求解 1.2 有没有其他方法呢&#xff1f;有&#xff1a;比如2阶行列式方法 1.3 3阶行列式 2 行列式的定义 2.1 矩阵里的方阵 2.2 行列式定义&#xff1a;返回值为标量的一个函数 2.3 行列式的计算公式 2.4 克拉…...

java+springboot+mysql农业园区管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的农业园区管理系统&#xff0c;系统包含超级管理员、管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff1b;土地管理&#xff08;租赁&#xff09;&#x…...

IDEA远程开发

IDEA远程开发 前期准备 IDEA的远程开发是在本地去操昨远程服务器上的代码&#xff0c;所以我们先需要准备一台服务器,在此我使用vmware虚拟出ubuntu-20.04.6的Server版本,以便后面演示。 Ubuntu的Java环境配置 JDK8 sudo apt install openjdk-8-jdkmaven sudo apt instal…...

Redis 工作总结

1.Redis是什么 Redis是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是Remote Dictionary Service的首字母缩写&#xff0c;也就是远程字典服务。 2.Redis的用途&#xff1f; 2.1 计数器 2.2 缓存 2.3 分布式锁 2.4 消息中间件 3.Redis的数据类型 3.1 string&am…...

GO学习之 数据库(Redis)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...

谈一谈浏览器与Node.js中的JavaScript事件循环,宏任务与微任务机制

JavaScript中的异步代码 JavaScript是一个单线程非阻塞的脚本语言。这代表代码是执行在一个主线程上面的。但是JavaScript中有很多耗时的异步操作&#xff0c;例如AJAX&#xff0c;setTimeout等等&#xff1b;也有很多事件&#xff0c;例如用户触发的点击事件&#xff0c;鼠标…...

User Java bean的命名规范

Java Bean 是一种用于表示简单的、可重用的组件的规范。它是一个符合特定命名和约定的 Java 类&#xff0c;通常用于封装数据和提供访问方法。以下是关于 Java Bean 命名规范的一些准则&#xff1a; 类名&#xff1a; 类名应该使用驼峰命名法&#xff08;Camel Case&#xff09…...

ajax和fetch的区别

ajax 和 fetch的相同点和区别是什么&#xff1f; 以前我们都用ajax去做请求&#xff0c; 但是原生的ajax不好用&#xff0c;我们会用$.ajax或者axios插件去请求&#xff0c;他们都是ajax的封装 最近出来个fetch是什么&#xff1f; 问到这里的时候&#xff0c;你就已经入坑了&am…...

java+springboot+mysql村务档案管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的村务档案管理系统&#xff0c;系统包含超级管理员、工作人员角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;系统用户管理&#xff08;工作人员管理&#xff09;&#xff1b;公开资料&#xff1b;会议记录&…...

windows查看/删除DNS缓存

一、查看DNS缓存 打开CMD&#xff0c;输入ipconfig/displaydns 二、删除DNS缓存 打开CMD,输入ipconfig/flushdns...

自动化测试之Junit

Junit引入注解参数化单参数多参数方法传参 测试用例执行顺序断言测试套件 Junit引入 Junit来编写和组织自动化测试用例&#xff0c;使用Selenium来实际模拟用户与Web应用程序的交互。也就是使用JUnit的测试功能来管理和运行Selenium测试。常见的做法是&#xff0c;使用JUnit作…...

Spring Boot 整合MyBatis-Plus

&#x1f600;前言 本篇博文是关于Spring Boot 整合MyBatis-Plus的&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的…...

CC++ 常用技巧

C 中的C C 是面向过程的是把整个大程序分为一个个的子函数&#xff1b;C 是面向对象的是把整个程序划分为一个个的类。C 是完全兼容C 的&#xff0c;C 是C 的子集&#xff0c;C 是C 的超集。C 又对C 做了很多补充和提升&#xff0c;因此使用C 会比使用纯C 更方便。混用C和C&am…...

【AndroidStudio】屏蔽小米打印

使用小米手机调试时&#xff0c;会一直有notifyQueue load error的打印 在过滤器重添加过滤条件即可 -message:notifyQueue...

Tomcat的安装与介绍

首先我们先了解一下什么是服务器&#xff1f;什么是服务器软件&#xff1f; 什么是服务器&#xff1f;安装了服务器软件的计算机。 什么是服务器软件&#xff1f; 服务器软件是一种运行在服务器操作系统上&#xff0c;用于接收和处理客户端请求&#xff0c;并提供相应服务和资…...

说点大实话丨知名技术博主 Kirito 测评云原生网关

作者&#xff1a;徐靖峰 关注了阿里云云原生公众号&#xff0c;经常能看到 MSE-Higress 相关的推文&#xff0c;恰逢这次阿里云产品举办了一个 MSE-Higress 云原生网关的测评活动&#xff0c;借此机会体验了一把云原生网关的功能。 购买流程体验 购买网关时&#xff0c;页面明…...

时序预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现SO-CNN-BiL…...

简述docker的网络模式

Docker 提供了多种网络模式&#xff0c;用于控制容器之间以及容器与主机之间的网络通信。以下是 Docker 的一些常见网络模式 briage模式&#xff1a; docker容器启动时默认就是该模式,在该模式下&#xff0c;docker容器会连接到一个名为docker0的虚拟以太网桥上&#xff0c;通…...

MySql-8.0.34 CentOS 安装命令记录

1、执行以下命令获取 glibc 版本&#xff0c;根据版本下载相应的MySQL安装包。 ldd --version 2、下载MySQL。 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34-linux-glibc2.17-x86_64.tar.gz 3、解压 tar -xzvf mysql-8.0.34-linux-glibc2.17-x86_64.t…...

开发电子木鱼功德+1需要多少钱

冥想木鱼小程序是一种结合了冥想和科技的应用形式&#xff0c;为用户提供了随时随地进行冥想的便捷方式。开发一款高质量的冥想木鱼小程序需要综合考虑技术实现、冥想专业性和用户体验等多个方面。本文将详细介绍冥想木鱼小程序的开发过程&#xff0c;并探讨其中的专业性与思考…...

批处理中扩展解释%~的相关知识和用法,并给出示例和实际运行结果展示

批处理中扩展解释%~的相关知识和用法&#xff0c;并给出示例和实际运行结果展示 在批处理脚本中&#xff0c;%~是一个特殊的前缀&#xff0c;用于对参数和变量进行字符串处理。这个前缀后面可以跟着不同的字符&#xff0c;用于执行不同的操作。下面是一些常见的用法&#xff1a…...

LA@向量组间的表示关系

文章目录 2个向量组间的表示关系向量组的相互表出向量组用另一个向量组表示&#x1f47a;线性表示的系数矩阵矩阵乘法与线性表出列向量组线性表示行向量组线性表示 向量组等价&#x1f47a;向量组等价的性质推论 等价矩阵与向量组等价的关系行等价矩阵的行向量组等价列等价矩阵…...

Mybatis与Spring集成

目录 一.Spring整合Mybatis 1.什么是Spring整合Mybatis 新建一个ssm ​编辑 导入pom依赖 导入generatorConfig.xml 导入Spring-context.xml文件 导入Spring-mybatis.xml文件 自动生成Bookmapper.xml和Bookmapper文件 编写接口类&#xff1a;Bookbiz 编写接口实现类 …...

AMBA总线协议(0)——目录与传送门

一、AMBA总线协议 Arm高级微控制器总线架构&#xff08;Advanced Microcontroller Bus Architecture&#xff0c;AMBA&#xff09;是一种开放式标准片上互联规范&#xff0c;用于连接和管理片上系统&#xff08;System on Chip,Soc&#xff09;中的功能块。 AMBA是一种广泛用于…...

R语言快速生成三线表(1)

R语言的优势在于批量处理&#xff0c;常使用到循环和函数&#xff0c;三线表是科研文章中必备的内容。利用函数实现自动判断数据类型和计算。使用R包&#xff08;table1&#xff09;。 # 创建连续性变量 continuous_var1 <- c(1.2, 2.5, 3.7, 4.8, 5.9) continuous_var2 &l…...

【动手学深度学习】--20.目标检测和边界框

文章目录 目标检测和边界框1.目标检测2.边界框 目标检测和边界框 学习视频&#xff1a;物体检测和数据集【动手学深度学习v2】 官方笔记&#xff1a;目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别…...

实验八 网卡驱动移植

【实验目的】 掌握 Linux 内核配置的基本方法&#xff0c;完成对网卡驱动、NFS 等相关功能的配置 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台交叉编译工具&#xff1a;arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&…...

Linux的Man Page知识记录

Man&#xff08;short for manual&#xff09; Page是Unix和Linux操作系统中的一个重要文档&#xff0c;提供命令、函数、系统调用等的详细介绍和使用说明。它是以纯文本的形式出现&#xff0c;通常在终端&#xff08;terminal&#xff09;中使用man命令访问。Man Page按照章节…...

RTSP/Onvif视频服务器EasyNVR安防视频云服务调用接口录像会被自动删除的问题解决方案

EasyNVR安防视频云服务是基于RTSP/Onvif协议接入的视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端的分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等。平台丰富灵活的视频能力&#xff0c;可应用在智慧校园、智慧工厂、智慧水利等…...

几个nlp的小项目(文本分类)

几个nlp的小项目(文本分类) 导入加载数据类、评测类查看数据集精确展示数据测评方法设置参数tokenizer,token化的解释对数据集进行预处理加载预训练模型进行训练设置训练模型的参数一个根据任务名获取,测评方法的函数创建预训练模型开始训练本项目的工作完成了什么任务?导…...

MFC——base编码和json数据

目录 1. JSON是什么 2. base64是什么 Base64是一种编解码算法 1. JSON是什么 JSON 是一种数据格式。采用完全独立于语言的文本格式, 因为易读, 易写, 易解析的特性成为理想的数据交换语言。主要有三种类型的值:简单值(字符串, 数字, 布尔, null), 对象, 数组。 长这样的数…...

SQL Server、MySQL和Oracle数据库分页查询的区别与联系

摘要&#xff1a;本文将通过一个现实例子&#xff0c;详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例&#xff0c;并解释每个数据库的分页查询用法以及优化方法&#xff0c;帮助读者更好地选择适合自…...

Qt跨平台无边框窗口探索记录

一、前言 实现的效果为&#xff1a;通过黑色矩形框预操作&#xff0c;鼠标释放时更新窗口。效果图如下&#xff1a; 1.功能 1.1 已实现功能 8个方向的缩放标题栏拖动标题栏双击最大化/正常窗口窗口最小尺寸预操作框颜色与背景色互补多屏幕默认标题栏 1.2 待开发功能 拖动到…...

概念解析 | 电磁计算的新篇章:智能电磁计算

注1&#xff1a;本文系“概念解析”系列之一&#xff0c;致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是&#xff1a;智能电磁计算。 电磁计算的新篇章&#xff1a;智能电磁计算 随着人工智能的飞速发展&#xff0c;我们正处在一个信息爆炸的时代。各个领域&a…...

SpringBoot-1-Spring Boot实战:快速搭建你的第一个应用,以及了解原理

SpringBoot-1-Spring Boot实战&#xff1a;快速搭建你的第一个应用&#xff0c;以及了解原理 今日内容 SpringBootWeb入门 前言 我们在之前介绍Spring的时候&#xff0c;已经说过Spring官方(Spring官方)提供很多开源项目&#xff0c;点击projects&#xff0c;看到spring家族…...

Web服务器基础 http协议

文章目录 1.Web基础1.1MIME1.2 URI 和 URL1.2.1定义1.2.2两者的区别 2.静态资源和动态资源2.1 静态资源2.2 动态资源 3.HTTP协议3.1HTTP协议简介3.2HTTP协议的版本及区别3.2.1http协议版本3.2.2http1.0和1.1的区别 3.3HTTP请求报文3.4HTTP请求访问的过程1、建立连接&#xff1a…...

采用 SVG 实现 web 绘图软件的技术分享

背景 前端技术 使用 svg.js 及全家桶的组件实现 svg 绘图的 web 软件。 MySql8 词语定义 图纸&#xff1a;在页面上绘制的内容整体整体叫做图纸&#xff0c;业务上图纸是具有重要业务意义的概念。 对象&#xff1a;图纸上的业务元素的最小概念。 难点-技术背景 当时遇到…...

Qt --- QTimer

在Qt开发界面的时候&#xff0c;非常多的时候都得使用定时器&#xff0c;定时器具体可以干什么呢&#xff1f;比如&#xff1a;控制时钟、定时改变样式、改变进度等。。。说到这里&#xff0c;经常使用QQ&#xff0c;而不同的时段都会显示不同的背景&#xff0c;我认为如果用Qt…...

计算机终端核心安全配置规范

声明 本文是学习 政务计算机终端核心配置规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 范围 本标准提出了政务计算机终端核心配置的基本概念和要求&#xff0c;规定了核心配置的自动化实现方法&#xff0c;规范了核心配置实施流程。 本标准适…...

【Spring Boot】什么是深度优先遍历与广度优先遍历?用Spring Boot项目举例说明。

深度优先遍历&#xff08;Depth First Search&#xff0c;DFS&#xff09;和广度优先遍历&#xff08;Breadth First Search&#xff0c;BFS&#xff09;是图的遍历算法。其中&#xff0c;深度优先遍历从某个起始点开始&#xff0c;先访问一个节点&#xff0c;然后跳到它的一个…...

MetaMask Mobile +Chrome DevTools 调试Web3应用教程

注&#xff1a;本教程来源网络&#xff0c;有兴趣的可以直接到这里查看。 写好了WEB3应用&#xff0c;在本地调试用得好好的&#xff0c;但是用钱包软件访问就报莫名的错&#xff0c;但是又不知道是什么原因&#xff0c;排查的过程非常浪费时间 。 因此在本地同一局域网进行调试…...

栈和队列OJ题

有效括号问题&#xff1a; 题目描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的…...

36k字从Attention讲解Transformer及其在Vision中的应用(pytorch版)

文章目录 0.卷积操作1.注意力1.1 注意力概述(Attention)1.1.1 Encoder-Decoder1.1.2 查询、键和值1.1.3 注意力汇聚: Nadaraya-Watson 核回归1.2 注意力评分函数1.2.1 加性注意力1.2.2 缩放点积注意力1.3 自注意力(Self-Attention)1.3.1 自注意力的定义和计算1.3.2 自注意…...

网站怎么选择适合的服务器

IDC数据中心大致分为T1、T2、T3、T4 T1&#xff1a;基本机房基础设施&#xff08;可用性99.671%、年平均故障时间28.8小时&#xff09; 1) T1 基本数据中心拥有非冗余容量组件&#xff0c;以及一个单一的非冗余分配路径来为关键环境提供服务。T1 基础设施包括&#xff1a;IT …...

http协议和HTTP编程流程

目录 1、http协议 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;使用的端口 &#xff08;3&#xff09;长连接和短连接 &#xff08;4&#xff09;常见web服务器 2、https&#xff08;443&#xff09; 3、浏览器连接服务器编程 1、http协议 &#xff08;超文…...

【NPM】包的指令

npm 安装的包可以根据其用途和作用进行分类&#xff0c;一般可以分为以下几种类型&#xff1a; 普通依赖&#xff08;Regular Dependencies&#xff09;&#xff1a; 这些是你项目中的实际依赖项&#xff0c;用于构建、运行或扩展你的应用程序。这些依赖会被包含在你的应用程序…...