概述、搭建Redis服务器、部署LNP+Redis、创建Redis集群、连接集群、集群工作原理
Top
NSD DBA DAY09
- 案例1:搭建redis服务器
- 案例2:常用命令限
- 案例3:部署LNP+Redis
- 案例4:创建redis集群
1 案例1:搭建redis服务器
1.1 具体要求如下
- 在主机redis64运行redis服务
- 修改服务运行参数
- ip 地址192.168.88.64
- 服务监听的端口6364
- redis服务的连接密码为 tarenaplj
1.2 方案
准备1台新虚拟机,要求如表-1所示。


1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:在主机redis64运行redis服务
命令操作如下所示:
- [root@redis64 ~]# yum -y install redis 安装软件
- [root@redis64 ~]# systemctl start redis 启动服务
- [root@redis64 ~]# netstat -utnlp | grep redis-server 查看端口
- tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1970/redis-server 1
- [root@redis64 ~]# redis-cli 连接服务
- 127.0.0.1:6379> ping 检查能否正在访问
- PONG
- 127.0.0.1:6379> set school tarena 存储变量
- OK
- 127.0.0.1:6379> get school 查看变量
- "tarena"
- 127.0.0.1:6379> exit 断开连接
- [root@redis64 ~]#
步骤二:修改服务运行参数
命令操作如下所示:
- [root@redis64 ~]# systemctl stop redis
- [root@redis64 ~]# vim /etc/redis.conf
- 69 bind 192.168.88.64
- 92 port 6364
- 647 requirepass tarenaplj
- :wq
- [root@redis64 ~]# setenforce 0
- [root@redis64 ~]# systemctl start redis
- [root@redis64 ~]# netstat -utnlp | grep redis-server
- tcp 0 0 192.168.88.64:6364 0.0.0.0:* LISTEN 2009/redis-server 1
- [root@redis64 ~]#
- [root@redis64 ~]# redis-cli -h 192.168.88.64 -p 6364 连接服务
- 192.168.88.64:6364> ping 不输入密码无法正常访问
- (error) NOAUTH Authentication required.
- 192.168.88.64:6364> auth tarenaplj 输入密码
- OK
- 192.168.88.64:6364> keys * 查看存储的变量
- 1) "school"
- 192.168.88.64:6364> exit 断开连接
- [root@redis64 ~]#
2 案例2:常用命令限
2.1 问题
1)练习如下命令的使用
- mset mget keys type
- exists ttl expire move select
- del flushdb flushall
2.2 方案
在搭建的redis64练习常用命令的使用。
2.3 步骤
实现此案例需要按照如下步骤进行。
命令操作如下所示:
- 192.168.88.64:6364> mset name plj age 80 class nsd2108 一起存储多个变量
- OK
- 192.168.88.64:6364> keys *
- 1) "age"
- 2) "classs"
- 3) "name"
- 4) "school"
- 192.168.88.64:6364> mget name age 一起查看多个变量
- 1) "plj"
- 2) "80"
- keys 使用统配符查看变量
- * 匹配所有变量名
- ? 一个字符
- 192.168.88.64:6364> keys *
- 1) "age"
- 2) "classs"
- 3) "name"
- 4) "school"
- 192.168.88.64:6364> keys ??? 变量名是3个字符
- 1) "age"
- 192.168.88.64:6364> keys a* 变量名是a 开头的
- 1) "age"
- 192.168.88.64:6364>
- 192.168.88.64:6364> keys gender 查看指定变量是否存在
- (empty list or set) 说明变量没有定义
- 192.168.88.64:6364> keys name
- 1) "name"
- 192.168.88.64:6364>
- select 切换库 默认库编号 0-15
- 192.168.88.64:6364> select 1 切换到 1号库里
- OK
- 192.168.88.64:6364[1]> keys * 查看数据没有数据
- (empty list or set)
- 192.168.88.64:6364[1]>
- 192.168.88.64:6364[1]> select 0
- OK
- 192.168.88.64:6364> select 16
- (error) ERR DB index is out of range
- move 命令 移动变量到其他库里
- 192.168.88.64:6364> keys *
- 1) "age"
- 2) "classs"
- 3) "name"
- 4) "school"
- 192.168.88.64:6364> move age 1 把age 变量移动到1 号库里
- (integer) 1
- 192.168.88.64:6364> keys *
- 1) "classs"
- 2) "name"
- 3) "school"
- 192.168.88.64:6364> select 1
- OK
- 192.168.88.64:6364[1]> keys *
- 1) "age"
- exists 检查变量是否存储 返回值1 变量存储 返回值是0 变量不存在
- 192.168.88.64:6364[1]> select 0
- OK
- 192.168.88.64:6364> EXISTS name 检查name变量是否存在
- (integer) 1
- 192.168.88.64:6364> get name
- "plj"
- 192.168.88.64:6364> set name bob
- OK
- 192.168.88.64:6364> get name
- "bob"
- 192.168.88.64:6364>
- EXPIRE 命令设置变量的过期时间 不设置变量永不过期
- ttl 检查变量可以在内存里存多久
- 192.168.88.64:6364> set sex girl
- OK
- 192.168.88.64:6364> ttl sex
- (integer) -1 表示永不过期
- 192.168.88.64:6364> EXPIRE sex 15 设置过期时间15 秒
- (integer) 1
- 192.168.88.64:6364> keys sex
- 1) "sex"
- 192.168.88.64:6364> ttl sex
- (integer) 8 还剩下8秒时间过期
- 192.168.88.64:6364> ttl sex
- (integer) -2 表示已经过期被删除
- 192.168.88.64:6364> keys sex
- (empty list or set)
- 192.168.88.64:6364>
- type 命令检查变量存储数据的类型
- 使用set mset命令存储的数据都字符类型。
- 数据的类型不同 管理的命令也不同
- 明天讲数据类型。
- 192.168.88.64:6364> set x 99
- OK
- 192.168.88.64:6364> mset y 108
- OK
- 192.168.88.64:6364> type x
- string
- 192.168.88.64:6364> type y
- string
- 192.168.88.64:6364> lpush tea nb wk zzg plj lx 定义类别类型的变量tea
- 192.168.88.64:6364> type tea 查看变量类型 list 列表类型的数据
- list
- del 删除内存里的变量
- 192.168.88.64:6364> keys *
- 1) "y"
- 2) "tea"
- 3) "name"
- 4) "school"
- 5) "x"
- 6) "classs"
- 192.168.88.64:6364> del tea y school
- (integer) 3
- 192.168.88.64:6364> keys *
- 1) "name"
- 2) "x"
- 3) "classs"
- 192.168.88.64:6364>
- flushdb 删除当前所在库的所有数据
- 192.168.88.64:6364> keys *
- 1) "name"
- 2) "x"
- 3) "classs"
- 192.168.88.64:6364> flushdb
- OK
- 192.168.88.64:6364> keys *
- (empty list or set)
- 192.168.88.64:6364> SELECT 1
- OK
- 192.168.88.64:6364[1]> keys *
- 1) "age"
- 192.168.88.64:6364[1]> flushall 删除内存里的所有内存里所有数据 (慎用)
3 案例3:部署LNP+Redis
3.1 问题
- 在主机192.168.88.64部署LNP 环境
- 配置PHP支持redis
- 编写网站脚本,把数据存储到本机的内存里
3.2 方案
在redis64主机同时运行nginx 服务,并配置nginx服务可以把数据存储在本机的redis内存服务里。
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:在主机192.168.88.64部署LNP 环境
1)安装源码nginx及php
- ]#yum -y install gcc pcre-devel zlib-devel make 安装依赖
- ]#]# tar -xf nginx-1.22.1.tar.gz 解压源码
- ]#cd nginx-1.22.1 进源码目录
- ]#./configure 配置
- ]#make 编译
- ]#make install 安装
- ]# ls /usr/local/nginx/ 查看安装目录
- conf html logs sbin
- ]# yum -y install php php-fpm php-devel 安装php 软件
2)配置动静分离
- ]# 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
3)启动nginx服务
- [root@redis64 ~]# /usr/local/nginx/sbin/nginx -t 测试配置
- nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
- nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
- [root@redis64 ~]#
- [root@redis64 ~]# /usr/local/nginx/sbin/nginx 启动服务
- [root@redis64 ~]# netstat -utnlp | grep 80
- tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10469/nginx: master
- [root@redis64 ~]#
- 启动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
- [root@redis64 ~]# systemctl start php-fpm 启动服务
- [root@redis64 ~]# netstat -utnlp | grep 9000 查看端口
- tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 10477/php-fpm: mast
- [root@redis64 ~]#
- 测试配置
- [root@redis64 ~]# vim /usr/local/nginx/html/test.php 编写php脚本
- <?php
- echo "hello world!!! \n";
- ?>
- [root@redis64 ~]# curl http://localhost/test.php 访问php脚本
- hello world!!!
- [root@redis64 ~]#
步骤二:配置PHP支持redis
1)安装软件提供模块
--with-php-config=/usr/bin/php-config 获取php版本信息
- [root@redis64 pub]# tar -xf redis-cluster-4.3.0.tgz 解压源码
- [root@redis64 pub]# cd redis-4.3.0/ 进源码目录
- [root@redis64 redis-4.3.0]# phpize 获取php版本信息
- Configuring for:
- PHP Api Version: 20170718
- Zend Module Api No: 20170718
- Zend Extension Api No: 320170718
- [root@redis64 redis-4.3.0]# ./configure --with-php-config=/usr/bin/php-config 配置
- [root@redis64 redis-4.3.0]# make && make install 编译并安装
- Build complete.
- Don't forget to run 'make test'.
- Installing shared extensions: /usr/lib64/php/modules/ 提示模块安装的位置
- [root@redis64 redis-4.3.0]# ls /usr/lib64/php/modules/redis.so 查看模块
- /usr/lib64/php/modules/redis.so
- [root@redis64 redis-4.3.0]#
2)调用模块
- [root@redis64 redis-4.3.0]# vim /etc/php.ini 编辑php进程主配置文件
- 737 extension_dir = "/usr/lib64/php/modules/" 指定模块所在目录
- 739 extension = "redis.so" 指定模块名
- :wq
3)加载模块
- [root@redis64 redis-4.3.0]# systemctl restart php-fpm
4)查看模块
- [root@redis64 ~]# php -m | grep redis
- redis
- [root@redis64 ~]#
步骤三:编写网站脚本,把数据存储到本机的内存里
1)允许通过lo口连接本机redis服务
- [root@redis64 ~]# systemctl stop redis
- [root@redis64 ~]# vim /etc/redis.conf
- 69 bind 127.0.0.1 192.168.88.64
- :wq
- [root@redis64 ~]# netstat -utnlp | grep redis-server
- tcp 0 0 192.168.88.64:6364 0.0.0.0:* LISTEN 12794/redis-server
- tcp 0 0 127.0.0.1:6364 0.0.0.0:* LISTEN 12794/redis-server
- [root@redis64 ~]#
2)编写php脚本
- [root@redis64 ~]# vim /usr/local/nginx/html/redis.php
- <?php
- $redis = new redis();
- $redis->connect("127.0.0.1", "6364");
- $redis->auth("tarenaplj");
- $redis->set("class","nsd");
- echo "save ok\n";
- ?>
3)访问脚本
- [root@redis64 ~]# curl http://localhost/redis.php
- save ok
- [root@redis64 ~]#
4)连接redis服务查看变量
- [root@redis64 ~]# redis-cli -h 127.0.0.1 -p 6364
- 127.0.0.1:6364> auth tarenaplj
- OK
- 127.0.0.1:6364> keys *
- 1) "school"
- 2) "class"
- 127.0.0.1:6364> get class
- "nsd"
- 127.0.0.1:6364>
4 案例4:创建redis集群
4.1 问题
- 准备集群环境
- 创建集群
- 查看集群信息
- 访问集群
4.2 方案
创建6台新虚拟机,具体要求如表-2所示。


4.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:准备集群环境
说明:准备做集群的主机,不允许存储数据、不允许设置连接密码
配置服务器192.168.88.51
- ]# yum -y install redis 安装软件
- ]# vim /etc/redis.conf 修改主配置文件夹
- 92 port 6379 //端口号
- 69 bind 192.168.88.51 //IP地址
- 838 cluster-enabled yes //启用集群功能
- 846 cluster-config-file nodes-6379.conf //存储集群信息文件
- 852 cluster-node-timeout 5000 //集群中主机通信超时时间
- :wq
- ]# systemctl start redis
- ]# netstat -utnlp | grep redis-serve
- tcp 0 0 192.168.88.51:6379 0.0.0.0:* LISTEN 21201/redis-serve
- tcp 0 0 192.168.88.51:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.52
- ]# yum -y install redis
- ]# vim /etc/redis.conf
- 92 port 6379
- 69 bind 192.168.88.52
- 838 cluster-enabled yes //启用集群功能
- 846 cluster-config-file nodes-6379.conf //存储集群信息文件
- 852 cluster-node-timeout 5000 //集群中主机通信超时时间
- :wq
- ]# systemctl start redis
- ]# netstat -utnlp | grep redis-serve
- tcp 0 0 192.168.88.52:6379 0.0.0.0:* LISTEN 21201/redis-serve
- tcp 0 0 192.168.88.52:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.53
- ]# yum -y install redis
- ]# vim /etc/redis.conf
- 92 port 6379
- 69 bind 192.168.88.53
- 838 cluster-enabled yes //启用集群功能
- 846 cluster-config-file nodes-6379.conf //存储集群信息文件
- 852 cluster-node-timeout 5000 //集群中主机通信超时时间
- :wq
- ]# systemctl start redis
- ]# netstat -utnlp | grep redis-serve
- tcp 0 0 192.168.88.53:6379 0.0.0.0:* LISTEN 21201/redis-serve
- tcp 0 0 192.168.88.53:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.54
- ]# yum -y install redis
- ]# vim /etc/redis.conf
- 92 port 6379
- 69 bind 192.168.88.54
- 838 cluster-enabled yes //启用集群功能
- 846 cluster-config-file nodes-6379.conf //存储集群信息文件
- 852 cluster-node-timeout 5000 //集群中主机通信超时时间
- :wq
- ]# systemctl start redis
- ]# netstat -utnlp | grep redis-serve
- tcp 0 0 192.168.88.54:6379 0.0.0.0:* LISTEN 21201/redis-serve
- tcp 0 0 192.168.88.54:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.55
- ]# yum -y install redis
- ]# vim /etc/redis.conf
- 92 port 6379
- 69 bind 192.168.88.55
- 838 cluster-enabled yes //启用集群功能
- 846 cluster-config-file nodes-6379.conf //存储集群信息文件
- 852 cluster-node-timeout 5000 //集群中主机通信超时时间
- :wq
- ]# systemctl start redis
- ]# netstat -utnlp | grep redis-serve
- tcp 0 0 192.168.88.55:6379 0.0.0.0:* LISTEN 21201/redis-serve
- tcp 0 0 192.168.88.55:16379 0.0.0.0:* LISTEN 21201/redis-serve
配置服务器192.168.88.56
- ]# yum -y install redis
- ]# vim /etc/redis.conf
- 92 port 6379
- 69 bind 192.168.88.56
- 838 cluster-enabled yes //启用集群功能
- 846 cluster-config-file nodes-6379.conf //存储集群信息文件
- 852 cluster-node-timeout 50ha00 //集群中主机通信超时时间
- :wq
- ]# systemctl start redis
- ]# netstat -utnlp | grep redis-serve
- tcp 0 0 192.168.88.56:6379 0.0.0.0:* LISTEN 21201/redis-serve
- tcp 0 0 192.168.88.56:16379 0.0.0.0:* LISTEN 21201/redis-serve
步骤二:创建集群
说明:
1、在任意一台redis服务器上都可以执行创建集群的命令。
2、--cluster-replicas 1 给每个master服务器分配一台slave服务器,每个主至少要分配1台slave服务器,不然无法实现redis服务的高可用。
3、创建集群时,会自动创建主从角色,默认把主机列表中的前3台服务器创建为
Master角色的redis服务器,剩下的均配置为slave角色服务器。
4、创建集群时,会自动给master角色的主机分配hash槽 ,通过hash槽实现数据的分布式存储。
- ]# 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
- >>> Creating cluster
- >>> Performing hash slots allocation on 6 nodes...
- Using 3 masters:
- 192.168.88.51:6379
- 192.168.88.52:6379
- 192.168.88.53:6379
- Adding replica 192.168.88.55:6379 to 192.168.88.51:6379
- Adding replica 192.168.88.56:6379 to 192.168.88.52:6379
- Adding replica 192.168.88.54:6379 to 192.168.88.53:6379
- M: 0eb3b7aa0493a19189cba35b0c658202cc20884b 192.168.88.51:6379
- slots:0-5460 (5461 slots) master
- M: a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441 192.168.88.52:6379
- slots:5461-10922 (5462 slots) master
- M: f2c1bdb78d8d224c3666fa6440bdf80ba563c581 192.168.88.53:6379
- slots:10923-16383 (5461 slots) master
- S: bdba77868965371680fa825badff59bf8ef95a81 192.168.88.54:6379
- replicates f2c1bdb78d8d224c3666fa6440bdf80ba563c581
- S: 11510f42bfd9cf667bab5f31c01476d94984200a 192.168.88.55:6379
- replicates 0eb3b7aa0493a19189cba35b0c658202cc20884b
- S: fe572ce003ee634c52adc4b42d92d15f847937d7 192.168.88.56:6379
- replicates a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441
- Can I set the above configuration? (type 'yes' to accept): yes 同意
- ....
- ....
- [OK] All nodes agree about slots configuration.
- >>> Check for open slots...
- >>> Check slots coverage...
- [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.
步骤四:访问集群
- [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槽的个数。
- ]# 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.
集群中slave角色的主机会自动同步master角色主机的数据,实现数据的自动备份,
分别连接集群中的3台slave服务器查看变量
- [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恢复后 自动做当前主的从服务器)
- 停止redis服务
- [root@host53 ~]# systemctl stop reddis
- 查看集群信息
- [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服务
- [root@host53 ~]# systemctl start reddis
- 查看集群信息
- [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.
- 存储数据脚本
- [root@redis64 ~]# 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
- 查看数据脚本
- [root@ redis64 ~]# vim /usr/local/nginx/html/get_data.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)访问脚本
- ]# curl http://192.168.88.64/set_data.php
- save ok
- ]# curl http://192.168.88.64/get_data.php
- tarenaA tarenaB tarenaC
4)命令行连接redis集群主机查看数据
- [root@host51 ~]# redis-cli -c -h 192.168.88.51 -p 6379
- 192.168.88.51:6379> keys *
- 1) "j"
- [root@host52 ~]# redis-cli -c -h 192.168.88.52 -p 6379
- 192.168.88.52:6379> keys *
- 1) "k"
- [root@host53 ~]# redis-cli -c -h 192.168.88.53 -p 6379
- 192.168.88.53:6379> keys *
- 1) "i"
相关文章:
概述、搭建Redis服务器、部署LNP+Redis、创建Redis集群、连接集群、集群工作原理
Top NSD DBA DAY09 案例1:搭建redis服务器案例2:常用命令限案例3:部署LNPRedis案例4:创建redis集群 1 案例1:搭建redis服务器 1.1 具体要求如下 在主机redis64运行redis服务修改服务运行参数 ip 地址192.168.88.6…...
redis数据类型与底层数据结构对应关系
对应关系如下 SDSZipListHashTableQuickListintsetSkipListString✔Hash✔✔List✔Set✔✔Zset✔✔ String SDS Hash ZipList 对应对象编码 OBJ_ENCODING_ZIPLIST HashTable 对应对象编码 OBJ_ENCODING_HT 当一个Hash对象的键值对数据量增加到一定数量时就会触发编码转换…...
SpringBoot请求响应
简单参数 1. 原始方式获取请求参数 Controller方法形参中声明httpServletRequest对象 调用对象的getParameter参数名 RestController public class RequestController {RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){Strin…...
功能上新|全新GPU性能优化方案
GPU优化迎来了全新的里程碑!我们深知移动游戏对高品质画面的追求日益升温,因此UWA一直着眼于移动设备GPU性能优化,以确保您的游戏体验尽善尽美。然而,不同GPU芯片之间的性能差异及可能导致的GPU瓶颈问题,让优化工作变得…...
试岗第一天问题
1、公司的一个项目拉下来 ,npm i 不管用显示 后面百度 使用了一个方法 虽然解决 但是在增加别的依赖不行,后面发现是node版本过高,更换node版本解决。 2、使用插件动态的使数字从0到100(vue-animate-number插件) 第一…...
2023-08-15力扣每日一题
链接: 833. 字符串中的查找与替换 题意: n组操作,其中第i组: 检查 子字符串 sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。如果没有出现, 什么也不做 。如果出现,则用 targets[i] 替换 该子…...
Java单例模式详解(五种实现方式)
1、什么是单例模式? Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。 例如: 一个日志记录器(Logger)。在一个…...
【javaweb】学习日记Day1 - HTML CSS入门
目录 一、图片标签 ① 绝对路径 1.绝对磁盘路径 2.绝对网络路径 ② 相对路径 (推荐) 二、标题标签 三、水平线标签 四、标题样式 1、CSS引入样式 ① 行内样式 ② 内嵌样式 ③ 外嵌样式 2、CSS选择器 ① 元素选择器 ② id选择器 ③…...
贴吧照片和酷狗音乐简单爬取
爬取的基本步骤 很简单,主要是两大步 向url发起请求 这里注意找准对应资源的url,如果对应资源不让程序代码访问,这里可以伪装成浏览器发起请求。 解析上一步返回的源代码,从中提取想要的资源 这里解析看具体情况,一…...
Databend 开源周报第 106 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 数据脱敏 Data…...
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
场景 Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据: Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据_mysql循环插入随机数据_霸道流氓气质的博客…...
IL汇编ldc指令学习
ldc指令是把值送到栈上, 说明如下, ldc.i4 将所提供的int32类型的值作为int32推送到计算堆栈上; ldc.i4.0 将数值0作为int32推送到计算堆栈上; ... ldc.i4.8 将数值8作为int32推送到计算堆栈上; ldc.i4.m1 将数值-…...
【Redis基础篇】浅谈分布式系统(一)
一、浅谈分布式系统 1. 单机架构:只有一台服务器,这个服务器负责所有的工作。 如果遇到了服务器不够的场景怎么处理? 开源:增加更多的硬件资源节流:软件上的优化,优化代码等…一台服务器资源使用有限,就…...
CSS中的calc()函数有什么作用?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS中的calc()函数及其作用⭐ 作用⭐ 示例1. 动态计算宽度:2. 响应式布局:3. 自适应字体大小:4. 计算间距: ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点…...
由浅入深学习Tapable
文章目录 由浅入深学习TapableTapable是什么Tapable的Hook分类同步和异步的 使用Sync*同步类型钩子基本使用bailLoopWaterfall Async*异步类型钩子ParallelSeries 由浅入深学习Tapable webpack有两个非常重要的类:Compiler和Compilation。他们通过注入插件的方式&a…...
YOLOv5白皮书-第Y6周:模型改进
📌本周任务:模型改进📌 注:对yolov5l.yaml文件中的backbone模块和head模块进行改进。 任务结构图: YOLOv5s网络结构图: 原始模型代码: # YOLOv5 v6.0 backbone backbone:# [from, number, module, args]…...
word之插入尾注+快速回到刚才编辑的地方
1-插入尾注 在编辑文档时,经常需要对一段话插入一段描述或者附件链接等,使用脚注经常因占用篇幅较大导致文档页面内容杂乱,这事可以使用快捷键 ControlaltD 即可在 整个行文的末尾插入尾注,这样文章整体干净整洁,需…...
Qt扫盲-QTableView理论总结
QTableView理论总结 一、概述二、导航三、视觉外观四、坐标系统五、示例代码1. 性别代理2. 学生信息模型3. 对应视图 一、概述 QTableView实现了一个tableview 来显示model 中的元素。这个类用于提供之前由QTable类提供的标准表,但这个是使用Qt的model/view架构提供…...
从外部访问K8s中Pod的五种方式
hostNetwork、 hostPort、 NodePort、 LoadBalancer、 Ingress 暴露Pod与Service一样,因为Pod就是Service的backend 1、hostNetwork:true 这是一种直接定义 Pod 网络的方式。 如果在 Pod 中使用 hostNetwork:true 配置, pod 中运行的应用程序…...
什么是A股交易接口_(股票交易c接口)开发原理
A股交易接口是指用于与国内的证券交易所(上海证券交易所和深圳证券交易所)进行股票买卖交易的电子接口或软件系统。A股交易接口是金融机构、券商以及个人投资者的必备掌握操作技能之一,它提供了实时的股票行情、交易下单、撤单、查询账户信息…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
