Java连接Redis和SpringBoot整合Redis
1. Java连接Redis
思考:我们之前操作redis都是通过命令行的客户端来操作。在开发时都是通过java项目操作redis
java提高连接redis的方式为jedis。我们需要遵循jedis协议。
java提供连接mysql的方式为jdbc。
1.1 单机模式
引入依赖
<!--引入java连接redis的驱动--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency>
若使用3.8.1的依赖,jedis中的setex方法会被划去
<dependency><groupId>repMaven.redis.clients</groupId><artifactId>jedis</artifactId><version>3.8.0</version> </dependency>
编写代码
package com.zmq;import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;/*** @program: redis1* @description: java连接redis* @author: zmq**/
public class Test01 {public static void main(String[] args) {//连接redis的信息,默认连接本地的redis端口 端口号6379,所有关于redis操作的功能都在Jedis类中Jedis jedis=new Jedis("172.16.7.112",6379);//关于key的命令//获取所有key值Set<String> keys = jedis.keys("*");System.out.println("获取所有的keys:"+keys);//删除key的个数Long del = jedis.del("ll", "l1");System.out.println("删除key的个数"+del);//判定指定的key是否存在Boolean k4 = jedis.exists("k4");System.out.println("判断指定的k4是否存在"+k4);//给key指定过期时间jedis.expire("lll",100);//string类型//添加数据String set = jedis.set("k1", "v1");System.out.println("存入k1的值"+set);//获取指定的值String s = jedis.get("k1");System.out.println("获取指定k1的值"+s);//判断指定的值是否存在,若不存在,就创建Long k2 = jedis.setnx("k2", "v2");System.out.println("如果k2不存在,则设置k2的值:"+k2);jedis.setnx("k3","110");//值递增Long k3 = jedis.incr("k3");System.out.println("k3的值加1"+k3);//值递减Long k31 = jedis.decr("k3");System.out.println("k3的值减1"+k31);//创建key并指定过期时间String setex = jedis.setex("k4", 100, "v3");System.out.println(setex);//关于hash的命令//存值long hset = jedis.hset("h1", "name", "lay");System.out.println("存入h1的键值对:"+hset);//设置一个mapMap<String,String> map=new HashMap<>();map.put("name","章三");map.put("age","18");long h2 = jedis.hset("h2", map);System.out.println("存入h2的键值对"+h2);//取值String hget = jedis.hget("h2", "name");System.out.println("获取h2中name的值"+hget);//获取key中的素有键值对的值Map<String, String> h21 = jedis.hgetAll("h2");System.out.println("获取h2中所有键值对的值"+h21);//获取所有哈希表中的值List<String> h22 = jedis.hvals("h2");System.out.println(h22);//获取所有哈希表中所有的字段Set<String> h23 = jedis.hkeys("h2");System.out.println(h23);}
}
- 关于连接redis的信息
- 连接redis的信息,默认连接本地的redis端口 端口号6379
所有关于redis操作的功能都在Jedis类中
Jedis jedis=new Jedis("172.16.8.110",6379);
- 关于key的命令
- 获取所有key值——keys~~~~keys
//获取所有key值Set<String> keys = jedis.keys("*");System.out.println("获取所有的keys:"+keys);
- 删除key的个数——del~~~~del
//删除key的个数Long del = jedis.del("ll", "l1");System.out.println("删除key的个数"+del);
- 判定指定的可以是否存在——exists~~~~exists
//判定指定的key是否存在Boolean k4 = jedis.exists("k4");System.out.println("判断指定的k4是否存在"+k4);
- 创建key并给key指定过期时间——expire~~~~expire
//给key指定过期时间jedis.expire("lll",100);
- 关于字符串String的命令
- 添加数据——set~~~~set
//添加数据String set = jedis.set("k1", "v1");System.out.println("存入k1的值"+set);
- 获取指定的值——get~~~~get
//获取指定的值String s = jedis.get("k1");System.out.println("获取指定k1的值"+s);
- 判断指定的值是否存在,若不存在,就创建——setnx~~~~setnx
//判断指定的值是否存在,若不存在,就创建Long k2 = jedis.setnx("k2", "v2");System.out.println("如果k2不存在,则设置k2的值:"+k2);
- 值递增,每次加1——incr~~~~incr
jedis.setnx("k3","110");//值递增Long k3 = jedis.incr("k3");System.out.println("k3的值加1"+k3);
- 值递减,每次减1——decr~~~~decr
//值递减Long k31 = jedis.decr("k3");System.out.println("k3的值减1"+k31);
- 创建key并指定过期时间——setex~~~~setex
//创建key并指定过期时间String setex = jedis.setex("k4", 100, "v3");System.out.println(setex);
- 关于hash的命令
- 存值1——hset~~~~hset
//存值long hset = jedis.hset("h1", "name", "lay");System.out.println("存入h1的键值对:"+hset);
- 存值2,存入map——hset~~~~hset
//设置一个mapMap<String,String> map=new HashMap<>();map.put("name","章三");map.put("age","18");long h2 = jedis.hset("h2", map);System.out.println("存入h2的键值对"+h2);
存值2,存入map
获取指定的key中指定的键值对的value值——hget~~~~hget
//取值String hget = jedis.hget("h2", "name");System.out.println("获取h2中name的值"+hget);
- 获取key中所有键值对的值——hgetAll~~~~hgetAll
//获取key中的素有键值对的值Map<String, String> h21 = jedis.hgetAll("h2");System.out.println("获取h2中所有键值对的值"+h21);
- 获取哈希表中所有的值——hvals~~~~hvals
//获取所有哈希表中的值List<String> h22 = jedis.hvals("h2");System.out.println(h22);
- 获取哈希表中所有的字段——hkeys~~~~hkeys
//获取所有哈希表中所有的字段Set<String> h23 = jedis.hkeys("h2");System.out.println(h23);
1.2 集群模式
- 连接redis的信息
public static void main(String[] args) {Set<HostAndPort> nodes=new HashSet<>();nodes.add(new HostAndPort("# 1. Java连接Redis> 思考:我们之前操作redis都是通过命令行的客户端来操作。在开发时都是通过java项目操作redisjava提高连接redis的方式jedis。我们需要遵循jedis协议。****## 1.1 单机模式**引入依赖**```xml
<!--引入java连接redis的驱动--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency>
若使用3.8.1的依赖,jedis中的setex方法会被划去
<dependency><groupId>repMaven.redis.clients</groupId><artifactId>jedis</artifactId><version>3.8.0</version> </dependency>
编写代码
package com.zmq;import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;/*** @program: redis1* @description: java连接redis* @author: zmq**/
public class Test01 {public static void main(String[] args) {//连接redis的信息,默认连接本地的redis端口 端口号6379,所有关于redis操作的功能都在Jedis类中Jedis jedis=new Jedis("172.16.7.112",6379);//关于key的命令//获取所有key值Set<String> keys = jedis.keys("*");System.out.println("获取所有的keys:"+keys);//删除key的个数Long del = jedis.del("ll", "l1");System.out.println("删除key的个数"+del);//判定指定的key是否存在Boolean k4 = jedis.exists("k4");System.out.println("判断指定的k4是否存在"+k4);//给key指定过期时间jedis.expire("lll",100);//string类型//添加数据String set = jedis.set("k1", "v1");System.out.println("存入k1的值"+set);//获取指定的值String s = jedis.get("k1");System.out.println("获取指定k1的值"+s);//判断指定的值是否存在,若不存在,就创建Long k2 = jedis.setnx("k2", "v2");System.out.println("如果k2不存在,则设置k2的值:"+k2);jedis.setnx("k3","110");//值递增Long k3 = jedis.incr("k3");System.out.println("k3的值加1"+k3);//值递减Long k31 = jedis.decr("k3");System.out.println("k3的值减1"+k31);//创建key并指定过期时间String setex = jedis.setex("k4", 100, "v3");System.out.println(setex);//关于hash的命令//存值long hset = jedis.hset("h1", "name", "lay");System.out.println("存入h1的键值对:"+hset);//设置一个mapMap<String,String> map=new HashMap<>();map.put("name","章三");map.put("age","18");long h2 = jedis.hset("h2", map);System.out.println("存入h2的键值对"+h2);//取值String hget = jedis.hget("h2", "name");System.out.println("获取h2中name的值"+hget);//获取key中的素有键值对的值Map<String, String> h21 = jedis.hgetAll("h2");System.out.println("获取h2中所有键值对的值"+h21);//获取所有哈希表中的值List<String> h22 = jedis.hvals("h2");System.out.println(h22);//获取所有哈希表中所有的字段Set<String> h23 = jedis.hkeys("h2");System.out.println(h23);}
}
- 关于连接redis的信息
- 连接redis的信息,默认连接本地的redis端口 端口号6379
所有关于redis操作的功能都在Jedis类中
Jedis jedis=new Jedis("172.16.8.110",6379);
- 关于key的命令
- 获取所有key值——keys~~~~keys
//获取所有key值Set<String> keys = jedis.keys("*");System.out.println("获取所有的keys:"+keys);
- 删除key的个数——del~~~~del
//删除key的个数Long del = jedis.del("ll", "l1");System.out.println("删除key的个数"+del);
- 判定指定的可以是否存在——exists~~~~exists
//判定指定的key是否存在Boolean k4 = jedis.exists("k4");System.out.println("判断指定的k4是否存在"+k4);
- 创建key并给key指定过期时间——expire~~~~expire
//给key指定过期时间jedis.expire("lll",100);
- 关于字符串String的命令
- 添加数据——set~~~~set
//添加数据String set = jedis.set("k1", "v1");System.out.println("存入k1的值"+set);
- 获取指定的值——get~~~~get
//获取指定的值String s = jedis.get("k1");System.out.println("获取指定k1的值"+s);
- 判断指定的值是否存在,若不存在,就创建——setnx~~~~setnx
//判断指定的值是否存在,若不存在,就创建Long k2 = jedis.setnx("k2", "v2");System.out.println("如果k2不存在,则设置k2的值:"+k2);
- 值递增,每次加1——incr~~~~incr
jedis.setnx("k3","110");//值递增Long k3 = jedis.incr("k3");System.out.println("k3的值加1"+k3);
- 值递减,每次减1——decr~~~~decr
//值递减Long k31 = jedis.decr("k3");System.out.println("k3的值减1"+k31);
- 创建key并指定过期时间——setex~~~~setex
//创建key并指定过期时间String setex = jedis.setex("k4", 100, "v3");System.out.println(setex);
- 关于hash的命令
- 存值1——hset~~~~hset
//存值long hset = jedis.hset("h1", "name", "lay");System.out.println("存入h1的键值对:"+hset);
- 存值2,存入map——hset~~~~hset
//设置一个mapMap<String,String> map=new HashMap<>();map.put("name","章三");map.put("age","18");long h2 = jedis.hset("h2", map);System.out.println("存入h2的键值对"+h2);
存值2,存入map
获取指定的key中指定的键值对的value值——hget~~~~hget
//取值String hget = jedis.hget("h2", "name");System.out.println("获取h2中name的值"+hget);
- 获取key中所有键值对的值——hgetAll~~~~hgetAll
//获取key中的素有键值对的值Map<String, String> h21 = jedis.hgetAll("h2");System.out.println("获取h2中所有键值对的值"+h21);
- 获取哈希表中所有的值——hvals~~~~hvals
//获取所有哈希表中的值List<String> h22 = jedis.hvals("h2");System.out.println(h22);
- 获取哈希表中所有的字段——hkeys~~~~hkeys
//获取所有哈希表中所有的字段Set<String> h23 = jedis.hkeys("h2");System.out.println(h23);
1.2 集群模式
- 连接redis的信息
public static void main(String[] args) {Set<HostAndPort> nodes=new HashSet<>();nodes.add(new HostAndPort("192.168.112.189",7001));nodes.add(new HostAndPort("192.168.112.189",7002));nodes.add(new HostAndPort("192.168.112.189",7003));nodes.add(new HostAndPort("192.168.112.189",7004));nodes.add(new HostAndPort("192.168.112.189",7005));nodes.add(new HostAndPort("192.168.112.189",7006));JedisCluster jedisCluster=new JedisCluster(nodes);jedisCluster.set("k5","666");System.out.println(jedisCluster.get("k5"));}
适合ssm项目
2. springboot整合redis
starter启动依赖——包含自动装配类,完成相应的装配功能
- 有关依赖——spring-boot-starter-data-redis
<!--引入了redis整合springboot 的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
- 修改配置文件
#单机模式的配置
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器地址
spring.redis.host=IP地址
#Redis数据库索引(默认为0)
spring.redis.database=1
#连接池最大连接数(使用负值表示没有限制)
#spring.redis.jedis.pool.max-active=100
#连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=10
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=10000ms
- 使用
springboot整合redis时封装了两个工具类:StringRedisTemplate和RedisTemplate——springboot中用于操作redsi的类
StringRedisTemplate它是RedisTemplate的子类。StringRedisTemplate里面只能存放字符串的内容
2.1 StringRedisTemplate
在测试类中进行相关方法的测试
首先需要自动注入StringRedisTemplate类
StringRedisTemplate类:是RedisTemplate的子类,key和value均为字符串
RedisTemplate中定义了5中数据结构操作
stringRedisTemplate.opsForValue();//操作字符串stringRedisTemplate.opsForHash();//操作hashstringRedisTemplate.opsForList();//操作列表stringRedisTemplate.opsForSet();//操作无序集合stringRedisTemplate.opsForZSet();//操作有序集合——有序是score的有序
- 关于key的操作
- 获取所有的key——keys
//获取所有的keySet<String> keys = stringRedisTemplate.keys("*");System.out.println("所有的key:"+keys);
返回值为Set集合,因为key唯一
- 是否删除指定的key,返回值为boolean——delete——释放锁
//删除指定的key——返回值为booleanBoolean k1 = stringRedisTemplate.delete("k1");System.out.println("是否删除指定的k1:"+k1);
返回值为boolean
- 是否存在指定key——haskey
//判断指定的key是否存在——返回值为booleanBoolean k11 = stringRedisTemplate.hasKey("k1");System.out.println("是否存在k1:"+k11);
返回值为boolean
- 是否设置过期时间——expire
//设置过期时间——返回值为booleanBoolean k12 = stringRedisTemplate.expire("k1", 10, TimeUnit.HOURS);System.out.println("是否设置过期时间:"+k12);
返回值为boolean
- 根据key获取过期时间——getExpire
//根据key获取过期时间 stringRedisTemplate.getExpire("test");
- 根据key获取过期时间并换算成指定的单位——getExpire
//根据key获取过期时间并换算成指定单位 stringRedisTemplate.getExpire("test",TimeUnit.SECONDS);
getExpire(“test”,TimeUnit.SECONDS)
//关于key的操作@Testvoid testKeys() {//获取所有的keySet<String> keys = stringRedisTemplate.keys("*");System.out.println("所有的key:"+keys);//删除指定的key——返回值为booleanBoolean k1 = stringRedisTemplate.delete("k1");System.out.println("是否删除指定的k1:"+k1);//判断指定的key是否存在——返回值为booleanBoolean k11 = stringRedisTemplate.hasKey("k1");System.out.println("是否存在k1:"+k11);//设置过期时间——返回值为booleanBoolean k12 = stringRedisTemplate.expire("k1", 10, TimeUnit.HOURS);System.out.println("是否设置过期时间:"+k12);}
- 关于String的操作
- 得到操作字符串的类对象——opsForValue
//得到操作字符串的类对象ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
- 存放数据——set
//存放数据---set(k,v)opsForValue.set("k1","v1");
- 存放数据,含有过期时间——set
//存放数据--setex(k,second,v)opsForValue.set("k2","20",2,TimeUnit.MINUTES);
- 存放数据,先判断是否已存在——setIfAbsent——分布式锁
//存放数据--setnx(k,v)Boolean aBoolean = opsForValue.setIfAbsent("k3", "v3", 2, TimeUnit.MINUTES);System.out.println("是否设置成功:"+aBoolean);
- 根据key获取val——get
//获取指定的元素String k1 = opsForValue.get("k1");System.out.println("获取指定的元素:"+k1);
- 自增——incream
//自增Long k21 = opsForValue.increment("k2");System.out.println("自增1:"+k21);
- 自增指定长度——incream
//自增指定长度Long k2 = opsForValue.increment("k2", 10);System.out.println("获取指定的元素:"+k2);
- 自减指定长度——incream,数值为负数即可
//自减Long k22 = opsForValue.increment("k2", -1);System.out.println("获取指定的元素:"+k22);
- 重新赋值——getAndSet
//重新赋值String andSet = opsForValue.getAndSet("k1", "vvvv");System.out.println("重新赋值:"+andSet);
//关于String的操作: 在封装的StringRedisTemplate类对应每种数据类型的操作 对应相应的类来完成@Testvoid testString() {//得到操作字符串的类对象ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();//存放数据---set(k,v)opsForValue.set("k1","v1");//存放数据--setex(k,second,v)opsForValue.set("k2","20",2,TimeUnit.MINUTES);//存放数据--setnx(k,v)Boolean aBoolean = opsForValue.setIfAbsent("k3", "v3", 2, TimeUnit.MINUTES);System.out.println("是否设置成功:"+aBoolean);//获取指定的元素String k1 = opsForValue.get("k1");System.out.println("获取指定的元素:"+k1);//自增Long k21 = opsForValue.increment("k2");System.out.println("自增1:"+k21);//自增指定长度Long k2 = opsForValue.increment("k2", 10);System.out.println("获取指定的元素:"+k2);//自减Long k22 = opsForValue.increment("k2", -1);System.out.println("获取指定的元素:"+k22);//重新赋值String andSet = opsForValue.getAndSet("k1", "vvvv");System.out.println("重新赋值:"+andSet);}
- 关于Hash的操作——适合存放对象,操作属性方便
- 获取操作字符串的类对象——opsForHash
//获取操作字符串的类对象HashOperations<String, Object, Object> forHash = stringRedisTemplate.opsForHash();
- 存放数据——put
//存放数据 hset(key,field,value)forHash.put("user","name","ykq");
- 存放map集合——putAll
//存放mapMap<String,String> map=new HashMap<>();map.put("age","18");map.put("adrress","北京");forHash.putAll("user",map);
- 获取指定的元素——get
//获取指定的元素 hget(key,field)Object o = forHash.get("user", "name");System.out.println("获取指定的元素:"+o);
- 获取所有的元素——entries
Map<Object, Object> user = forHash.entries("user");System.out.println("获取所有的元素:"+user);
- 获取所有的key——keys
Set<Object> user1 = forHash.keys("user");System.out.println("获取所有的key:"+user1);
- 获取所有的value——values
List<Object> user2 = forHash.values("user");System.out.println("获取所有的value:"+user2);
//关于Hash的操作@Testpublic void testHash(){//获取操作字符串的类对象HashOperations<String, Object, Object> forHash = stringRedisTemplate.opsForHash();//存放数据 hset(key,field,value)forHash.put("user","name","ykq");//存放mapMap<String,String> map=new HashMap<>();map.put("age","18");map.put("adrress","北京");forHash.putAll("user",map);//获取指定的元素 hget(key,field)Object o = forHash.get("user", "name");System.out.println("获取指定的元素:"+o);Map<Object, Object> user = forHash.entries("user");System.out.println("获取所有的元素:"+user);Set<Object> user1 = forHash.keys("user");System.out.println("获取所有的key:"+user1);List<Object> user2 = forHash.values("user");System.out.println("获取所有的value:"+user2);}
2.2 RedisTemplate
它属于StringRedisTemplate的父类,它的泛型默认都是Object。它可以直接存储任意类型的key和value
序列化
//自动注入StringRedisTemplate模板@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void test1(){ValueOperations valueOperations = redisTemplate.opsForValue();//第一次存值valueOperations.set("k111","v11");//此时出现乱码,且在RedisPlus图形化工具中,并不能点击该key,显示该key不存在System.out.println(valueOperations.get("k111"));//org.springframework.data.redis.serializer.SerializationException: 会出现序列化异常,需要实体类User实现序列化接口//第二次存值valueOperations.set("k12",new User("zxy",18));//把内存中的数据存入磁盘---序列化过程}
上述代码显示的问题:
- 第一次存值,可以成功运行,但出现乱码,且在RedisPlus图形化工具中,并不能点击该key,显示该key不存在
- 第二次存值,报错:序列化异常,需要实体类User实现序列化接口
分析key出现乱码:
key值为乱码:所以key需要序列化,而key默认的序列化方式为JDK序列化,为二进制
StringRedisTemplate类并没有出现乱码——因为他有自己的序列化方式,没有实现JDK序列化
解决:设置key的序列化方式
//设置key的序列化方式redisTemplate.setKeySerializer(new StringRedisSerializer());
此时,解决key的乱码问题,图形化界面的key可以点击查看,发现value值为乱码:
value值为乱码:value默认的序列化方式也为JDK序列化,JDK序列化方式需要实现序列化接口
StringRedisTemplate类并没有出现乱码——因为他有自己的序列化方式,没有实现JDK序列化
解决:设置value的序列化方式
//2. 设置value的序列化方式redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
使用Jackson2JsonRedisSerializer序列化的时候,如果实体类上没有set方法反序列化会报错。
- 若使用FastJsonRedisSerializer序列化方式,需要引入fastjson依赖
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency>
如果使用RedisTemplate,每次都需要人为指定key和value的序列化,所以抽象出指定key和value序列化的工具类
-
配置文件
@Configuration public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(redisConnectionFactory);template.setKeySerializer(jackson2JsonRedisSerializer);template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;} }
2.3 集群模式
修改配置文件即可
#集群模式
spring.redis.cluster.nodes=192.168.112.189:7006,192.168.112.189:7001,192.168.112.189:7002,192.168.112.189:7003,192.168.112.189:7004,192.168.112.189:7005
2.4 二者区别
- StringRedisTemplate和RedisTemplate的区别
- 前者集成后者
- 数据不共通的。即StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据
- SDR默认采用的序列化有两种。一种是String的序列化策略,一种是JDK的序列化策略;
- StringRedisTemplate默认采用的是String 的序列化策略,保存的key和value都是采用的该策略序列化并保存的
- RedisTemplate默认采用的是JDK的序列化策略,保存的 key和value都是采用此策略序列化并保存的
相关文章:

Java连接Redis和SpringBoot整合Redis
1. Java连接Redis 思考:我们之前操作redis都是通过命令行的客户端来操作。在开发时都是通过java项目操作redis java提高连接redis的方式为jedis。我们需要遵循jedis协议。 java提供连接mysql的方式为jdbc。 1.1 单机模式 引入依赖 <!--引入java连接redis的驱动…...

快速入门Jupyter notebook
快速入门 Jupyter notebook 一、前言(一)优点(二)特点(三)调用运行(四)新建 二、认识界面快捷键(一)三种模式(1)蓝色模式:…...

Java反射详细学习笔记
动态代理 特点 : 无侵入式的给代码增加额外的功能 ; 代理里面就是对象要被代理的方法 ; 通过接口保证,后面的对象和代理需要实现同一个接口 , 接口中就是被代理的所有方法 ; 如何为java对象创建一个代理 : java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的…...

区块链在艺术市场中的创新:数字艺术品的溯源与版权保护
随着数字技术的迅猛发展,数字艺术品正逐渐成为艺术市场的重要组成部分。然而,数字艺术品的复制和版权问题日益突出,传统的版权管理方式面临挑战。区块链技术作为一种去中心化的分布式账本技术,为解决这些问题提供了新的可能性。本…...

智能编程,一触即发:使用AIGC优化CSS——提升前端开发效率与质量
文章目录 一、AIGC在CSS优化中的应用场景智能代码生成自动布局调整性能优化建议样式和色彩建议 二、使用AIGC优化CSS的具体步骤明确需求选择AIGC工具输入描述或设计稿审查和调整集成和测试 三、AIGC优化CSS的优势与挑战优势:挑战: 《CSS创意项目实践&…...

鸿蒙界面开发
界面开发 //构建 → 界面 build() {//行Row(){//列Column(){//文本 函数名(参数) 对象.方法名(参数) 枚举名.变量名Text(this.message).fontSize(40)//设置文本大小.fontWeight(FontWeight.Bold)//设置文本粗细.fontColor(#ff2152)//设置文本颜色}.widt…...
【JavaScript】use strict
“use strict” 声明时,代码将会在严格模式下执⾏。严格模式包含了⼀些额外的规则和限制。 使⽤ “use strict” 的主要作⽤包括: 变量必须声明后再使⽤,不能通过不使⽤关键字创建全局变量不能通过 delete 操作符删除变量(包括对…...

Linux云计算 |【第一阶段】SERVICES-DAY3
主要内容: 分离解析介绍、NTP时间服务、基础邮件服务(MX记录)、部署postfix邮件服务器、自定义YUM仓库 实操提前准备: ① 设置SELinux、关闭防火墙服务(两台主机) [rootsvr7 ~]# getenforce Permissive …...

Java面试八股之Spring-boot-starter-parent的作用是什么
Spring-boot-starter-parent的作用是什么 spring-boot-starter-parent 是Spring Boot项目中的一个特殊POM(Project Object Model),它主要的作用是提供一系列默认的配置和依赖管理,以便简化项目的构建过程。以下是spring-boot-sta…...
Python 和 Boto3 生成 Amazon S3 对象的 HTTPS URL
在使用 Amazon S3 存储服务时,我们经常需要获取存储桶中对象的 HTTPS URL。这篇博文将详细介绍如何使用 Python 和 Boto3 库来实现这一功能。 背景 Amazon S3(Simple Storage Service)是一种广泛使用的云存储服务。在许多场景中,我们需要获取 S3 存储桶中对象的公开访问 …...
V-bind动态绑定style的案例集合
目录 绑定对象 绑定数组 绑定函数 V-bind 动态绑定 Class 的案例集合-CSDN博客 绑定对象 示例代码如下: <!--html--> <p :style="{width:widthVal,height:heightVal,border:borderVal}">段落</p> <!--js--> data(){ ret…...
深度学习守护夜行安全:夜视行人检测系统详解
基于深度学习的夜视行人检测系统(UI界面YOLOv8/v7/v6/v5代码训练数据集) 引言 夜视行人检测在自动驾驶和智能监控中至关重要。然而,由于光线不足,夜间行人检测面临巨大挑战。深度学习技术,特别是YOLO(You…...

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践
7月12日,第13届PostgreSQL中国技术大会在杭州顺利举办,亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上,亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲…...
如何减少白屏的时间
前端性能优化是前端开发中一个重要环节,它包括很多内容,其中页面的白屏时间是用户最初接触到的部分,白屏时间过长会显著影响用户的留存率和转换率。 我们以一个 APP 内嵌 Webview 打开页面作为例子,来分析页面打开过程以及可优化…...

科研成果 | 高精尖中心取得高性能区块链交易调度技术突破
近日,未来区块链与隐私计算高精尖创新中心研究团队在区块链交易效率方面取得突破性进展,最新成果“高性能区块链交易调度引擎”首次为长安链带来高并行度的交易调度,充分利用现有计算资源,显著提升长安链交易处理速度。 随着区块…...

go语言学习文档精简版
Go语言是一门开源的编程语言,目的在于降低构建简单、可靠、高效软件的门槛。Go平衡了底层系统语言的能力,以及在现代语言中所见到的高级特性。 你好,Go package main // 程序组织成包import "fmt" // fmt包用于格式化输出数据// …...
立元科技-Java面经
面试时间:2024年2月13日 面试地点:线下 面试流程:一轮面试 首先写了点笔试题,但是人家根本不看(这个也就一面) (聊的还行,但是公司环境不是特别的好,一次面试&#x…...

OpenGL入门第六步:材质
目录 结果显示 材质介绍 函数解析 具体代码 结果显示 材质介绍 当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每个分量指定一个颜色,…...

新版SpringSecurity5.x使用与配置
目录 一、了解SpringSecurity 1.1 什么是Spring Security? 1.2 Spring Security功能 1.3 Spring Security原理 1.4 RABC (Role-Based Access Control) 二、SpringSecurity简单案例 2.1 引入SpringSecurity依赖 2.2 创建一个简单的Controller 三、SpringSecu…...
JavaScript实战 - JavaScript 中实现线程锁
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 前言: …...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...