springboot集成RedisTemplate

2023-11-07

基本信息

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。

操作系统:windows10

IDE:IDEA2019

project:spring-boot

Maven依赖

        <!--RedisTemplate 依赖-->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
		<!--spring-boot-web启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--JSON 数据转换支持-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.0</version>
        </dependency>

yml配置文件

# 配置服务应用端口
server:
  port: 8080

spring:
  jmx:
    enabled: false
  redis:
    ## Redis数据库索引(默认为0)
    database: 0
    ## Redis服务器地址
    host: 127.0.0.1
    ## Redis服务器连接端口
    port: 6379
    ## Redis服务器连接密码(默认为空)
    password:

    database-osp: 0
    host-osp: 127.0.0.1
    port-osp: 6379
    password-osp:

    lettuce:
      pool:
        ## 连接池最大连接数(使用负值表示没有限制)
        max-active: 60
        ## 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
        ## 连接池中的最大空闲连接
        max-idle: 20
        ## 连接池中的最小空闲连接
        min-idle: 8
    ## 连接超时时间(毫秒)
    timeout: 300000ms

rest:
  # restTemplate 超时配置
  connect-timeout: 60000
  read-timeout: 60000
  pool-connect-timeout: 60000





redisConfig配置类

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
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.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@Configuration
public class RedisConfig {

    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        //设置序列化
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer<Object> jacksonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();

        //指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonRedisSerializer.setObjectMapper(om);

        //配置redisTemplate
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 配置连接工厂
        template.setConnectionFactory(factory);

        //String类的序列化方式
        RedisSerializer stringSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringSerializer);//key序列化
        template.setValueSerializer(jacksonRedisSerializer);//value序列化
        template.setHashKeySerializer(stringSerializer);//Hash key序列化
        template.setHashValueSerializer(jacksonRedisSerializer);//Hash value序列化
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    @ConditionalOnMissingBean(StringRedisTemplate.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(factory);
        return template;
    }
}

Redis操作string

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * explain: RedisTemplate操作string
 * public interface ValueOperations<K,V>
 * Redis operations for simple (or in Redis terminology 'string') values.
 * ValueOperations可以对String数据结构进行操作
 */

@RestController
@RequestMapping(value = "redisTemplate", produces = "application/json;charset=UTF-8")
public class RedisOperateString {

    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    /**
     * RedisTemplate操作string
     */
    @GetMapping("/operateString")
    private String operateString() {
        ValueOperations<String, Object> opsForValue = redisTemplate.opsForValue();
        //清空redis
        deleteAllKey();

        //void set(K key, V value);
        opsForValue.set("key1", "cat");
        System.out.println(opsForValue.get("key1"));

        //void set(K key, V value, long timeout, TimeUnit unit);
        //由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null
        opsForValue.set("key2", "tom", 10, TimeUnit.SECONDS);
        Object key2 = opsForValue.get("key2");
        System.out.println(key2);

        // multiSet void multiSet(Map<? extends K, ? extends V> m);为多个键分别设置它们的值
        Map<String, String> maps = new HashMap<>();
        maps.put("multiKey1", "multi11");
        maps.put("multiKey2", "multi22");
        maps.put("multiKey3", "multi33");
        opsForValue.multiSet(maps);

        Set<String> keyList = maps.keySet();
        // List<String> keyList = new ArrayList<>(maps.keySet());
        List<Object> list = opsForValue.multiGet(keyList);
        System.out.println(list);

        // getAndSet V getAndSet(K key, V value); 设置键的字符串值并返回其旧值
        opsForValue.set("multiKey4", "multi44");
        System.out.println(opsForValue.getAndSet("multiKey4", "multi"));

        // multiSetIfAbsent Boolean multiSetIfAbsent(Map<? extends K, ? extends V> m);
        // 为多个键分别设置它们的值,如果存在则返回false,不存在返回true
        Boolean aBoolean = opsForValue.multiSetIfAbsent(maps);
        System.out.println(aBoolean);

        // multiGet List<V> multiGet(Collection<K> keys);为多个键分别取出它们的值
        ArrayList<String> keyLists = new ArrayList<>();
        keyLists.add("key1");
        keyLists.add("key2");
        keyLists.add("multiKey1");
        keyLists.add("multiKey2");
        keyLists.add("multiKey3");
        keyLists.add("multiKey4");

        List<Object> objects = opsForValue.multiGet(keyLists);
        System.out.println(objects);

        // increment Long increment(K key, long delta);支持整数
        Long longKey = opsForValue.increment("longKey", 99);
        System.out.println(longKey);
        System.out.println(opsForValue.get("longKey"));

        // increment Double increment(K key, double delta);也支持浮点数
        Double doubleKey = opsForValue.increment("doubleKey", 99.99);
        System.out.println(doubleKey);
        System.out.println(opsForValue.get("doubleKey"));

        // append Integer append(K key, String value);
        // 如果key已经存在并且是一个字符串,则该命令将该值追加到字符串的末尾。
        // 如果键不存在,则它被创建并设置为空字符串,因此APPEND在这种特殊情况下将类似于SET。
        // append()这里redisConfig使用jacksonRedisSerializer序列化方式时会出现序列化失败的情况,导致无法获取value
        opsForValue.append("appendKye", "hello");
        opsForValue.append("appendKye", "world ");
        Object appendKye = opsForValue.get("appendKye");
        System.out.println(appendKye);

        // get String get(K key, long start, long end);截取key所对应的value字符串
        opsForValue.set("key4", "HelloWorld");
        System.out.println(opsForValue.get("key4", 0, 4));
        System.out.println(opsForValue.get("key4", 0, -1));
        System.out.println(opsForValue.get("key4", 0, -6));

        // size Long size(K key); 返回key所对应的value值得长度
        Long key4 = opsForValue.size("key4");
        System.out.println(key4);

        return "method completed ok";
    }


    /**
     * 删除redis中所有的key
     */
    private void deleteAllKey() {
        //获取所有key
        Set<String> keys = redisTemplate.keys("*");
        System.out.println(keys);
        Long delete = redisTemplate.delete(keys);
        System.out.println(delete);
    }
}


Redis操作list


/**
 * explain:public interface ListOperations<K,V>
 * Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
 * ListOperations专门操作list列表
 */

@RestController
@RequestMapping(value = "redisList", produces = "application/json;charset=UTF-8")
public class RedisOperateList {

    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    /**
     * RedisTemplate操作list
     */
    @GetMapping("/operateList")
    private String operateList() {
        ListOperations<String, Object> opsForList = redisTemplate.opsForList();
        deleteAllKey();

        // Long leftPush(K key, V value);
        // 将所有指定的值插入存储在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表。(从左边插入)
        opsForList.leftPush("product:list", "iphone xs max");
        opsForList.leftPush("product:list", "thinkpad x1 carbon");


        // List<V> range(K key, long start, long end);
        // 返回存储在键中的列表的指定元素。偏移开始和停止是基于零的索引,其中0是列表的第一个元素(列表的头部),1是下一个元素
        List<Object> opsList = opsForList.range("product:list", 0, -1);
        System.out.println(opsList);


        // Long leftPushAll(K key, V... values);批量把一个数组插入到列表中
        Object[] stringArr = new String[]{"1", "2", "3"};
        opsForList.leftPushAll("product:list", stringArr);
        System.out.println(opsForList.range("product:list", 0, -1));

        // Long size(K key);
        // 返回存储在键中的列表的长度。如果键不存在,则将其解释为空列表,并返回0。当key存储的值不是列表时返回错误。
        Long size = opsForList.size("product:list");
        System.out.println(size);

        //Long leftPushAll(K key, Collection<V> values);批量把一个集合插入到列表中
        ArrayList<Object> list = new ArrayList<>();
        list.add("4");
        list.add("5");
        list.add("6");
        opsForList.leftPushAll("product:list1", list);
        System.out.println(opsForList.range("product:list1", 0, -1));

        //Long leftPushIfPresent(K key, V value);只有存在key对应的列表才能将这个value值插入到key所对应的列表中
        opsForList.leftPushIfPresent("product:list1", "7");
        System.out.println(opsForList.range("product:list1", 0, -1));


        // Long leftPush(K key, V pivot, V value);把value值放到key对应列表中pivot值的左面,(如果pivot值存在的话)
        opsForList.leftPush("product:list1", "4", "8");
        System.out.println(opsForList.range("product:list1", 0, -1));

        // Long rightPush(K key, V value);
        // 将所有指定的值插入存储在键的列表的头部。如果键不存在,则在执行推送操作之前将其创建为空列表。(从右边插入)
        opsForList.rightPush("product:list1", "java");

        // Long rightPushAll(K key, V... values);
        opsForList.rightPushAll("product:list1", stringArr);
        opsForList.rightPushAll("product:list1", list);
        System.out.println(opsForList.range("product:list1", 0, -1));

        // Long rightPushIfPresent(K key, V value);
        // 只有存在key对应的列表才能将这个value值插入到key所对应的列表中
        opsForList.rightPushIfPresent("product:list1", "7");
        System.out.println(opsForList.range("product:list1", 0, -1));

        // Long rightPush(K key, V pivot, V value);
        // 把value值放到key对应列表中pivot值的右面,如果pivot值存在的话
        opsForList.rightPush("product:list1", "8");
        System.out.println(opsForList.range("product:list1", 0, -1));

        // void set(K key, long index, V value);在列表中index的位置设置value值
        opsForList.set("product:list1", 5, "java1");
        System.out.println(opsForList.range("product:list1", 0, 7));

        // Long remove(K key, long count, Object value);
        // 从存储在键中的列表中删除等于值的元素的第一个计数事件。
        // 计数参数以下列方式影响操作:
        // count> 0:删除等于从头到尾移动的值的元素。
        // count <0:删除等于从尾到头移动的值的元素。
        // count = 0:删除等于value的所有元素。
        opsForList.remove("product:list1", 0, "java1");
        System.out.println(opsForList.range("product:list1", 0, -1));

        // V index(K key, long index);根据下表获取列表中的值,下标是从0开始的
        Object index = opsForList.index("product:list1", 0);
        System.out.println(index);

        // V leftPop(K key);弹出最左边的元素,弹出之后该值在列表中将不复存在
        Object leftPop = opsForList.leftPop("product:list1");
        System.out.println(leftPop);

        // V leftPop(K key, long timeout, TimeUnit unit);
        // 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
        opsForList.leftPop("product:list1", 10, TimeUnit.SECONDS);

        // V rightPop(K key);弹出最右边的元素,弹出之后该值在列表中将不复存在
        System.out.println(opsForList.rightPop("product:list1"));

        // V rightPopAndLeftPush(K sourceKey, K destinationKey);
        // 用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
        opsForList.rightPopAndLeftPush("product:list1", "product:list2");
        // V rightPopAndLeftPush(K sourceKey, K destinationKey, long timeout, TimeUnit unit);
        // 用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
        // 使用:用法与rightPopAndLeftPush(K sourceKey, K destinationKey)一样
        
        return "method completed ok";
    }

    /**
     * 删除redis中所有的key
     */
    private void deleteAllKey() {
        //获取所有key
        Set<String> keys = redisTemplate.keys("*");
        System.out.println(keys);
        Long delete = redisTemplate.delete(keys);
        System.out.println(delete);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot集成RedisTemplate 的相关文章

  • 在 aws-elasticache 上使用 memcached 或 Redis

    我正在 AWS 上开发一个应用程序 并使用 AWS elasticache 进行缓存 我对使用 memcached 或 redis 感到困惑 我阅读了有关 redis 3 0 2 更新以及它现在如何等同于 memchached 的文章 ht
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • StackExchange.Redis Get 函数抛出 TimeoutException

    我在用着StackExchange Redis与 C 和StackExchangeRedisCacheClient Get函数抛出以下异常 myCacheClient Database StringGet txtKey Text myCac
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • Amazon Elasticache Redis 集群 - 无法获取端点

    我需要获取 Amazon Elasticache 中 Redis 集群的终端节点 以下代码适用于 Memcached 集群 但不适用于 Redis import com amazonaws auth AWSCredentials impor
  • Spring Redis删除不删除key

    我正在尝试删除一个 Redis 键 但由于某种原因它没有删除 但也没有抛出异常 这是我要删除的代码 import com example service CustomerService import com example model Cu
  • Redis 队列工作程序在 utcparse 中崩溃

    我正在尝试按照以下教程获得基本的 rq 工作 https blog miguelgrinberg com post the flask mega tutorial part xxii background jobs https blog m
  • 如何配置Lettuce Redis集群异步连接池

    我正在配置我的生菜重新分配池 当我按照官方文档配置时 连接池无法正常初始化 无法获取连接 官方文档指出 RedisClusterClient clusterClient RedisClusterClient create RedisURI
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行
  • 集合成员的 TTL

    Redis 是否可以不为特定键而是为集合的成员设置 TTL 生存时间 我正在使用 Redis 文档提出的标签结构 数据是简单的键值对 标签是包含与每个标签对应的键的集合 例如 gt SETEX id id 1 100 Lorem ipsum
  • 在redis中存储多个嵌套对象

    我想在redis中存储多个复杂的json数据 但不知道如何 这是我的 json 结构 users user01 username ally email email protected cdn cgi l email protection u
  • 检查 Redis 列表中是否已存在某个值

    我想知道是否有办法检查 redis 列表中是否已存在某个键 我无法使用集合 因为我不想强制唯一性 但我确实希望能够检查字符串是否确实存在 Thanks 您的选择如下 Using LREM如果发现则更换它 维护一个单独的SET与您的LIST
  • 无法使用 ASP.NET 会话状态提供程序连接到 Redis 服务器

    一段时间以来 我一直在尝试用 Redis 替换 ASP NET Session 多个小时与适用于 Redis 的 Microsoft ASP NET 会话状态提供程序 http blogs msdn com b webdev archive

随机推荐

  • 基于SUSAN算法的边缘检测方法研究(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 SUSAN算子原理 1 2 SUSAN边缘检测算法 2 运行结果 3 Ma
  • Temporary failure in name resolution

    在启动nexus war包时出现以下提示错误 2016 05 04 13 50 12 ERROR main net sf ehcache Cache Unable to set localhost This prevents creatio
  • 路径搜索问题

    之前碰到的很多问题都可以归结为路径搜索问题 就是求两点之间的路经 1 是否存在路径 2 求任意一条路径 3 求所有路径 求是否有路径和任意一条路径的时候 和正常遍历一样 一个点被mark之后不再访问 因为如果这个结点到终点有路径 之前就应该
  • Word里如何打出带有上下横杠的大写字母i

    换成新罗马就行了
  • Linux系统中关于/etc/rc.d/rc.local中部分命令不执行的问题

    最近遇到了个奇怪的问题 费了一番周折才最终解决 在此给遇到类似问题的同学提供一条思路 在Linux系统中我们有可能需要某些命令在系统启动的时候自动运行 此时我们会想到利用文件 etc rc d rc local 按照正常逻辑 只需要将相应的
  • 通过关键字从百度中爬取相匹配图片,可以爬取多种也可以爬取一种图片

    通过re requests urlib BeautifulSoup os模块实现从百度下载指定类别图片 包含代码逐行解析 import re 进行http请求的第三方库 import requests from urllib import
  • STM32F103屏蔽JTAG/SWD 以及PC13,PC14,PC15的RTC晶振禁用。

    STM32F103屏蔽JTAG SWD 以及PC13 PC14 PC15的RTC晶振禁用 1 关于JTAG SWD屏蔽 2 PC13 PC14 PC15的RTC晶振屏蔽 1 关于JTAG SWD屏蔽 STM32F103系列上的一些IO口在标
  • 免费获取省市县的shp,geojson文件

    整理下资料 需要做准备工作 1 一个全能地图下载 https blog csdn net qq 41619796 article details 90241491 可以获取边界坐标 2 获取文件的网站 http geojson io 3 G
  • Python爬虫实战——爬取新闻数据(简单的深度爬虫)

    前言 又到了爬新闻的环节 好像学爬虫都要去爬爬新闻 没办法谁让新闻一般都很好爬呢XD 拿来练练手 只作为技术分享 这一次要的数据是分在了两个界面 所以试一下深度爬虫 不过是很简单的 数据目标 相关库 import openpyxl impo
  • 本地python连接腾讯云数据库

    文章目录 前言 免费体验一个云数据库 申请云数据库 开通外网 设置用户账号 开通外网 设置账号密码 创建数据库 用python连接数据库 前言 简单说下云数据库的概念 云的概念其实就是把网络上的服务虚拟话 比如说没有云的时候 搭建数据库 得
  • 查看僵尸进程并杀掉僵尸进程

    在运维过程中 我们经常会碰到机器由于某几个特殊的僵尸进程造成整台服务器上的进程异常卡死 负载变高 例如以下 其中 存在8个僵尸进程 并且进程19712的CPU使用异常 查看具体的僵尸进程有哪些 发现这些子僵尸进程的父进程即为19712进程
  • ASP.NET WebFrom 使用C# 连接 MySql

    内容 对于ASP NET WebFrom连接SQL database的方法网络上有很多大牛都有介绍 本文介绍一种ASP NET WebForm连接MySql database的方法 材料 Visual Studio 2017 MySql最新
  • 华为2288hv5服务器安装ESXI 6.7(一):远程访问服务器管理口

    文章目录 准备条件 实际操作 1 修改本地网卡信息 2 访问网页管理页面 3 修改管理口IP信息 4 通过Wifi登录管理页面 下一步 不管是网络设备也好 或者服务器也罢 从投入使用到寿终正寝 机房都是它们的归宿所在 但是我们不一样 机房常
  • 虎年啦,小老虎一文带你解决困扰多年Linux命令下的vim,中国人不骗中国人,好好学,工作必备,牢记

    初学者来说 先把最简单 最基础 最重要的知识点掌握好 再去研究难度较高 更加高级的知识点 这样由易到难 循序渐进的学习路径 无疑是最合理的 vi和vim是Linux下的一个文本编辑工具 可以理解为Windows的记事本 或Word文档 1
  • Win10系统下python快速安装点云库pclpy-0.11.0

    目录 一 安装Anaconda3 二 pclpy概述 三 安装pclpy 四 测试代码 五 结果展示 六 进入pclpy11环境 七 实验数据 一 安装Anaconda3 见 Anaconda详细安装及使用教程 带图文 二 pclpy概述
  • 为什么jdbc连接一个异常的源,会出现请求失败的结果

    测试1 使用jdbc mysql 1 1 3306 test 这样ip错误的url路径 jdbc会直接抛出异常 测试2 使用jdbc mysql 1 1 1 1 3306 test 这样看似正确的url路径 实际是请求不同的的ip时 请求会
  • Lan8720 网线插拔状态检测

    目的 能够实时的检测网线的插拔状态 并能够根据网线的插拔状态通知到到应用层 让应用层做相应的处理 1 解决问题的根本方法就是看lan8720的数据手册 如果说你用过一款芯片 而没有去研究过它的数据手册时 可以说你没有用过这个芯片 在Lan8
  • 条款20:当std::shared_ptr可能悬空时使用std::weak_ptr

    自相矛盾的是 如果有一个像std shared ptr 见条款19 的但是不参与资源所有权共享的指针是很方便的 换句话说 是一个类似std shared ptr但不影响对象引用计数的指针 这种类型的智能指针必须要解决一个std shared
  • 《算法:第四版》课后练习 1.1 答案

    以下答案纯属个人愚见 作为IT新手 算法代码中难免有逻辑漏洞和其他不足之处 欢迎朋友你点评拍砖 交流争辩能极大开阔思维 愿一起加油进步 1 1 19 在计算机上运行以下程序 1 public class Fibonacci 2 3 publ
  • springboot集成RedisTemplate

    RedisTemplate使用 基本信息 Maven依赖 yml配置文件 redisConfig配置类 Redis操作string Redis操作list 基本信息 spring 封装了 RedisTemplate 对象来进行对redis的