Redis学习笔记五:redis主从复制

2023-10-31

      通常使用redis时,如果redis存储的是一些非常重要的数据,那么只配置一台服务器的redis是有风险的,以为如果主服务器宕机,影响到正常业务之外,最终要的是数据的丢失,因此我们常常会配置多台redis做集群,除了防止主机宕机,我们还可以实现读写分离,任务分离等。

      为了使redis其高可用,redis在2.4版本后加入了sentinel功能,主要功能是在主机宕机时自动选举出一个slave,并且将其转换为master,保证业务的正常运行。这篇文章我们就模拟配置redis的集群和sentinel监控功能


一、 配置redis集群


1、 服务器信息

      系统:centos 6.5 

      服务器: 采用3台服务器,实现一主两从

            主master:192.168.1.11

            从slave1:   192.168.1.12

            从slave1:   192.168.1.13

      确保三台机器安装了相同版本的redis,并且关闭防火墙和seLinux


2、主从服务器配置参考

编辑redis的配置文件:redis.conf

主服务器Master配置(192.168.1.11) 从服务器Slave配置(192.168.1.12 /192.168.1.13)
1、 关闭rdb快照,rdb备份交由slave进行(只需在一台slave开启rdb即可)

       #save 900 1

       #save 300 10

       #save 60 10000

2、 开启aof日志,因为主服务器的aof日志数据是最新最全的,slave在数据同步时有可能会出现延迟
       appendonly yes
       appendfsync everysec
       no-appendfsync-on-rewrite yes
       auto-aof-rewrite-percentage 100
       auto-aof-rewrite-min-size 64mb
       appendfilename appendonly.aof

3、 配置ip绑定,redis默认只绑定只允许本机的服务访问,在配置集群时,需要绑定本机的局域网ip后slave才可以连接到master服务器

        bind 127.0.0.1 192.168.1.11

1、配置master的IP和端口

格式: slaveof  192.168.1.11 6379

2、 配置密码(如果master有密码)

3、 打开 rdb快照功能(多台slave只需开一台)

       save 900 1
       save 300 10
       save 60 10000
       stop-writes-on-bgsave-error yes
       rdbcompression yes
       rdbchecksum yes
       dbfilename "dump.rdb"
       dir "/root"

4、 通常从服务器不能写,因此需要配置是否只读,配置项:

       slave-read-only yes

5、 优先级配置

       slave-priority 100


3、 配置成功后启动三台服务器的redis,启动顺序最好为先master后slave,启动后,登录到redis命令行,执行info Replication

主服务器Replication信息(192.168.1.11) 从服务器Replication信息(192.168.1.12 / 192.168.1.13)
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.12,port=6379,state=online,offset=2802,lag=0
slave1:ip=192.168.1.13,port=6379,state=online,offset=2802,lag=1

master_repl_offset:2802
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:2801

# Replication
role:slave
master_host:192.168.1.11
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:2480
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0


Replication主要需要监控的信息已标红,上面的信息则表示主从启动成功


二、 sentinel监控


如果主服务器master挂了,那么我们需要切换master服务器并且将其他slave指向新的master,具体的操作流程为:选取一台slave, 该服务器是我们即将配置的new master,将其slaveof选项配为no one,并且将slave-read-only配置为no,然后将其它所有的slave指向新的master

1、 手动进行master-slave切换

1)登录192.168.1.11(master)主机的redis,执行shutdown命令关闭redis

2)登录192.168.1.12(new master),执行如下命令:

127.0.0.1:6379> slaveof no one

127.0.0.1:6379> config set slave-read-only no

3)登录192.168.1.13(slave),执行如下命令,:

127.0.0.1:6379> slaveof 192.168.1.12 6379   #若有多台slave,则所有slave都需重新指定master

此时再执行info Replication命令,发现主从一切换完毕

2、 sentinel监控实现自动切换

1、 配置文件位置

sentinel.conf配置文件一般在redis的安装包目录下,将该文件拷贝至拷贝至redis安装目录的根目录下(或/etc下,这个根据个人喜好来定)

2、 sentinel配置说明

[root@master ~]# vi /application/redis/sentinel.conf
port 26379 
# sentinel监听的端口
sentinel monitor mymaster 192.168.1.11 6379 1 
# 主服务器信息
# 注意:末尾的数字n表示当有n个哨兵同事检测到主服务器挂了时,redis才会认为master挂掉并进行从服务器的切换,这里的数字不能大于哨兵的个数,我们只有一个哨兵监控,因此配置1即可,mymaster 可随意起名,但是要与下列的配置保持一致
sentinel down-after-milliseconds mymaster 30000 
# 表示sentinel在多少毫秒后连接不到master认为master断开
sentinel parallel-syncs mymaster 1 
# 表示一次性允许多少slave指向新的new master. 这里默认为1,如果该数值过大会导致新的master服务器IO剧增,保持默认1即可
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh 
# 在重新配置new master,new slave过程,可以触发的脚本,可发邮件或者修改项目中的redis指向等

3、 启动sentinel

/application/redis/bin/redis-server /application/redis/sentinel.conf --sentinel

启动后sentinel会占据终端窗口,若想让sentinel在后台运行,执行下面命令即可:

/application/redis/redis-server /application/redis/sentinel.conf --sentinel 2>&1 >> /tmp/sentinel.log &

状态可检测日志

启动sentinel后,可看到master状态和slave的状态,窗口如下:

[root@master ~]# redis-server /application/redis/sentinel.conf --sentinel
9965:X 20 Jul 10:13:43.110 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.1 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 9965
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

9965:X 20 Jul 10:13:43.111 # Sentinel ID is 79dfd62f9884969637c28f36ced52c2b9a8ac425
9965:X 20 Jul 10:13:43.111 # +monitor master mymaster 192.168.1.11 6379 quorum 1
9965:X 20 Jul 11:25:37.147 * +slave slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379
9965:X 20 Jul 11:25:37.158 * +slave slave 192.168.1.11:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379

4、 此时我们登陆master(192.168.1.11)使用shutdown命令关闭master,

127.0.0.1:6379> shutdown
not connected>

查看两个slave的Replication的状态(使用infoReplication命令),结果如下:

192.168.1.12 192.168.1.13

# Replication
role:slave
master_host:192.168.1.11
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:17472
master_link_down_since_seconds:8     # master断开时间
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# Replication
role:slave
master_host:192.168.1.11
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:17472
master_link_down_since_seconds:8
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

可以看到,两台slave机子会显示主机master为192.168.1.11,但是master_link_status状态为down,表示master已下线,此时sentinel会检测到master已经下线,经过我们设定的超时时间后(sentinel down-after-milliseconds mymaster 30000 ),leader就需要开始将选举一个salve提升为master,此slave必须为状态良好(不能处于SDOWN/ODOWN状态)且权重值最低(redis.conf中的slave-priority参数)的,当master身份被确认后,开始failover,具体流程如下:

[root@master ~]# redis-server /application/redis/sentinel.conf --sentinel
9965:X 20 Jul 10:13:43.110 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.1 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 9965
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

9965:X 20 Jul 10:13:43.111 # Sentinel ID is 79dfd62f9884969637c28f36ced52c2b9a8ac425
9965:X 20 Jul 10:13:43.111 # +monitor master mymaster 192.168.1.11 6379 quorum 1
9965:X 20 Jul 10:17:10.072 # +sdown master mymaster 192.168.1.11 6379
9965:X 20 Jul 10:17:10.072 # +odown master mymaster 192.168.1.11 6379 #quorum 1/1
9965:X 20 Jul 10:17:10.072 # +new-epoch 20
9965:X 20 Jul 10:17:10.072 # +try-failover master mymaster 192.168.1.11 6379
9965:X 20 Jul 10:17:10.093 # +vote-for-leader 79dfd62f9884969637c28f36ced52c2b9a8ac425 20
9965:X 20 Jul 10:17:10.093 # +elected-leader master mymaster 192.168.1.11 6379
9965:X 20 Jul 10:17:10.093 # +failover-state-select-slave master mymaster 192.168.1.11 6379 # Leader开始查找合适的slave
9965:X 20 Jul 10:17:10.194 # +selected-slave slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379  # 确定合适的slave
9965:X 20 Jul 10:17:10.194 * +failover-state-send-slaveof-noone slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379  # Leader向slave发送“slaveof no one”指令,此时slave已经完成master的角色转换
9965:X 20 Jul 10:17:10.279 * +failover-state-wait-promotion slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379   # 等待其他sentinel确认slave
9965:X 20 Jul 10:17:11.103 # +promoted-slave slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379   # 确认成功
9965:X 20 Jul 10:17:11.103 # +failover-state-reconf-slaves master mymaster 192.168.1.11 6379  # 开始对slaves进行reconfig操作
9965:X 20 Jul 10:17:11.172 * +slave-reconf-sent slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379 # 向指定的slave发送“slaveof”指令,告知此slave跟随新的master
9965:X 20 Jul 10:17:12.167 * +slave-reconf-inprog slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379  # 此slave正在执行slaveof + SYNC过程,如过slave收到“+slave-reconf-sent”之后将会执行slaveof操作
9965:X 20 Jul 10:17:12.167 * +slave-reconf-done slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379  # 此slave同步完成,此后leader可以继续下一个slave的reconfig操作,直至操作完所有slave
9965:X 20 Jul 10:17:12.257 # +failover-end master mymaster 192.168.1.11 6379  # 切换完成
9965:X 20 Jul 10:17:12.257 # +switch-master mymaster 192.168.1.11 6379 192.168.1.13 6379    # 切换master后,所有sentinel开始监控新的master
9965:X 20 Jul 10:17:12.259 * +slave slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.13 6379
9965:X 20 Jul 10:17:12.259 * +slave slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379
9965:X 20 Jul 10:17:42.270 # +sdown slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379  # 11号机子下线

再查看两台slave的状态,发现192.168.1.13的role已变为master,并且192.168.1.12这台服务器已经指向了新的master

192.168.1.12 192.168.1.13

# Replication
role:slave
master_host:192.168.1.13
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:8934
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.12,port=6379,state=online,offset=5776,lag=1
master_repl_offset:5917
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5916


这时如果重新启动192.168.1.11这台原始的master主句

sentinel监控端显示:

10050:X 20 Jul 12:17:50.984 # -sdown slave 192.168.1.11:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379
10050:X 20 Jul 12:18:00.904 * +convert-to-slave slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379 # 转换为从服务器

发现sentinel已经将原有的主服务master器转换为了从服务器slave







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

Redis学习笔记五:redis主从复制 的相关文章

  • ServiceStack:手动调用服务时恢复管道?

    作为后续这个问题 https stackoverflow com questions 64560997 servicestack messaging api can it make a broadcast 我想了解如何改进我对服务的手动调用
  • 如何在实时添加对象时从 Redis 中弹出对象?

    我想让 Node js 进程运行 因为它正在检查 Redis 服务器是否有任何新的弹出内容 另一个进程将偶尔进行推送 而 Node 进程将尝试弹出任何进来的内容 Node 进程将保持运行 有人能给我指出一个好的方向吗 我正在尝试找出如何监听
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • Docker&Celery - 错误:Pidfile (celerybeat.pid) 已存在

    应用程序包括 姜戈 雷迪斯 芹菜 码头工人 Postgres 在将项目合并到 docker 之前 一切都运行顺利且正常 但是一旦将其移入容器 就开始出现问题 起初它开始得很好 但过了一会儿我确实收到了以下错误 celery beat 1 E
  • Laravel - 缓存 Eloquent 并频繁更新

    是否可以对经常修改的对象使用缓存 例如 假设我们有一个 BlogPost 对象 并且有一个经常更改的 num of views 列 以及其他列 是否可以更新缓存和数据库中的 num of views 字段 而不破坏缓存对象并重新创建它 我可
  • Spring RedisTemplate:8次调用后方法键挂起

    我使用 Spring RedisTemplate spring data redis 1 7 1 与 Redis 进行通信 我需要通过正则表达式获取然后删除键 例如 context user1 我用的方法 RedisTemplate key
  • python 3.5 中的 json.loads 和 Redis

    我使用 json dumps 创建了一个 JSON 对象 并在 Redis 列表中将其 RPUSH ed 当使用 LRANGE redis lrange 返回 JSON 时 我收到一个二进制字符串 b si 00 ff 所以 json lo
  • 为什么Redis中不建议使用KEYS?

    在Redis中 建议不要使用按键命令 https redis io commands KEYS 为什么会这样呢 是因为它的时间复杂度是 O N 吗 或者是别的什么原因 我做了下面的实验来证明KEYS命令有多么危险 当带有 KEYS 的一个命
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • 在 aws-elasticache 上使用 memcached 或 Redis

    我正在 AWS 上开发一个应用程序 并使用 AWS elasticache 进行缓存 我对使用 memcached 或 redis 感到困惑 我阅读了有关 redis 3 0 2 更新以及它现在如何等同于 memchached 的文章 ht
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大

随机推荐

  • Android系统启动流程(八)——Launcher启动

    1 概述 Launcher是Android的桌面应用 也是一个系统初始化完成之后自动拉起的应用 Launcher会在SystemServer进程初始化完成之后 在ActivityManagerService的systemReady方法中开始
  • 图算法(二十五):子图匹配(Subgraph Matching)【基本的图查询操作,意在发掘图重要的子结构】【适用场景:社交网络分析、群体发现、异常检测】【在一个给定的大图里找到与给定小图同构的子图】

    一 概述 子图匹配 subgraph matching 算法的目的是在一个给定的大图里面找到与一个给定小图同构的子图 这是一种基本的图查询操作 意在发掘图重要的子结构 适用场景 子图匹配 subgraph matching 算法适用于社交网
  • Routh-Hurwitz Criterion 劳斯稳定判据

    Routh Hurwitz Criterion 为什么仅仅要有一个极点在右半平面 那么系统就不会稳定 比如H s 1 s 1 1 s 3 1 s 2 这里有个极点s 2 在有半平面 通过laplace 反变换能够知道 当时间足够长的时候 A
  • [Unity]Crest Ocean System增加海面透明度

    原因 插件没有设置海面透明度的功能 修改shader可以修改透明度 解决方案 关键代码 Shader Ocean shader Shader Crest Ocean SubShader Pass half4 Frag const Varyi
  • FreeSwitch模式:Inbound和Outbound的区别

    14 Inbound和Outbound Outbound模式相较于嵌入式语言相比更强大 适合控制单腿的呼叫 实现复杂的IVR应用 而Inbound更适合接收所有的事件 与多条腿进行交互 进行更复杂的呼叫控制 其中 在Outbound模式中
  • 面试系列之线程篇

    线程和进程 进程是资源分配和调度的最小独立单元 线程是CPU调度的基本单元 一个进程可以包含多个线程 多个线程共享该进程的资源 线程可以看作是轻量级的进程 进程间通信的方式 volatile synchronized wait notify
  • 字符串学习&总结(感觉主要是总结模板)

    目录 前言 一 哈希 导读 HASH模板 哈希 双哈希 hash应用 hash牛逼克拉斯 0 核心操作 求子串哈希值 1 字符串匹配 2 允许k次失配的字符串匹配 3 最长回文子串 hash操作简单 可解决的问题有点多啊 nice 4 最长
  • 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务

    RPC Remote Procedure Call 服务 也即远程过程调用 在互联网企业技术架构中占据了举足轻重的地位 尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下 RPC 更扮演了重要角色 Google 开源了 gRPC F
  • Grpc demo java 实现

    环境 JDK8 Maven3 6 3 我的 Grpc java demo https github com 999bug grpc java 记得star 搭建步骤 1 利用代码编译器创建maven 项目 2 添加依赖坐标
  • python自动化之models 进阶操作二

    PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET def all self 获取所有的数据对象 def filter self args kwargs 条件查询 条
  • hive--分组排序函数

    分组排序 最主要的区别就是如果两个分数相同 排名是否同列以及排名是否相同 这个方法仅在mysql8 0以后 hive或其他数据库支持 直接看图 原始表 原表如上 想要的结果如下 从图中可以发现 row number函数 如果并列但名次反而不
  • (四十四)数据字典-树状treeview树的实现

    数据字典 treeview树的实现 什么是数据字典 顾名思义数据字典 数据 字典 字典是用来查询东西的 所以数据字典就是描述数据信息的集合 数据字典是一种通用的程序设计方法 程序中有很多主体 每个主体的都有很多属性 每种属性都有很多取值并且
  • Python中的变量与常量

    目录标题 一 变量 1 什么是变量 2 python代码中变量的展示和练习 3 用画图的形式展示变量 变量值与内存之间的关系 二 常量 1 什么是常量 2 python中的常量 一 变量 1 什么是变量 程序运行过程中 值会发生变化的量 也
  • xshell连接centos7虚拟机时显示SSH服务器拒绝了密码

    xshell连接centos7虚拟机时显示SSH服务器拒绝了密码 这个问题可能有以下几个原因 1 SSH服务未启动或未安装 在CentOS上安装SSH服务 可以使用以下命令 sudo yum install openssh server 然
  • xp服务器文档在哪里设置密码,xp ftp服务器设置密码

    xp ftp服务器设置密码 内容精选 换一换 登录Windows操作系统的弹性云服务器时 需使用密码方式登录 因此 用户需先根据创建弹性云服务器时使用的密钥文件 获取该弹性云服务器初始安装时系统生成的管理员密码 Administrator帐
  • Visual Studio2019中源文件 <bits/stdc++.h>无法打开解决方法

    在Visual Studio2019中创建stdc h文件 将下面代码保存文件当中 C includes used for precompiling C Copyright C 2003 2015 Free Software Foundat
  • MySQL介绍,SQL入门及表结构分析

    数据库分类 关系型数据库 SQL 通过表与表之间 行与列之间的关系去存储数据 如MySQL Oracle 两者本质都是DBMS 数据库管理系统 非关系型数据库 No SQL意为Not only SQL 通过对象自身属性去存储 如Redis
  • git cherry-pick使用总结

    第一次在csdn发文章 还没找到节奏 请多多指教 这次给大家介绍一下Git中常用的cherry pick cherry pick的作用 将现有的某个提交应用到当前分支上 git cherry pick edit n m parent num
  • QComboBox类的使用,下拉列表框的触发:activated与currentIndexChanged的区别

    一 介绍 QcomboBox属于继承自QWidget 给用户提供一种呈现选项列表的方式 作用 使其占最小的控件 列举最多的选项供用户选择 二 触发条件 当前用户点击所选的具体列表项 两种触发方式 1 void currentIndexCha
  • Redis学习笔记五:redis主从复制

    通常使用redis时 如果redis存储的是一些非常重要的数据 那么只配置一台服务器的redis是有风险的 以为如果主服务器宕机 影响到正常业务之外 最终要的是数据的丢失 因此我们常常会配置多台redis做集群 除了防止主机宕机 我们还可以