云计算第二阶段---DBA Day8-Day9

news2024/11/13 9:40:37

DBA Day8

  该阶段的2天内容,都会和数据库中间件,集群配置有关.  

什么是中间件?

        通俗来说,就是在正式文件内容从客户端发送或获取请求时,在传播过程中地点中间商,负责管理请求,并对其进行分类。 

环境准备:    

准备一台虚拟机,配置好YUM仓库,IP.


redis介绍

什么是字典型数据库?      

        类似 :  key:value   (和函数的定义赋值类似   变量名: 值)

一、部署Redis服务

步骤一:在主机redis64运行redis服务

命令操作如下所示:

 
 
  1. [root@redis64 ~]# yum -y install redis 安装软件
  2. [root@redis64 ~]# systemctl start redis 启动服务
  3. [root@redis64 ~]# netstat -utnlp | grep redis-server 查看端口
  4. tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1970/redis-server 1
  5. [root@redis64 ~]# redis-cli 连接服务
  6. 127.0.0.1:6379> ping 检查能否正在访问
  7. PONG 表示可以正常访问、
  8. 127.0.0.1:6379> set school tarena 存储变量
  9. OK
  10. 127.0.0.1:6379> keys * 查看已有变量
  11. 127.0.0.1:6379> get school 查看变量值
  12. "tarena"
  13. 127.0.0.1:6379> exit 断开连接
  14. [root@redis64 ~]#

步骤二:修改服务运行参数

先停止服务
  1. [root@redis64 ~]# systemctl stop redis

修改配置文件 .在具体行数修改配置文件.

 
 
  1. [root@redis64 ~]# vim /etc/redis.conf
    69 bind 192.168.88.64 #IP地址
    92 port 6364 #端口号
    647 requirepass 123 #密码
    :wq

查看端口

 
 
  1. [root@redis64 ~]# netstat -utnlp | grep redis-server
  2. tcp 0 0 192.168.88.64:6364 0.0.0.0:* LISTEN 2009/redis-server 1
  3. [root@redis64 ~]#

连接服务

 
 
  1. [root@redis64 ~]# redis-cli -h 192.168.88.64 -p 6364 –a 123
  2. 192.168.88.64:6364> keys * 查看存储的变量
  3. 1) "school"
  4. 192.168.88.64:6364> exit 断开连接

或者

 
 
  1. [root@redis64 ~]# redis-cli -h 192.168.88.64 -p 6364 连接服务
  2. 192.168.88.64:6364> ping 不输入密码无法正常访问
  3. (error) NOAUTH Authentication required.
  4. 192.168.88.64:6364> auth 123 #输入密码
  5. OK
  6. 192.168.88.64:6364> keys * #查看存储的变量
  7. 1) "school"
  8. 192.168.88.64:6364> exit #断开连接
  9. [root@redis64 ~]#

常用命令

1)练习如下命令的使用

  • mset mget keys type
  • exists ttl expire move select
  • del    flushdb    flushall

mset 一起存储多个变量

 
 
  1. 192.168.88.64:6364> mset name qq age 80 class nsd2403
  2. OK
  3. 192.168.88.64:6364> keys *
  4. 1) "age"
  5. 2) "classs"
  6. 3) "name"
  7. 4) "school"

mget一起查看多个变量值

 
 
  1. 192.168.88.64:6364> mget name age
  2. 1) "qq"
  3. 2) "80"

keys 使用统配符查看变量

* 匹配所有变量名

? 一个字符

 
 
  1. 192.168.88.64:6364> keys * 查看所有变量名
  2. 1) "age"
  3. 2) "classs"
  4. 3) "name"
  5. 4) "school"
  6. 192.168.88.64:6364> keys ??? 变量名3个字符
  7. 1) "age"
  8. 192.168.88.64:6364> keys a* 变量名a 开头的
  9. 1) "age"
  10. 192.168.88.64:6364>
  11. 192.168.88.64:6364> keys gender 查看指定变量是否存在
  12. (empty list or set) 说明变量没不存在
  13. 192.168.88.64:6364> keys name 存在
  14. 1) "name"
  15. 192.168.88.64:6364>

select 切换库 ,默认库编号 0-15   

redis 默认有16个数据库

 
 
  1. 192.168.88.64:6364> select 1 切换到 1号库里
  2. OK
  3. 192.168.88.64:6364[1]> keys * 查看数据没有数据
  4. (empty list or set)
  5. 192.168.88.64:6364[1]>
  6. 192.168.88.64:6364[1]> select 0 切回0号库
  7. OK
  8. 192.168.88.64:6364> select 16 超出范围报错
  9. (error) ERR DB index is out of range

move 命令 移动变量到其他库里

 
 
  1. 查看变量
  2. 192.168.88.64:6364> keys *
  3. 1) "age"
  4. 2) "classs"
  5. 3) "name"
  6. 4) "school"
  7. 把age 变量移动到1 号库里
  8. 192.168.88.64:6364> move age 1
  9. (integer) 1
  10. 切换到1号库
  11. 192.168.88.64:6364> select 1
  12. OK
  13. 查看变量
  14. 192.168.88.64:6364[1]> keys *
  15. 1) "age"

exists 检查变量是否存储 返回值1 变量存储 返回值是0 变量不存在

 
 
  1. 切换到0号库
  2. 192.168.88.64:6364[1]> select 0
  3. OK
  4. 检查name变量是否存在
  5. 192.168.88.64:6364> exists name
  6. (integer) 1
  7. 192.168.88.64:6364> exists swy
  8. (integer) 0

EXPIRE 命令设置变量的过期时间 不设置变量永不过期

ttl           检查变量可以在内存里存多久

 
 
  1. 存储变量
  2. 192.168.88.64:6364> set sex girl
  3. OK
  4. 查看过期时间
  5. 192.168.88.64:6364> ttl sex
  6. (integer) -1 表示永不过期
  7. 设置过期时间15 秒
  8. 192.168.88.64:6364> expire sex 15
  9. (integer) 1
  10. 没到过期时间可以查看到变量
  11. 192.168.88.64:6364> keys sex
  12. 1) "sex"
  13. 查看剩余时间
  14. 192.168.88.64:6364> ttl sex
  15. (integer) 8 还剩下8秒时间过期
  16. 192.168.88.64:6364> ttl sex
  17. (integer) -2 表示已经过期被删除
  18. 过期后查看不到变量了
  19. 192.168.88.64:6364> keys sex
  20. (empty list or set)
  21. 192.168.88.64:6364>

type 命令检查变量存储数据的类型

 
 
  1. 192.168.88.64:6364> set x 99
  2. OK
  3. 192.168.88.64:6364> mset y 108
  4. OK
  5. 192.168.88.64:6364> type x
  6. string
  7. 192.168.88.64:6364> type y
  8. String
  9. 定义类别类型的变量tea
  10. 192.168.88.64:6364> lpush tea nb wk zzg plj lx
  11. 查看数据类型
  12. 192.168.88.64:6364> type tea
  13. list

del      删除内存里的变量

 
 
  1. 192.168.88.64:6364> keys * 删除前查看
  2. 1) "y"
  3. 2) "tea"
  4. 3) "name"
  5. 4) "school"
  6. 5) "x"
  7. 6) "classs"
  8. 192.168.88.64:6364> del tea y school 一起删除3个变量
  9. (integer) 3
  10. 192.168.88.64:6364> keys * 删除后查看
  11. 1) "name"
  12. 2) "x"
  13. 3) "classs"
  14. 192.168.88.64:6364>

flushdb 删除当前所在库的所有数据

高危操作:类似于linux删根目录
  1. 192.168.88.64:6364> keys *
  2. 1) "name"
  3. 2) "x"
  4. 3) "classs"
  5. 192.168.88.64:6364> flushdb
  6. OK
  7. 192.168.88.64:6364> keys *
  8. (empty list or set)
  9. 192.168.88.64:6364> SELECT 1
  10. OK
  11. 192.168.88.64:6364[1]> keys *
  12. 1) "age"

Flushall 清空内存

 
 
  1. 192.168.88.64:6364[1]> flushall 删除内存里的所有内存里所有数据 (慎用)

二.创建Redis集群

环境准备:

步骤一:准备集群环境

说明:准备做集群的主机,不允许存储数据、不允许设置连接密码

配置服务器192.168.88.51

思路: 
  1. ]# yum -y install redis 安装软件    #安装软件可以用远程连接软件,同步配置.
  2. ]# vim /etc/redis.conf 修改主配置文件夹
  3. 92 port 6379 //端口号
  4. 69 bind 192.168.88.51 //IP地址       #每台机器的ip 和主机名对应,以此类推.
  5. 838 cluster-enabled yes              //启用集群功能
  6. 846 cluster-config-file nodes-6379.conf         //存储集群信息文件
  7. 852 cluster-node-timeout 5000 //集群中主机通信超时时间
  8. :wq
  9. ]# systemctl start redis 启动服务
  10. ]# netstat -utnlp | grep redis-serve 查看端口        
  11. tcp 0 0 192.168.88.51:6379 0.0.0.0:* LISTEN 21201/redis-serve
  12. tcp 0 0 192.168.88.51:16379 0.0.0.0:* LISTEN 21201/redis-serve

步骤二:创建集群

说明:

1、在任意一台redis服务器上都可以执行创建集群的命令。

2、--cluster-replicas 1 给每个master服务器分配1台slave服务器,每个主至少要分配1台slave服务器,不然无法实现redis服务的高可用。

3、创建集群时,会自动创建主从角色,默认把主机列表中的前3台服务器创建为

Master角色的redis服务器,剩下的均配置为slave角色服务器。

4、创建集群时,会自动给master角色的主机分配hash槽 ,通过hash槽实现数据的分布式存储。


  1. ]# redis-cli --cluster create 192.168.88.51:6379 192.168.88.52:6379 192.168.88.53:6379 192.168.88.54:6379 192.168.88.55:6379 192.168.88.56:6379 --cluster-replicas 1         
  2.   #下面是集群的创建与信息展示
  3. >>> Creating cluster
  4. >>> Performing hash slots allocation on 6 nodes...
  5. Using 3 masters:
  6. 192.168.88.51:6379
  7. 192.168.88.52:6379
  8. 192.168.88.53:6379
  9. Adding replica 192.168.88.55:6379 to 192.168.88.51:6379
  10. Adding replica 192.168.88.56:6379 to 192.168.88.52:6379
  11. Adding replica 192.168.88.54:6379 to 192.168.88.53:6379
  12. M: 0eb3b7aa0493a19189cba35b0c658202cc20884b 192.168.88.51:6379
  13. slots:0-5460 (5461 slots) master
  14. M: a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441 192.168.88.52:6379
  15. slots:5461-10922 (5462 slots) master
  16. M: f2c1bdb78d8d224c3666fa6440bdf80ba563c581 192.168.88.53:6379
  17. slots:10923-16383 (5461 slots) master
  18. S: bdba77868965371680fa825badff59bf8ef95a81 192.168.88.54:6379
  19. replicates f2c1bdb78d8d224c3666fa6440bdf80ba563c581
  20. S: 11510f42bfd9cf667bab5f31c01476d94984200a 192.168.88.55:6379
  21. replicates 0eb3b7aa0493a19189cba35b0c658202cc20884b
  22. S: fe572ce003ee634c52adc4b42d92d15f847937d7 192.168.88.56:6379
  23. replicates a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441
  24. Can I set the above configuration? (type 'yes' to accept): yes 同意
  25. ....
  26. ....
  27. [OK] All nodes agree about slots configuration.
  28. >>> Check for open slots...
  29. >>> Check slots coverage...
  30. [OK] All 16384 slots covered. //创建成功的提示

步骤三:查看集群信息

第一列:主服务器ip地址

第二列:主服务器ID

第三列:存储变量个数

第四列:hash槽个数 (hash槽的作用在集群存储工程过程里讲)

第五列:从服务器数量

]# redis-cli --cluster  info  192.168.88.51:6379
192.168.88.53:6379 (f2c1bdb7...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.51:6379 (0eb3b7aa...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.52:6379 (a9cb8ccd...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

三.测试集群

问题

  1. 命令行连接
  2. 搭建网站服务器
  3. 网站连接redis集群

实现此案例需要按照如下步骤进行。

步骤一:命令行连接

  1. [root@host51 ~]# redis-cli -c -h 192.168.88.51 -p 6379
    192.168.88.51:6379> set school tarena
    -> Redirected to slot [8455] located at 192.168.88.52:6379
    OK
    192.168.88.52:6379> set teacher plj
    -> Redirected to slot [12541] located at 192.168.88.53:6379
    OK
    192.168.88.53:6379> set class NSD
    -> Redirected to slot [741] located at 192.168.88.51:6379
    OK
    192.168.88.51:6379>

              不难发现3个变量,被分别存储到集群中的3台master服务器上,实现了数据的分布式存储。

当连接集群中的任意一台redis服务器存储数据时,会调用集群CRC16算法 得出此次

存储变量使用的hash 槽,然后连接hash 槽 所在的master服务器存储变量。

        在创建集群时会把默认的16384个槽平均的分配给集群中的3个master服务器。可以通过查看集群信息查看每个master服务器占用hash槽的个数。

 
 
  1. ]# redis-cli --cluster info 192.168.88.51:6379
    192.168.88.53:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 1 slaves.
    192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves.
    192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves.
    [OK] 0 keys in 3 masters.
    0.00 keys per slot on average.

测试数据自动备份

集群中slave角色的主机会自动同步master角色主机的数据,实现数据的自动备份,

分别连接集群中的3台slave服务器查看变量

#分别在不同redis机器上,登录redis查看相关效果。
  1. [root@host54 ~]# redis-cli -c -h 192.168.88.54 -p 6379
    192.168.88.54:6379> keys *
    1) "class"
    [root@host55 ~]# redis-cli -c -h 192.168.88.55 -p 6379
    192.168.88.55:6379> keys *
    1) "school"
    [root@host56 ~]# redis-cli -c -h 192.168.88.56 -p 6379
    192.168.88.56:6379> keys *
    1) "teacher"

测试服务高可用

当master角色的服务器宕机时,对应的slave服务器会升级为master 并接手对应的hash槽,实现redis服务的高可用,例如停止host53主机的redis服务,对应的从会升级为master 。(当宕机的master恢复后 自动做当前主的从服务器) 。

#看下备份机器,master结点宕机时,能不能顶上。 

   测试方法:停止redis服务

  1. [root@host53 ~]# systemctl stop redis

查看集群信息

  1. [root@host51 ~]#]# redis-cli --cluster info 192.168.88.51:6379
    192.168.88.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 0 slaves.
    192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves.
    192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves.
    [OK] 0 keys in 3 masters.
    keys per slot on average.

启动redis服务

  1. [root@host53 ~]# systemctl start redis

查看集群信息

  1. [root@host51 ~]#]# redis-cli --cluster info 192.168.88.51:6379
    192.168.88.54:6379 (f2c1bdb7...) -> 1 keys | 5461 slots | 1 slaves.
    192.168.88.51:6379 (0eb3b7aa...) -> 1 keys | 5461 slots | 1 slaves.
    192.168.88.52:6379 (a9cb8ccd...) -> 1 keys | 5462 slots | 1 slaves.
    [OK] 0 keys in 3 masters.
    keys per slot on average.

步骤二:搭建网站服务器

准备1台新虚拟机,要求如表-3所示。

表-3

1)在Nginx57主机,安装nginx软件并配置nginx服务

#下面展示的是源码安装,你们可以yum -install 安装服务。

  1. 安装nginx
  2. yum -y install nginx
  3. 安装依赖
  4. ]#yum -y install gcc pcre-devel zlib-devel make
  5. 解压源码
  6. ]# cd /root
  7. ]# tar -xf nginx-1.22.1.tar.gz
  8. 进源码目录
  9. ]#cd nginx-1.22.1
  10. 配置
  11. ]#./configure
  12. 编译 并 安装
  13. ]#make && make install
  14. 查看安装目录
  15. ]# ls /usr/local/nginx/
  16. conf html logs sbin
  17. 启动服务
  18. ]# /usr/local/nginx/sbin/nginx   
  19. #没有配置相应的spec文件,所以不能systemctl 命令启动相关服务。
  20. 查看端口 #有http服务的虚拟机可以停止httpd服务请求,再启动nginx查看80端口状态。
  21. ]# netstat -utnlp | grep 80
  22. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10469/nginx: master

2)配置php-fpm服务

  1. ]#yum -y install php php-fpm php-devel 安装php相关软件
  2. 修改php-fpm服务配置文件
    ]# vim /etc/php-fpm.d/www.conf
    38 ;listen = /run/php-fpm/www.sock
    39 listen = 127.0.0.1:9000 非sock方式运行
    :wq
  3. 启动服务
  4. ]# systemctl start php-fpm
  5. 查看端口
  6. ]# netstat -utnlp | grep 9000
  7. tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 10477/php-fpm: mast

3)配置动静分离

  1. ]# vim +65 /usr/local/nginx/conf/nginx.conf
    location ~ \.php$ {
    root html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    include fastcgi.conf;
    }
    :wq
    ]# /usr/local/nginx/sbin/nginx -t      //测试修改

  2. ]# /usr/local/nginx/sbin/nginx -s reload //重启服务

4)加载redis模块

从真机拷贝软件到虚拟机里

#真机没有就去官网下载。
这里没演示scp方式,是因为它传文件有时候会出现断点,并且不能断点续传,影响文件的传输效率和完整性。

]# rsync /linux-soft/s3/redis-cluster-4.3.0.tgz root@192.168.88.57:/root/

安装软件

  1. 解压源码
  2. ]# tar -xf redis-cluster-4.3.0.tgz
  3. 进源码目录
  4. ]# cd redis-4.3.0/
  5. 获取php版本信息
  6. ]# phpize
  7. Configuring for:
  8. PHP Api Version: 20170718
  9. Zend Module Api No: 20170718
  10. Zend Extension Api No: 320170718
  11. 配置 (--with-php-config=/usr/bin/php-config php配置信息文件)
  12. [root@redis64 redis-4.3.0]# ./configure --with-php-config=/usr/bin/php-config

编译并安装

  1. ]# make && make install
  2. ……………
  3. Installing shared extensions: /usr/lib64/php/modules/ 提示模块安装的位置

查看模块文件

  1. ]# ls /usr/lib64/php/modules/redis.so
  2. /usr/lib64/php/modules/redis.so

编辑php.ini文件

  1. ]# vim /etc/php.ini
    737 extension_dir = "/usr/lib64/php/modules/" 指定模块所在目录
    739 extension = "redis.so" 指定模块名
  2. :wq

重启php-fpm服务

  1. ]# systemctl restart php-fpm

查看模块

  1. ]# php -m | grep redis
  2. redis

步骤三:网站连接redis集群

1)编写存储数据脚本

  1. [root@nginx57 ~]#
    vim /usr/local/nginx/html/set.php
    <?php
    $redis_list = ['192.168.88.51:6379','192.168.88.52:6379','192.168.88.53:6379','192.168.88.54:6379','192.168.88.55:6379','192.168.88.56:6379'];
    $client = new RedisCluster(NUll,$redis_list);
    $client->set("i","tarenaA ");
    $client->set("j","tarenaB ");
    $client->set("k","tarenaC ");
    echo "save ok\n";
    ?>
    :wq

2)编写查看数据脚本

  1. [root@nginx57 ~]#
    vim /usr/local/nginx/html/get.php
    <?php
    $redis_list = ['192.168.88.51:6379','192.168.88.52:6379','192.168.88.53:6379','192.168.88.54:6379','192.168.88.55:6379','192.168.88.56:6379']; //定义redis服务器列表
    $client = new RedisCluster(NUll,$redis_list); //定义连接redis服务命令
    echo $client->get("i"); //获取变量i 的数据
    echo $client->get("j"); //获取变量j 的数据
    echo $client->get("k"); //获取变量k 的数据
    ?>
    :wq

3)访问脚本 #测试网页情况

  1. 访问存储数据脚本
  2. ]# curl http://192.168.88.57/get.php
  3. Save ok
  4. 访问查询数据脚本
  5. ]# curl http://192.168.88.57/get.php
  6. tarenaA tarenaB tarenaC

4)命令行连接redis集群主机查看数据

#   3 台 机器分别查看。

  1. [root@host51 ~]# redis-cli -c -h 192.168.88.51 -p 6379
  2. 192.168.88.51:6379> keys *
  3. 1) "j"
  4. [root@host52 ~]# redis-cli -c -h 192.168.88.52 -p 6379
  5. 192.168.88.52:6379> keys *
  6. 1) "k"
  7. [root@host54 ~]# redis-cli -c -h 192.168.88.54 -p 6379
  8. 192.168.88.54:6379> keys *
  9. 1) "i"

DBA Day09

上节课,我们讲了redis中间件的基本集群搭建,这节课将redis的主从复制、哨兵服务的配置与数据的持久化。

        持久化的知识中,涉及到数据类型的各类数据类型命令的使用。^_^

环境准备:

一、主从复制

#通俗来说就是就是一个master主节点,带着几个slave节点,master结点自身也有候选人,以备不时之需

相关命令

步骤一:配置一主一从结构

[root@host61 ~]# vim /etc/redis.conf
69 bind 192.168.88.61  设置服务使用的Ip地址
92 port 6379  使用默认端口即可
:wq
[root@host61 ~]# systemctl  restart redis 重启服务

连接服务

[root@host61 ~]# redis-cli  -h 192.168.88.61 -p 6379
查看角色

192.168.88.61:6379> info replication  
# Replication
role:master  默认就是主服务器
connected_slaves:0  没有从服务器
master_replid:0aebff37df915061ddf157cc33d8742f14e8773f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
192.168.88.61:6379>
2)配置salve服务器

修改配置文件
[root@host62 ~]# vim /etc/redis.conf   
69 bind 192.162.88.62 设置服务的ip地址
92 port 6379 设置服务的端口号 (默认即可)
:wq
重启服务
[root@host62 ~]# systemctl  restart redis  
连接服务
[root@host62 ~]# redis-cli  -h 192.162.88.62 -p 6379 
指定主服务器ip地址 和 端口号
192.162.88.62.:6379> replicaof 192.162.88.61 6379  
永久保存配置
192.162.88.62.:6379> config rewrite  
OK
退出服务
192.162.88.62.:6379> exit 
查看文件末尾
[root@host62 ~]# tail -1 /etc/redis.conf  
replicaof 192.162.88.61 6379
连接服务
[root@host62 ~]# redis-cli  -h 192.162.88.62 -p 6379  
查看角色
192.162.88.62.:6379> info replication  #查看从节点服务器情况
# Replication
role:slave  从服务器
master_host:192.162.88.61  主服务器ip地址 
master_port:6379  主服务器端口号
master_link_status:up  与主服务器连接状态 (up 正常  down 连接失败)
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
192.162.88.62.:6379>

3)在主服务器host61查看角色

连接服务
[root@host61 ~]# redis-cli  -h 192.168.88.61 -p 6379
查看角色
192.168.88.61:6379> info replication 
# Replication
role:master  主服务器
connected_slaves:1  一个从服务器
slave0:ip=192.168.88.62,port=6379,state=online,offset=322,lag=0 从服务器IP地址
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:322
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:322
存储数据
192.168.88.61:6379> mset  x 1   y 2    z 3 
OK
查看变量
192.168.88.61:6379> keys *  
1) "z"
2) "y"
3) "x"

4)在从服务器查看是否同步数据

[root@host62 ~]# redis-cli  -h 192.168.88.62 -p 6379
192.168.88.62.:6379> keys *
1) "y"
2) "x"
3) "z"
192.168.88.62.:6379>

步骤二:配置一主多从结构

要求:把host63也配置为host61的从服务器

1)在host63主机做如下配置:

 [root@host63 ~]# vim /etc/redis.conf   修改配置文件
69 bind 192.168.88.63
92 port 6379
:wq
[root@host63 ~]# systemctl  restart redis  启动服务
[root@host63 ~]# redis-cli  -h 192.168.88.63 -p 6379 连接服务
192.168.88.63:6379> replicaof 192.168.88.61 6379 指定主服务器ip地址和端口号
OK
192.168.88.63:6379> config rewrite  保存到了redis.conf文件末尾
OK
192.168.88.63:6379> exit 断开连接
[root@host63 ~]# tail -1 /etc/redis.conf   查看文件最后1行
replicaof 192.168.88.61 6379
[root@host63 ~]# redis-cli  -h 192.168.88.63 -p 6379  连接服务
192.168.88.63:6379> info replication  查看复制信息
# Replication
role:slave 角色
master_host:192.168.88.61 主服务器IP
master_port:6379  主服务器端口
master_link_status:up 与主服务器连接状态 up 正常连接状态 
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:1171
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1171
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1158
repl_backlog_histlen:14
192.168.88.63:6379> keys *  查看是否同步数据
1) "x"
2) "z"
3) "y"
192.168.88.63:6379>

在host61 查看到有2台从服务器

[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379
192.168.88.61:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.88.62,port=6379,state=online,offset=3027,lag=0
slave1:ip=192.168.88.63,port=6379,state=online,offset=3013,lag=1
master_replid:209b3b7ce20c708ab1b6b95a5d1becb2454b0941
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3027
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3027
192.168.88.61:6379>

步骤三:配置主从从结构

#通俗来说,就是61设置为主节点,62是61的子节点,63是62的子节点。

要求: 把host63恢复为独立的redis服务器,然后配置为host62的从服务器

1)配置host63

[root@host63 ~]# redis-cli  -h 192.168.88.63 -p 6379 连接服务
192.168.88.63:6379> replicaof no one  恢复为独立的数据库服务器
OK
192.168.88.63:6379> replicaof 192.168.88.62 6379  指定主服务器为62
OK
192.168.88.63:6379> config rewrite  保存配置
OK
192.168.88.63:6379> exit 断开连接
[root@host63 ~]# tail -1 /etc/redis.conf  查看是否保存
replicaof 192.168.88.62 6379
[root@host63 ~]# redis-cli  -h 192.168.88.63 -p 6379  连接服务
192.168.88.63:6379> info replication  查看复制信息
# Replication
role:slave 角色
master_host:192.168.88.62 主服务器IP
master_port:6379 主服务端口
master_link_status:up 与主服务器连接状态
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:4545
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4545
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:4420
repl_backlog_histlen:126
192.168.88.63:6379> 

2)在host62查看角色

[root@host62 ~]# redis-cli  -h 192.168.88.62 -p 6379  连接服务
192.168.88.62.:6379> info replication  查看复制信息
# Replication
role:slave       本身是从服务器
master_host:192.168.88.61 主服务器ip
master_port:6379 主服务器redis服务端口
master_link_status:up 与主服务器连接状态
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:4769
slave_priority:100
slave_read_only:1
connected_slaves:1  本身有一个从服务器
slave0:ip=192.168.88.63,port=6379,state=online,offset=4769,lag=0 从服务器信息
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4769
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:4769
192.168.88.68.:6379> 

案例2:配置带验证的主从复制

#给主机设置连接密码,不然任何用户登录从节点,都可以访问主节点相关信息内容。反过来说,也是为了方式,主节点权限备别人利用,破幻数据的安全性完整性

基于案例1做如下配置:

  • 配置主机host61,redis服务连接密码为123456
  • 主机host62设置连接host61的redis服务密码

方案

给host61主机的Redis服务设置连接密码,如果从服务器不指定连接密码无法同步数据。

步骤

实现此案例需要按照如下步骤进行。

步骤一:配置主机host61,redis服务密码为123456

连接服务
[root@host61 ~]# redis-cli  -h 192.168.88.61 -p 6379
查看密码,默认redis服务没有密码
192.168.88.61:6379> config get requirepass  
1) "requirepass"
2) ""
设置密码
192.168.88.61:6379> config set requirepass 123456  
OK
输入密码
192.168.88.61:6379> auth 123456  
OK
保存配置
192.168.88.61:6379> config rewrite 
OK
退出
192.168.88.61:6379> exit  
保存到文件的末尾
[root@host61 ~]# tail -1 /etc/redis.conf   
requirepass "123456"
连接服务
[root@host61 ~]# redis-cli  -h 192.168.88.61 -p 6379  -a  123456
查看复制信息
192.168.88.61:6379> info replication 
# Replication
role:master
connected_slaves:0   没有从服务器了 (因为从没有输入连接密码连接不上主服务器)
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5763
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5763
192.168.88.61:6379>

步骤二:配置主机host62

连接服务
[root@host62 ~]# redis-cli  -h 192.168.88.62 -p 6379
查看复制信息
192.168.88.62.:6379> info replication 
# Replication
role:slave
master_host:192.168.88.61
master_port:6379
master_link_status:down  没设置密码 与master主机是断开状态
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:274
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:7803
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:7803
192.168.88.62:6379> config set masterauth 123456  指定主服务器密码
OK
192.168.88.62:6379> config rewrite 保存配置
OK
192.168.88.62:6379> info replication 查看复制信息
# Replication
role:slave
master_host:192.168.88.61
master_port:6379
master_link_status:up  设置连接密码后  状态为up 
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:5847
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5847
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:5764
repl_backlog_histlen:84
192.168.88.62.:6379>

#配置好连接密码后,是知道连接密码的内部人员,就都可以访问了。

二、哨兵服务与持久化

环境准备:

#操作都是类似的操作,只是在redis服务器中间,增加了一个哨兵服务,来监控、规范、放行、禁止服务器中类似相关权限的使用。

        #熟练主从配置的小伙伴,可以直接看步骤三的 哨兵服务配置。

 问题

  1. 配置主机Host67为master服务器
  2. 配置主机host68为 slave服务器
  3. 配置主机host69运行哨兵服务
  4. 测试配置

3台机器都安装redis服务(host69 主机运行哨兵服务 不存储数据 不需要启动redis服务)

说明:

1)可以使用一主一从 或 一主多从 或 主从从 + 哨兵服务 做服务的高可用数据自动备份

2)如果主从结构中的redis服务设置连接密码的话必须全每台数据库都要设置密码且密码要一样,要么全都不设置密码。

步骤一:配置主机Host67为master服务器

1)配置host67为主服务器

  1. [root@host67 ~]# vim /etc/redis.conf 修改配置文件
    69 bind 192.168.88.67 设置redis服务使用IP地址
    92 port 6379 设置redis服务使用端口
    :wq
    [root@host67 ~]# systemctl start redis 启动服务
    [root@host67 ~]# redis-cli -h 192.168.88.67 -p 6379 连接服务
    192.168.88.67:6379> info replication 查看角色
    # Replication
    role:master 默认是master角色
    connected_slaves:0 没有从服务器
    master_replid:0aebff37df915061ddf157cc33d8742f14e8773f
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    192.168.88.67:6379>

步骤二:配置slave服务器host68

[root@host68 ~]# vim /etc/redis.conf   修改配置文件
69 bind 192.168.88.68 设置服务使用Ip地址
92 port 6379 设置服务监听端口 默认即可
:wq
[root@host68 ~]# systemctl  start redis  启动服务
[root@host68 ~]# redis-cli  -h 192.168.88.68 -p 6379 连接服务
192.168.88.68:6379> replicaof 192.168.88.67 6379 指定主服务器ip和端口
OK
192.168.88.68:6379> config rewrite  永久保存配置
OK
192.168.88.68:6379> exit 断开
[root@host68 ~]# tail -1 /etc/redis.conf   保存到了文件末尾
replicaof 192.168.88.67 6379
[root@host68 ~]# redis-cli  -h 192.168.88.68 -p 6379  连接服务
192.168.88.68:6379> info replication  查看复制信息
# Replication
role:slave  角色 从服务器
master_host:192.168.88.67  主服务器Ip
master_port:6379 主服务端口
master_link_status:up  与主连接状态 
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
192.168.88.68:6379>

步骤三:配置主机host69运行哨兵服务

]# vim /etc/redis-sentinel.conf   创建并编辑主配置文件
15 bind 192.168.88.69  指定哨兵服务使用ip地址
21 port 26379  指定哨兵服务监听端口
26 daemonize yes  服务守护进程方式运行服务
84 sentinel monitor mymaster 192.168.88.67 6379 1   监视master服务器Host67
:wq
[root@host69 ~]# systemctl  start redis-sentinel 启动哨兵服务
[root@host69 ~]# netstat  -utnlp  | grep 26379  查看端口号
tcp    0   0 192.168.88.69:26379     0.0.0.0:*  LISTEN      1651/redis-sentinel 
[root@host69 ~]#

步骤四:测试配置

思路:停止master主机的redis 服务,原slave角色会升级为主,哨兵服务会自动监视新的master服务,宕机的master 主机恢复后自动配置为当前主的从服务器。

停止master主机的redis 服务

  1. [root@host67 ~]# systemctl stop redis

在slave服务器查看角色

[root@host68 ~]# redis-cli  -h 192.168.88.68 -p 6379
192.168.88.68:6379> info replication
# Replication
role:master 角色升级为主
connected_slaves:0  没从服务器
master_replid:e4d9399cdf19c724b032859e77316019735d391e
master_replid2:bd1b8d193de170bedd8b40780ee3fb45f9590a5b
master_repl_offset:35343
second_repl_offset:32642
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:183
repl_backlog_histlen:35161
192.168.88.68:6379>

宕机的master 主机恢复后自动配置为当前主的从服务器。

[root@host67 ~]# systemctl  start redis  启动服务
[root@host67 ~]# redis-cli  -h 192.168.88.67 -p 6379 连接服务
192.168.88.67:6379> info replication    查看角色
# Replication
role:slave  从服务器
master_host:192.168.88.68  主服务器ip
master_port:6379 主服务器端口
master_link_status:up  连通状态
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:54542
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e4d9399cdf19c724b032859e77316019735d391e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:54542
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:54379
repl_backlog_histlen:164
192.168.88.67:6379>

案例:使用RDB文件恢复数据

环境准备:

#安装好 redis服务

 问题

  1. 设置存盘间隔为120秒且10个key改变数据自动存盘
  2. 使用RDB文件恢复数据

步骤一:设置存盘间隔为120秒且10个key改变自动存盘

查看默认存盘频率

[root@redis70 ~]# vim /etc/redis.conf      
save  秒   变量个数
save 900   1
save 300   10
save 60    10000
停止按默认配置运行的服务

[root@redis70 ~]# systemctl stop redis
修改存盘频率

[root@redis70 ~]# vim  +219 /etc/redis.conf      
save 900 1
#save 300 10
save 120 10     # 2分钟内且有>=10个变量改变 
save 60 10000
:wq
清空数据库目录

[root@redis70 ~]# rm -rf /var/lib/redis/*    
启动服务( 按新的存盘频率运行)

[root@redis70 ~]# systemctl start redis  
    
没有达到存盘频率前 数据库目录下没有dump.rdb文件

[root@redis70 ~]# ls /var/lib/redis/dump.rdb
ls: 无法访问/var/lib/redis/6379/dump.rdb: 
[root@redis70 ~]# 
在服务启动后,要在2分钟内存储大于等10个变量

连接服务
[root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379    
存储变量
192.168.88.70:6379> mset a 1  b 2  c 3  d 4 
OK
存储变量
192.168.88.70:6379> mset   x 1 y 2  z 3 k 6  i 7  z 9   f 22  zz 99  cc  66
192.168.88.70:6379> exit  断开连接
满足存盘频率后 创建dump.rdb文件并存储数据

[root@redis70 ~]# ls /var/lib/redis/
dump.rdb
[root@redis70 ~]# ls /var/lib/redis/ -l   显示文件创建的时间
总用量 4
-rw-r--r-- 1 redis redis 159 10月 26 16:30 dump.rdb
[root@redis70 ~]#

步骤二:使用RDB文件恢复数据

1)拷贝 dump.rdb 文件就是对数据的备份

[root@redis70 ~]# cp /var/lib/redis/dump.rdb  /opt/
[root@redis70 ~]# ls /opt/*.rdb
/opt/dump.rdb
[root@redis70 ~]# 
2)把备份的 dump.rdb 文件 再次拷贝回数据库目录就是恢复

#清空内存
192.168.88.70:6379> FLUSHALL 
OK

3)使用备份的dump.rdb文件恢复

第1步 停止内存没有数据的redis服务

第2步 使用有数据的dump.rdb文件覆盖没有数据dump.rdb文件

第3步 修改文件的所有者和所属组用户为redis

第4步 启动redis服务 并连接服务查看数据

[root@redis70 ~]# systemctl stop redis
[root@redis70 ~]# cp /opt/dump.rdb  /var/lib/redis/
[root@redis70 ~]# chown –R redis:redis  /var/lib/redis
[root@redis70 ~]# systemctl start redis
Starting Redis server...
[root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379
192.168.88.70:6379> keys *
 1) "i"
 2) "d"
 3) "x"
  ……
……

案例:AOF  持久化配置

问题

  1. 启用AOF
  2. 使用AOF文件恢复数据

步骤一:启用AOF

[root@redis70 ~]# redis-cli  -h 192.168.88.70 -p 6379  连接服务
192.168.88.70:6379> config set  appendonly yes    启用aof文件
OK
192.168.88.70:6379> config get  appendonly  查看是否启用
1) "appendonly"
2) "yes"
192.168.88.70:6379> config rewrite  保存配置
OK
192.168.88.70:6379> exit 断开连接
数据库目录多了appendonly.aof文件
[root@redis70 ~]# ls /var/lib/redis/    
appendonly.aof dump.rdb
[root@redis70 ~]#wc –l  /var/lib/redis/appendonly.aof  查看文件行数
[root@redis70 ~]# redis-cli  -h 192.168.88.70 -p 6379  连接服务
192.168.88.70:6379> set x 1  存储变量x
OK
192.168.88.70:6379> set y 2  存储变量y
OK
192.168.88.70:6379> set z 3  存储变量z
OK
192.168.88.70:6379>keys *    查看变量
1) "x"
2) "z"
3) "y"
192.168.88.70:6379> exit 断开连接
[root@redis70 ~]#wc –l  /var/lib/redis/ appendonly.aof  再次查看文件行数

步骤二:使用AOF文件恢复数据

1)备份aof文件


[root@redis70 ~]# cp /var/lib/redis/appendonly.aof /opt/ 拷贝到/opt目录
[root@redis70 ~]# ls /opt/
appendonly.aof
[root@redis70 ~]#
2)删除数据


    [root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379 连接服务
192.168.88.70:6379> flushall 清空内存
192.168.88.70:6379> exit 断开连接
3)恢复数据


第1步: 把没有数据的服务停止
[root@redis70 ~]# systemctl stop redis

第2步:覆盖aof文件
[root@redis70 ~]# cp /opt/appendonly.aof /var/lib/redis/
                    
第3步:启动redis服务并查看数据
[root@redis70 ~]# systemctl start redis

第4步:连接服务
[root@redis70 ~]# redis-cli -h 192.168.88.70 -p 6379

第五步骤:查看数据
192.168.88.70:6379> keys *
1) "v4"
2) "v3"
。。。。。。
。。。。。。

三、数据类型

#作为云计算运维方向的IT人员,需要我们掌握数据类型的使用。

#知道大概用法即可,心有余力者,可花时间研究研究。只知道个大概,也可以通过AI来提示自己如何使用相关数据类型命令的使用,只不过要有大体印象,才能合理利用AI协助自己。


练习命令的使用,具体命令如下:

  • set  getrange   strlen   append
  • decr   decrby  incr   incrby    incrbyfloat
存储变量时 设置变量的有效期 px(毫秒) ex (秒)

192.168.88.70:6379> set name plj ex 10   //变量10秒过期
OK
192.168.88.70:6379>
192.168.88.70:6379> type name  //查看类型
string
192.168.88.70:6379>
192.168.88.70:6379> set class  nsd  px 10   //变量10毫秒过期
OK
192.168.88.70:6379>
NX 不覆盖赋值
192.168.88.70:6379> set name plj NX
OK
192.168.88.70:6379> get name
"plj"
XX 覆盖赋值
192.168.88.70:6379> set name yaya XX
OK
192.168.88.70:6379> get name
"yaya"
192.168.88.70:6379>
set 命令完整格式演示

 192.168.88.70:6379> set gender girl  ex 20  NX
OK
192.168.88.70:6379>

set 命令完整格式演示

 192.168.88.70:6379> set gender girl  ex 20  NX
OK
192.168.88.70:6379>
- 递增数字:字符串类型可以存储任何形式的字符串,当存储的字符串是整数形式时,

Redis 提供了一个实用的命令 INCR,其作用是让当前键值递增,并返回递增后的值。

# 当要操作的键不存在时会默认键值为0,所以第一次递增后的结果是1。

192.168.88.70:6379> set  num 1  //创建变量
192.168.88.70:6379> INCR num    //+1
(integer) 2
192.168.88.70:6379> INCR num    //+1
(integer) 3
192.168.88.70:6379> GET num     
"3"
- 增加指定的整数

192.168.88.70:6379> INCRBY num 2   //+2
(integer) 5
192.168.88.70:6379> INCRBY num 3   //+3
(integer) 8
- 递减数字
192.168.88.70:6379> DECR num     //-1
(integer) 7
192.168.88.70:6379> DECRBY num 3   //
(integer) 4
- 向尾部追加值

192.168.88.70:6379> set hi  Hello   //创建变量hi
OK
192.168.88.70:6379> append  hi " World"   # 因为字符串包含空格,需要使用引号
(integer) 11        # 返回值为hi的总长度
192.168.88.70:6379> get hi
"Hello World"
- 获取字符串长度

192.168.88.70:6379> strlen  hi
(integer) 11
- 中文字符返回字节数
192.168.88.70:6379> set name 张三
OK
192.168.88.70:6379> strlen name
(integer) 6   # UTF-8编码的中文,由于“张”和“三”两个字的UTF-8编码的长度都是3,所以此例中会返回6。
获取变量部分数据

192.168.88.70:6379> set zfc  ABCEF   //创建变量
OK
192.168.88.70:6379> get zfc  //输出变量值
"ABCEF"
192.168.88.70:6379> getrange zfc 0 1  //输出第1个到第2个字符
"AB"
192.168.88.70:6379> getrange zfc 2 4  //输出第3个到第5个字符
"CEF"
192.168.88.70:6379> getrange zfc -2 -1 //输出倒数第2个到第1个字符
"EF"
192.168.88.70:6379>

案例:列表类型

lpush llen lrange lpop
rpush lindex lset rpop linsert
方案
在redis70主机做练习。


步骤一:命令操作如下所示:

LPUSH命令用来向列表左边增加元素,返回值表示增加元素后列表的长度


//创建变量
192.168.88.70:6379> lpush letter A B C
(integer) 3
192.168.88.70:6379> type letter 查看类型
list
192.168.88.70:6379>
//头部追加元素
192.168.88.70:6379> lpush letter d e
(integer) 5
取出列表所有元素


# 起始下标为0,结束下标为-1
192.168.88.70:6379> lrange letter 0 -1
1) "e"
2) "d"
3) "C"
4) "B"
5) "A"
统计元素个数


192.168.88.70:6379> llen letter
(integer) 5
通过下标输出单个元素 第1个元素下标用0表示 第2个元素下标用1表示

最后一个元素下标用-1表示


192.168.88.70:6379> lindex letter 0
"e"
192.168.88.70:6379> lindex letter 2
"C"
192.168.88.70:6379>
192.168.88.70:6379> lindex letter -1 //最后1个
"A"
192.168.88.70:6379> lindex letter -2 //倒数第2个
"B"
192.168.88.70:6379>
lset修改元素


192.168.88.70:6379> lrange letter 0 -1 修改前查看
1) "e"
2) "d"
3) "C"
4) "B"
5) "A"
192.168.88.70:6379> lset letter 0 E 修改第1元素
OK
192.168.88.70:6379> lset letter -1 a 修改最后1个元素
OK
192.168.88.70:6379> lrange letter 0 -1 修改后查看
1) "E"
2) "d"
3) "C"
4) "B"
5) "a"
192.168.88.70:6379>
弹出元素(删除元素)


192.168.88.70:6379> lrange letter 0 -1 修改前查看
1) "E"
2) "d"
3) "C"
4) "B"
5) "a"
192.168.88.70:6379> lpop letter 弹出头部元素
"E"
192.168.88.70:6379> rpop letter 弹出尾部元素
"a"
192.168.88.70:6379> lrange letter 0 -1 修改后查看
1) "d"
2) "C"
3) "B"
192.168.88.70:6379>
尾部追加元素


192.168.88.70:6379> rpush letter e f 尾部追加元素
(integer) 5
192.168.88.70:6379> lrange letter 0 -1 追加后查看
1) "d"
2) "C"
3) "B"
4) "e"
5) "f"
192.168.88.70:6379>
插入元素


192.168.88.70:6379> lrange letter 0 -1 插入前查看
1) "d"
2) "C"
3) "B"
4) "e"
5) "f"
192.168.88.70:6379>
192.168.88.70:6379> linsert letter before C C2 值C前插入C2
(integer) 6
192.168.88.70:6379> lrange letter 0 -1 插入后查看
1) "d"
2) "C2"
3) "C"
4) "B"
5) "e"
6) "f"
192.168.88.70:6379>
192.168.88.70:6379> linsert letter after C C3 值C后插入C3
(integer) 7
192.168.88.70:6379> lrange letter 0 -1 插入后查看
1) "d"
2) "C2"
3) "C"
4) "C3"
5) "B"
6) "e"
7) "f"
192.168.88.70:6379>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【入门教程】基于深度学习的遥感图像分割流程(附代码)

本文为入门遥感图像分割的朋友提供一份详细教程&#xff0c;看完你将收获&#xff1a; 大致了解图像分割的基本流程能够独立完成从拿到数据集到完成分割结果并评估的任务 有任何问题欢迎关注or私信&#xff0c;看到即回复&#xff0c;文末附代码链接。 文章目录 0.引言1.数据…

农事管理系统

摘 要 使用旧方法对农事管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在农事管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的农事管理系…

2-83 基于matlab的自适应正则化核的模糊均值聚类框架(ARKFCM)

基于matlab的自适应正则化核的模糊均值聚类框架(ARKFCM)&#xff0c;用于脑磁共振图像的分割。该框架采用三种算法&#xff0c;分别平均滤波器、中值滤波器和设计的加权图像的灰度来代替局部平均灰度。利用邻域中灰度的异质性获取局部信息&#xff0c;并用高斯径向基核函数替换…

【#第三期实战营闯关作业 ## MindSearch在 Hugging FaceSpace的部署】

把MindSearch 部署到Github Codespace后&#xff0c;下一步就是上传到 Hugging Face Space&#xff0c;以下是记录了实操的过程及截图&#xff1a; 打开 https://huggingface.co/spaces &#xff0c;并点击 Create new Space&#xff0c;如下图所示:在输入 Space name 并选择 …

数据仓库系列18:如何建立一个有效的元数据管理体系?

目录 什么是元数据?为什么它如此重要?元数据管理体系的核心组件如何设计元数据模型步骤1: 识别关键元数据类型步骤2: 定义元数据属性步骤3: 建立元数据之间的关系步骤4: 选择合适的建模方法示例: 使用关系模型设计元数据模型最佳实践 元数据采集策略1. 识别元数据来源2. 自动…

正则表达式pattern

String qq "1234567890" qq.matches("[1-9]\\d{5,19}") [1-9]第一位不等于零 \\d都是数字 {5,19}后面的5到19位。 正则表达式的作用 作用1&#xff1a;校验字符串是否满足规则 作用2&#xff1a;在一段文本中查找满足要求的内容 sout("\"…

Cesium 地球云图

Cesium 地球云图 使用自定义图原(Primitive)实现。 支持速度和透明的动态调整。 支持设置云图高度, 当相机高度小于云图高度时, 渐隐消失。 Cesium 地球云图

Qt-初始Qt

1. Qt背景介绍 1.1 什么是Qt Qt是⼀个跨平台的C图形⽤⼾界⾯应⽤程序框架。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt为开发者提供了⼀种基于组件的开发模式&#xff0c;开发者可以通过简单的拖拽和组合来实现…

003.精读《MapReduce: Simplified Data Processing on Large Clusters》

文章目录 1. 引言&#xff1a;2. 精读2.1 背景2.2 模型应用2.3 基本原理2.4 其他 3. 总结 1. 引言&#xff1a; 在本期的精读会中&#xff0c;我们将深入探讨一篇具有里程碑意义的论文——《MapReduce: Simplified Data Processing on Large Clusters》。这篇论文不仅奠定了大…

【AI音频处理】:重塑声音世界的无限可能

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言一、语音识别&#xff1a;人机交互的新篇章二、语音合成&#xff1a;让机器“说话”的艺术三、音乐创作与推荐&#xff1a;AI赋予音乐新生命四、声音效果处理&#xff1a;让声音更加完美五、AI在…

浅谈维度建模、数据分析模型,何为数据仓库,与数据库的区别

往期推荐 大数据HBase图文简介-CSDN博客 数仓分层ODS、DWD、DWM、DWS、DIM、DM、ADS-CSDN博客 数仓常见名词解析和名词之间的关系-CSDN博客 数仓架构&#xff1a;离线数仓、实时数仓Lambda和Kappa、湖仓一体数据湖-CSDN博客 0. 前言 1991年&#xff0c;数据仓库之父 比尔恩门 著…

【C++ | 设计模式】代理模式的详解与实现

1. 概念 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;用于控制对对象的访问。它通过引入代理对象&#xff0c;间接地操作目标对象&#xff0c;从而实现对目标对象的控制。代理模式的核心思想是通过代理对象来控制对目标对象的访问。代理对…

坐标系的那些事儿

哈喽&#xff0c;大家好&#xff01;地理坐标系、投影坐标系等知识是地图学、GIS和地图发布、应用等绕不开的话题&#xff0c;今天我们一起聊一聊坐标系的那些事儿&#xff01; 1.地理坐标系 为了确定地面点在地球椭球体表面位置而定义的空间参考系&#xff0c;主要用经纬度来…

软件设计师笔记-多媒体基础知识

媒体 感觉媒体&#xff08;使人产生感觉的媒体&#xff09;表示媒体&#xff08;传输感觉媒体的中介媒体&#xff09;表现媒体&#xff08;进行信息输入和输出的媒体&#xff09;存储媒体&#xff08;用于存储表示媒体的物理介质&#xff09;传输媒体&#xff08;传输表示媒体…

酿酒师的匠心独运:白酒酿造的不同工艺

在华夏大地的深处&#xff0c;一群酿酒师用他们的匠心独运&#xff0c;将大自然的馈赠转化为琼浆玉液&#xff0c;那便是豪迈白酒&#xff08;HOMANLISM&#xff09;。每一滴酒液都承载着酿酒师们的智慧和汗水&#xff0c;每一瓶豪迈白酒&#xff08;HOMANLISM&#xff09;都是…

Disjoint-set data structure--并查集

Disjoint-set data structure 不相交集, 通常称作并查集的一种数据结构。 应用范围&#xff1a;处理不相交集合的合并查询问题&#xff0c;它在处理这两种的时间复杂度在实际应用上往往认为是 O ( 1 ) O(1) O(1),稍后本篇会略加说明。接受两种操作&#xff1a;判断两元素是否…

【进程间通信】管道应用场景---简易进程池

#include<iostream> #include<vector> #include<string> #include<cstring> #include<cstdlib> #include<unistd.h> #include<sys/stat.h> #include<sys/wait.h>//把5个子进程要管理起来&#xff0c;要先描述再组织 const int…

SPI驱动学习二(驱动框架)

目录 一、回顾平台总线设备驱动模型二、SPI设备驱动1. 数据结构1.1 SPI控制器数据结构1.2 SPI设备数据结构1.3 SPI设备驱动 2. SPI驱动框架2.1 SPI控制器驱动程序2.2 SPI设备驱动程序 三、SPI设备树处理过程1. SPI Master2. SPI Device3. 设备树示例4. 设备树实例4.1 使用GPIO模…

leetcode 899. Orderly Queue

原题链接 You are given a string s and an integer k. You can choose one of the first k letters of s and append it at the end of the string. Return the lexicographically smallest string you could have after applying the mentioned step any number of moves. …

Java集合类之Collection

文章目录 1 准备部分1.1 数据结构1.1.1 数组1.1.2 链表 1.2 集合是什么 2 Collection2.1 特点2.2 常用API2.3 遍历Collection的方法2.3.1 toArray方法2.2.2 iterator方法2.3.3 foreach2.3.4 总结 3 List 接口3.1 内容提要3.2 特点3.3 List的API3.3.1 listIterator方法3.3.4 sub…