redis集群环境搭建以及java中jedis客户端集群代码实现

2023-10-27

       

      最近项目中用到了redis,所以就找了相关的资料学习了,然后搭建了redis集群,以及客户端的java代码实现。由于对linux不太熟悉,所以在Linux上搭建redis集群的时候碰到了很多问题,下面就大概总结下。

 

redis相关网站:

官网: http://redis.io     中文网:http://www.redis.cn/    文档:http://redisdoc.com/

 

操作系统:centos 6.3

redis版本:3.0.6

java客户端版本: jedis 2.7.2

redis客户端图形用户界面:RedisDesktopManager 下载地址

 

1.redis服务端集群搭建步骤:

  1.下载redis安装包,进行解压安装

  2.安装ruby、rubygems install ruby ,安装ruby的原因是,在进行集群的时候,使用的是ruby语言工具实现的,所以在集群之前首先需要搭建ruby的环境

  3.在上述步骤完成之后,便可以搭建集群环境,redis提供了两种集群搭建方法,执行脚本方法(安装包下面的util包中)和手动搭建。

  注意:

  1.在集群的时候,如果是远端客户端访问redis服务端,那么在分片的时候,需要使用Ip进行分片,下面会详细说

  2.在创建每个节点的时候,不要只用redis-server ,使用绝对路径下的redis-server xxx

  具体的安装步骤如下:http://blog.csdn.net/xu470438000/article/details/42971091

  附件:在安装ruby的时候,需要gemredis,下载地址在下面。

2.客户端(java):

注意:

1.本文的客户端使用的是java,官网中对于java客户端也提供了不少的client,但是本文使用的是官方推荐的jedis。

2.在项目开发中,一般情况下都会用到spring来管理应用,本文也是如此,spring 本身也提供了对redis的集成支持,具体的网址:http://projects.spring.io/spring-data-redis,

 但是好像目前spring-data-redis不提供集群的功能,所以本文没有使用它,而是使用了原装的jedis来进行开发,如果在项目中没有用到集群的功能,则可以使用spirng-data-redis。

 

 

 

下面是具体的代码实现

 

1.maven依赖

 

 

		<dependency>
		    <groupId>redis.clients</groupId>
		    <artifactId>jedis</artifactId>
		    <version>2.7.2</version>
		</dependency>

 

 

2.applicationContext.xml中的配置

 

 

    <!-- jedis cluster config -->
    <bean name="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig" >
			<property name="maxWaitMillis" value="-1" />
			<property name="maxTotal" value="1000" />
			<property name="minIdle" value="8" />
			<property name="maxIdle" value="100" />
	</bean>

	<bean id="jedisCluster" class="com.besttone.subscribe.util.JedisClusterFactory">
		<property name="addressConfig">
			<value>classpath:redis-config.properties</value>
		</property>
		<property name="addressKeyPrefix" value="address" />  
		
		<property name="timeout" value="300000" />
		<property name="maxRedirections" value="6" />
		<property name="genericObjectPoolConfig" ref="genericObjectPoolConfig" />
	</bean>

 

 

3.JedisClusterFactory实现类

 

public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean {

    private Resource addressConfig;
    private String addressKeyPrefix ;

    private JedisCluster jedisCluster;
    private Integer timeout;
    private Integer maxRedirections;
    private GenericObjectPoolConfig genericObjectPoolConfig;
    
    private Pattern p = Pattern.compile("^.+[:]\\d{1,5}\\s*$");

    @Override
    public JedisCluster getObject() throws Exception {
        return jedisCluster;
    }

    @Override
    public Class<? extends JedisCluster> getObjectType() {
        return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);
    }

    @Override
    public boolean isSingleton() {
        return true;
    }



    private Set<HostAndPort> parseHostAndPort() throws Exception {
        try {
            Properties prop = new Properties();
            prop.load(this.addressConfig.getInputStream());

            Set<HostAndPort> haps = new HashSet<HostAndPort>();
            for (Object key : prop.keySet()) {

                if (!((String) key).startsWith(addressKeyPrefix)) {
                    continue;
                }

                String val = (String) prop.get(key);

                boolean isIpPort = p.matcher(val).matches();

                if (!isIpPort) {
                    throw new IllegalArgumentException("ip 或 port 不合法");
                }
                String[] ipAndPort = val.split(":");

                HostAndPort hap = new HostAndPort(ipAndPort[0], Integer.parseInt(ipAndPort[1]));
                haps.add(hap);
            }

            return haps;
        } catch (IllegalArgumentException ex) {
            throw ex;
        } catch (Exception ex) {
            throw new Exception("解析 jedis 配置文件失败", ex);
        }
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        Set<HostAndPort> haps = this.parseHostAndPort();
        
        jedisCluster = new JedisCluster(haps, timeout, maxRedirections,genericObjectPoolConfig);
        
    }
    public void setAddressConfig(Resource addressConfig) {
        this.addressConfig = addressConfig;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public void setMaxRedirections(int maxRedirections) {
        this.maxRedirections = maxRedirections;
    }

    public void setAddressKeyPrefix(String addressKeyPrefix) {
        this.addressKeyPrefix = addressKeyPrefix;
    }

    public void setGenericObjectPoolConfig(GenericObjectPoolConfig genericObjectPoolConfig) {
        this.genericObjectPoolConfig = genericObjectPoolConfig;
    }

}

 

4.redis-config.properties文件

 

   这是一个集群环境,六个节点(不同端口),三个master ,三个slaver

 

address1=192.168.30.139:7000
address2=192.168.30.139:7001
address3=192.168.30.139:7002
address4=192.168.30.139:7003
address5=192.168.30.139:7004
address6=192.168.30.139:7005

 

5.项目目录图

 

 

 

 

6.代码中使用(此代码为从redis中获取相关信息)

 

 

 

 

ok,运行之后,会发现redis会根据不同的key,把它们放入到不同的节点中,如下图

 

 

7.三个master节点中的数据

 

 

 8.三个slave节点中的数据

 

 

 

 

实践过程中碰到的问题:

 

1.在一切准备好了之后,在操作redis的时候,却报错误:Too many Cluster redirections

由于,我是windows开发环境,在本机开了一个虚拟机,然后在虚拟机中搭建的linux集群环境,本机的ip和虚拟机中的ip不相同,所以报这个错误,

解决方法:在redis集群搭建过程中,在为每个节点分hash槽的时候,执行如下代码(其中,xxx为集群环境中的ip):

./redis-trib.rb create --replicas 1 xxx.xxx.xxx.xxx:7000  xxx.xxx.xxx.xxx:7001 xxx.xxx.xxx.xxx:7002 xxx.xxx.xxx.xxx:7003 xxx.xxx.xxx.xxx:7004 xxx.xxx.xxx.xxx:7005./redis-trib.rb create --replicas 1 127.0.0.1:7000  127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

2.在一切搭建好后,我们使用redis-cli登陆,当命令:set msg XXX时,报错:

 

(error) MOVED 6257 192.168.30.141:7001

 解决:在使用客户端登陆时:加上-c参数,即:

 redis-cli -c -h 192.168.30.141 -p 7000

 

 ok,以上满足使用,结束!!

 

 

 

 

 

 

-----------------------------------------------------------------------下面是我前一段时间看redis资料,总结的一些东东,记录下来-------------------------------------------------------------------------------------------

 

 

1.redis是什么?

redis(remote dictionary server):是一个以key-value形式存储于内存中的数据库.提供了 String / List / Set / Sort Set /Hash 五种数据结构。

服务器在断电之后,仍然可以恢复到断电之前的状态。

资料: 官网 : http://redis.io   中文网:     http://www.redis.cn/         相关文档: http://redisdoc.com/

2.redis特点?

线程模型:单线程-多路复用io模型

性能高:支持读 11万/秒  ,  写 8万/秒

存储: 内存 ;  RDB文件(二进制安全的真实数据) ;  AOF文件(客户端的命令集合)

事务: 支持事务(每个客户端串行执行命令,其他客户端处于阻塞状态)

发布/订阅模式:  功能? 什么场景使用??

3.redis数据类型

String:动态字符串(每个key都是一个String)

编码方式:int / raw() /embstr

应用场景:普通的string场景

List:列表结构,有序可重复的结构。它拥有队列的特性。 

编码方式:ziplist / linkedlist (如果数据量较小,且是数字或者字符串,则内部结构为 ziplist)

应用场景:普通的集合数据

Set:集合结构,不重复的集合结构。

编码方式:intset(整数集合) / hashtable

应用场景:普通的非重复集合数据;支持取交集、取并集等操作

Sort Set:有序集合结构,和Set比较起来,它是有序的。

编码方式:ziplist / skiplist

应用场景:有序不重复的集合数据

Hash:哈希结构,存储多个key:value的结构,此种结构可以存储对象 ;  如  HMSET  user(key)  username value1 password value2

编码方式:ziplist / hashtable

应用场景: 从关系型数据库去出一条数据,就可以让入到此种结构中

4.内存优化

redis提供内存回收策略,根据使用的情况可以选择适当的回收策略

redis提供内存共享策略,服务器启动时,会自动创建0-9999的数字对象,其他地方使用,可以直接引用。

本质:对内存的操作,其实是在每一个redis对象结构内都有一个count的属性,该属性记录了这个对象被引用的次数,如果为0,那么在内存回收时将回收该空间。

save参数调整:当满足条件时,触发SAVE命令,持久化到RDB文件

appendonly参数: 默认no ,若yes,则开启AOF文件持久化; BGREWRITEAOF  命令 持久化。其中appendsync参数调整具体的持久化策略,默认为每秒

内存回收策略:

5.发布订阅模式

 

6.数据过期设置

 

可以根据业务需求,将某些数据进行日期设置

 

7.事务

单线程处理所有客户端发来的请求,所以当有一个客户端在执行,其他客户端只能处于阻塞态。只有当前客户端请求完毕,其他客户端才能请求

8.数据存储

RDB文件模式(快照):该模式存储的是真实数据,SAVE /BGSAVE 命令 可以将内存中的数据存储到磁盘文件中。SAVE和BGSAVE区别在于,SAVE是同步命令,

            即当执行该命令,其他客户端处于阻塞状态;而BGSAVE 命令则是开启一个子进程处理,不会影响主进程操作。

AOF文件模式:该模式存储的是服务器执行的命令集合,BGREWRITEAOF 命令。 该模式是appendonly参数控制,若打开,则会将数据同步到aof文件中

特点:该模式下,会在服务器端开辟一段缓冲内存来存储最近时间单位的命令,所以该点要注意。同样,它也是子进程进行执行

注意:AOF模式的更新频率比RDB高,若开启AOF模式的情况下,优先载入AOF文件内容

9.数据恢复策略

若RDB模式开启:重启服务器只加载rdb文件内容

若AOF模式开启:重启服务器只加载aof文件内容

若两者都开启:只加载aof文件内容

 

10主从复制

功能:数据备份,读写分离(测试环境,主服务器写,从服务器读)

步骤:在从服务端器执行: slaveof <masterip> <masterport> 即可维持关系;配置文件中也可以

特点:

1.master可以有多个slave

2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构

3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。

4.主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余

5.可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。

  6.主服务器可以关闭持久化功能(注释掉save参数)

 

11.sentinel(监测系统)

本质:是一个运行在特殊模式下的redis服务器。

功能:监控运行在多机上的主redis服务器,若有某一台主服务器出现故障,将自动把其他正常的从服务器切换为主服务器,代替出现故障主服务器的工作。

特点:

1.不发挥数据库的功能(所有对key以及数据类型操作的命令不能使用)

2.将会给监控的主服务器以及主服务器所属的从服务器发送命令,确认是否下线

3.会和监控同一个主服务器的其他sentinel服务器通信,作用是在共同判断所监控的主服务器的状态

4.根据多个sentinel判断的主服务器状态,来决定是否要进行主从切换,故障转移等

转移:sentinel监控的主服务器配置参数要在 sentinel.conf 文件中配置,启动时加载

 

具体配置安装步骤:

1.http://blog.csdn.net/pi9nc/article/details/17735653

2.http://blog.csdn.net/luyee2010/article/details/9385155

 

12.集群

功能:将众多的key-value集合存在多个节点上,当某一个节点出现障碍,不影响整个集群的功能。

涉及到的关键词:

节点:一个端口的redis服务便是一个节点

槽指派(集群将整个系统分为16384个hash槽):这16384个槽位要全部分布在集群中的主节点上。

重新分片:若某个主节点故障了,将该主节点的槽位分配到其他可以用的主节点上。

上线/下线状态: 是否全部的槽位都分布在节点上。

特点:

1.如果某个节点要集群,必须要设置cluster-enabled yes

2.每个节点都有这16384个槽位所属的节点信息,如果值没有正确进入槽位,那么该节点会提示系统将信息放入正确槽位。重定向的过程会出现一个面向客户端隐藏的MOVED错误

3.集群在线状态也可以进行重新分片

4.集群中的主节点用户处理客户端命令,从节点用于复制主节点的数据,主节点下线时,从节点代替主节点的工作

//注意:目前官方提供的集群功能仍处于内测版本。

 

13.redis基准

redis自带的redis-benchmark 工具,支持各种参数进行性能测试

特点:

1.可以模拟多个客户端处理任意个请求

2.可以测试仅仅少数使用的命令等

注意:测试发现,linux环境下部署的redis服务器性能远高于windows下部署的redis服务器性能, 不在一个层级上面

 

 

14.关系数据库模型的转换

关系型数据库表结构:user表 (uid username password birthday )

在redis中可以这样存在:

1.主键: SET user:uid 1  、  GET user:1

2.其他字段:SET user:uid:username  GET user:5:username ( 5 是通过参数值传进来的)

3.表数据也可以存在hash结构中:      HMSET user:uid username value1 password value2 birthday value3

 

15.排序

 

 

16.管道

功能:客户端一次可以传送多个命令到服务器,减少往返时延。大大提高性能。

 

 

17.优化

redis提供一些简单的内存优化策略,如过期数据清除,内存数据共享,

 

 

18.持久化

 

 

 

 

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

redis集群环境搭建以及java中jedis客户端集群代码实现 的相关文章

  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 使用 MongoDB 作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

    我们目前正在为一家专业公司内部实施类似 CRM 的解决方案 由于存储信息的性质以及信息的不同值和键 我们决定使用文档存储数据库 因为它完全适合目的 在本例中我们选择 MongoDB 作为此 CRM 解决方案的一部分 我们希望存储实体之间的关
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • 【MindSpore】一种参数归一化实现方式

    1 功能描述 MindSpore实现WeightNorm参数归一化 2 实现分析 在MindSpore实现高性能方案 建议采用图模式 同时也能保证动静统一 MindSpore图模式需要把归一化操作表达到整图里 可以采用自定义的方式在网络结构
  • Mairadb数据库的备份和恢复

    Mairadb数据库的备份和恢复 一 检查数据库状态 1 检查mariadb的服务状态 2 测试进入mariadb数据库 二 配置二进制日志功能 1 修改 etc my conf 2 重启服务 3 查看二进制日志文件 4 查看binlog开
  • chrome浏览器设置广告拦截器-Adblock Plus

    1 点击下面 chrome 网上应用店 Adblock Plus 的插件链接地址 https chrome google com webstore detail adblock plus free ad bloc cfhdojbkjhnkl
  • 【个人记录】bert初步学习

    目的 背景 使用医疗方面的bert模型 进行实体识别和医患匹配 参考 如何快速使用BERT 知乎 zhihu com tensorflow版本与python版本不相容的问题 fltenwall的博客 CSDN博客 中文医疗预训练模型 MC
  • ICLR 2022

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 CrossFormer A Versatile Vision Transformer Based on Cross scale Attention CrossForme
  • 安卓架构组件实战——Lifecycle

    注 本文涉及代码请看 项目源码 Lifecycle是谷歌推出的一个架构组件 用于感知组件生命周期 并赋予了非组件对象感知生命周期的能力 Lifecycle组件用来响应另一个组件的生命周期状态变化 例如Activity和Fragment 可以
  • 软路由IP配置指南

    在网络设置中 正确地配置软路由IP是至关重要的一步 本文将以轻松风格为您提供详细解决方案 帮助您完成这个任务 并确保操作价值和专业度 随着互联网的普及 家庭或小型企业越来越需要强大而可靠的网络连接 使用软路由可以让我们更好地管理局域网内部流
  • 升级springboot2.0升级后出现的问题以及解决办法

    本来是准备升级springcloud的版本 Finchley RC1 gt Greenwich SR3 父模块的pom xml中springcloud版本由Finchley RC1升级到Greenwich SR3 对应的springboot
  • servlet获取表单数据

    Java servlet获取form表单数据 参数 在 Servlet 中如何使用 HttpServletRequest 获取请求参数和 request 对象传递数据有哪些方法 1 获取请求参数 在实际开发中 经常需要获取用户提交的表单数据
  • windows服务器tomcat部署Java项目并配置nginx

    下载安装jdk并配置环境变量 下载安装 百度网盘共享 win64位 提取码 1ytp 配置环境变量 第一步 配置JAVA HOME 值为JDK的安装目录 第二步 配置Path 需要注意Path路径一般是存在的 只需要追加即可 这里使用 JA
  • linux&树莓派开发——“交叉编译&软硬链接“ 工作中必然用到的技术 实现不同主机间交互开发

    交叉编译 一 交叉编译概念 二 为什么要交叉编译 交叉编译的基本知识 三 什么是交叉编译链 3 1 交叉编译链的命名规则 3 2 交叉编译工具链 交叉编译器 是什么 四 交叉编译工具链安装 1 临时有效 关闭窗口就无效了 2 永久有效 多少
  • 编写NodeJs脚本实现接口请求

    要编写运行脚本 需要先搭建开发环境 环境搭建 nodeJs脚本运行 当然需要先安装nodejs环境 官方地址在这里 nodejs官网 打开官网地址 可以看到下面一句话 Node js is an open source cross plat
  • 小程序权限设置:小程序下载图片保存到相册拒绝权限后,再次打开权限的解决方案

    小程序下载图片保存到相册功能 首次操作会提示 保存图片或视频到你的相册 有 拒绝 和 允许 两个选项 如果选择了拒绝就会保存失败 saveImageToPhotosAlbum fail auth deny 那么后续想打开该权限又该怎么操作呢
  • 今天才知道!华为手机摄像头可不止能拍照,它还能提高办公效率

    说起华为手机 大家首先想到的就是国产手机代表 拍照特别厉害 的确华为手机的拍照的确很厉害 但是你知道吗 华为手机的摄像头可不止能拍照哦 其实它还能提高工作效率 摄像头怎么办公 下面我们就一起看看吧 1 文档矫正功能 用相机拍摄文件 PPT幻
  • [Python系列-20]:爬虫 - urllib.request.urlopen(), 函数无法返回的解决办法

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119799484 最近是使用爬
  • SpringCloudAlibaba之Sentinel 熔断规则详解

    Sentinel 熔断降级简介 基本介绍 除了流量控制以外 对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一 一个服务常常会调用别的模块 可能是另外的一个远程服务 数据库 或者第三方 API 等 例如 支付的时候 可能需要远
  • 记录一次docker安装pxc的坑 (unknown option --ck)

    centos7 docker pxc 安装教程可以参考 https blog csdn net u013218587 article details 80863054 遇到的坑 navicat连接不上mysql 首先解决宿主机防火墙问题 最
  • 制造业数字化转型的实战路线图

    转载本文需注明出处 微信公众号EAWorld 违者必究 中国在2015年发布制造强国战略第一个十年的行动纲领 中国制造2025 这是中国部署全面推进实施制造强国的战略文件 按照 中国制造2025 的战略 中国正加快推动新一代信息技术和制造技
  • ChatGPT 真的太强大了!

    如果你问我 2023年最大的机会是什么 那一定是 ChatGPT 从2月份GPT3 5版本发布 到现在的4 0PLUS升级版 ChatGPT的迭代速度已经完全超过了我们的想象 它已经可以替代很多行业的工作 比如说 文案 程序 客服 设计 律
  • redis集群环境搭建以及java中jedis客户端集群代码实现

    最近项目中用到了redis 所以就找了相关的资料学习了 然后搭建了redis集群 以及客户端的java代码实现 由于对linux不太熟悉 所以在Linux上搭建redis集群的时候碰到了很多问题 下面就大概总结下 redis相关网站 官网