Linux--Redis配置与优化

Redis配置与优化

一、关系数据库和非关系数据库

1. 关系型数据库

● 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。
● 主要包括:Oracle、MySQL、SQL Server、Microsoft Access、DB2等。

2. 非关系型数据库

● 非关系型数据库(NoSQL,Not Only SQL)意思是"不仅仅是SQL",是非关系型数据库的总称。
● 除了主流的关系型数据库外的数据库,都认为是非关系型数据库。
● 主要包括:Redis、MongDB、Hbase、Memcached等。

3. 非关系型数据库产生背景

可用于应对Web2.0纯动态网站类型的三高问题
● High Performance
对数据库高并发读写需求
● High Storage
对海量数据高效存储与访问需求
● High Scalability && High Availability
对数据库高可扩展性与高看可用性需求

4. 关系型数据库和非关系型数据库的区别

4.1 数据存储方式不同

关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的和合列中。数据表可以彼此关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。
你的数据及其特性是选择数据存储和提取方式的首要影响因素。

4.2 扩展方式不同

SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过 提高计算机性能来克服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。
而NoSQL数据库是横向扩展的,因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。

4.3 对事务性的支持不同

如果数据操纵需要高事务型或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
虽然NoSQL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面。

5. 总结

(1)关系型数据库:
实例-->数据库-->表(table)-->记录行(row)-->数据字段(column)
(2)非关系型数据库
实例-->数据库-->集合(collection)-->键值对(key-value)
非关系型数据库不需要手动创建数据和集合(表)。

二、Redis的基础概念

1. Redis简介


● Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的、使用C语言编写的NoSQL数据库。
● Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。

2. Redis程序

Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降;若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。
即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPU资源比较紧张,采用单进程即可。

3. Redis的优点

● 具有极高的数据读写速度
数据读取的速度最高可达到110000次/秒,数据写入速度最高可达到81000次/秒。
● 支持丰富的数据类型
支持key-value、String、Lists、Hashes、Sets及Stored Sets等数据类型操作。
● 支持数据的持久化
可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
● 原子性
Redis所有操作都是原子性的。
● 支持数据备份
即master-slave模式的数据备份。

4. Redis的使用场景

Redis作为基于内存运行的数据库,缓存是最长应用的场景之一。除此之外,Redis常见应用场景还包括获取最新N个数据的操作、排行榜类应用、计算器应用、存储关系、实时分析系统、日志记录等。

5. Redis速度快的原因

● Redis是纯内存结构,避免了磁盘的I/O等耗时操作。
● Redis命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。
● 采用了I/O多路复用机制,大大提升了并发效率。
I/O多路复用程序虽然会同时监听多个socket连接,但是其会将监听的socket都放到一个队列里面,然后通过这个队列有序的,同步的将每个socket对应的时间传送到文件事件分派器,再由文件事件分派器给对应的事件处理器进行处理,只有当一个socket所对应的事件被处理完毕之后,I/O多路复用程序才会继续向文件事件分派器传送下一个socket所对应的的事件,这也可以验证上面的结论,处理客户端的命令请求是单线程的方式逐个处理,但是事件处理器内并不是只有一个线程。

6. Redis与Memcashed区别

官方网站:https://www.redis.io

下载地址:https://download.redis.io/releases/

三、Redis安装部署

1. 关闭防火墙

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# setenforce 0

setenforce: SELinux is disabled

2. 源码编译安装

[root@localhost ~]# yum install -y gcc gcc-c++ make

[root@localhost ~]# cd /opt

[root@localhost opt]# ls

redis-5.0.7.tar.gz

[root@localhost opt]# tar xf redis-5.0.7.tar.gz

[root@localhost opt]# cd redis-5.0.7

[root@localhost redis-5.0.7]# make && make PREFIX=/usr/local/redis install

由于Redis源码包中直接提供了Makefile文件,所以在解压完软件包后,不用先执行./configure进行配置,可直接执行make与make install命令进行安装

[root@localhost redis-5.0.7]# cd utils/

执行软件包提供的install_server.sh脚本文件设置Redis服务所需要相关配置文件

[root@localhost utils]# ./install_server.sh

Welcome to the redis service installer

This script will help you easily set up a running redis server

 

Please select the redis port for this instance: [6379]回车

Selecting default: 6379

Please select the redis config file name [/etc/redis/6379.conf]回车

Selected default - /etc/redis/6379.conf

Please select the redis log file name [/var/log/redis_6379.log]回车

Selected default - /var/log/redis_6379.log

Please select the data directory for this instance [/var/lib/redis/6379]回车

Selected default - /var/lib/redis/6379

Please select the redis executable path [] /usr/local/redis/bin/redis-server注意要一次性正确输入

Selected config:

Port : 6379

默认侦听端口为6379

Config file : /etc/redis/6379.conf

配置文件路径

Log file : /var/log/redis_6379.log

日志文件路径

Data dir : /var/lib/redis/6379

数据文件路径

Executable : /usr/local/redis/bin/redis-server

可执行文件路径

Cli Executable : /usr/local/redis/bin/redis-cli

客户端命令工具

Is this ok? Then press ENTER to go on or Ctrl-C to abort.确认并回车

Copied /tmp/6379.conf => /etc/init.d/redis_6379

Installing service...

Successfully added to chkconfig!

Successfully added to runlevels 345!

Starting Redis server...

Installation successful!

3. 优化路径

[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin

把redis的可执行程序文件放入路径环境变量的目录中便于系统识别

[root@localhost utils]# netstat -natp | grep redis

tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 15234/redis-server

当install_server.sh脚本运行完毕,Redis服务就已经启动,默认监听端口为6379

4. Redis服务控制

/etc/init.d/redis_6379 stop

/etc/init.d/redis_6379 start

/etc/init.d/redis_6379 restart

/etc/init.d/redis_6379 status

5. 修改/etc/redis/6379.conf配置参数

[root@localhost utils]# vim /etc/redis/6379.conf

70 bind 127.0.0.1 192.168.10.2        添加监听的主机地址

93 port 6379                     Redis默认的监听端口

137 daemonize yes                启用守护进程

159 pidfile /var/run/redis_6379.pid    指定PID文件

167 loglevel notice                日志级别

172 logfile /var/log/redis_6379.log    指定日志文件

[root@localhost utils]# /etc/init.d/redis_6379 restart修改完配置文件时一定要重启

其他配置参数

114 timeout 300 指定当客户端闲置多长时间后关闭连接。如果指定为0,表示关闭该功能

254 dfleme dump rdb 指定本地数据库文件名,默认值为dump.rdb

264 dir /rlib/redi/6379 指定本地数据库存放目录

540 maxclients 10000

设置同一时间最大客户端连接数,默认为10000,Redis 可以同时打开的客户端连接数为Redis 进程可以打开的最大文件描述符数。如果设置maxclients0.表示不限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回max number of clients reached错误信息

242 rdbcompression yes

指定存储至本地数据库时是否压缩数据,默认为yes, Redis 采用LZF压缩。为了节省CPU资源,可以关闭该选项,但会导致数据库文件变得巨大

手动添加 slaveof <masterip> smasterport>

当本机为slave从服务器时,设置master服务的IP地址及端口,在Redis启

动时,它会自动从master进行数据同步

294 masterauth <master password> 当本机为从服务时,设置主服务的连接密码

508 requirepass foobared

设置Redis连接密码。如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认为关闭

567 maxmemory <byts>

指定Redis最大内存限制。Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制会把Key存放内存,Value 会存放在swap区

700 appendonly no

指定是否在每次更新操作后进行日志记录。Redis 在默认情况下是异步地把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据 丢失。因为Redis 本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no

704 appendfilename appendonly.aof 指定更新日志文件名,默认为apendonly.aof

730 appendfsyne everysec

指定更新日志条件,共有三个可选值:

no:表示等操作系统进行数据缓存同步到磁盘(快)

always:表示每次更新操作后手动调用fsyne( )将数据写到磁盘(慢,安全)

everysec:表示每秒同步一次(折中,默认值)

1158 activerehashing yes

指定是否激活重置哈希,默认为开启

36 include ptoeal.conf

指定包含其他的配置文件,可以在同一主机上多个Redis实例之间使用同份配置文件,而同时各个实例又拥有自己的特定配置文件四、Redis管理控制

1. Redis命令工具

redis-server:用于启动Redis的工具,redis-setinel是它的软链接

redis-benchmark:用于检测Redis在本机的运行效率

redis-check-aof:修复AOF持久化文件

redis-check-rdb:修复RDB持久化文件

redis-cli:Redis命令行工具

2. redis-cli命令行工具

语法:redis-cli -h root -p port -a password
-h:指定远程主机
-p:指定Redis服务的端口号
-a:指定密码,未设置数据库密码可以省略-a选项
若不添加任何选项表示,则使用127.0.0.1:6379连接本机上的Redis数据库

[root@localhost utils]# redis-cli -h 192.168.10.2 -p 6379 连接到主机192.168.10.2,端口为6379的数据库

192.168.10.2:6379> ping

PONG

192.168.10.2:6379> quit

[root@localhost utils]# redis-cli 连接上本机上的Redis数据库

127.0.0.1:6379> ping 检测Redis服务是否启动

PONG

127.0.0.1:6379> quit 退出数据库

help @<group>获取<group>中的命令列表

例:help @list 查看所有与list相关的命令

help <command>获取某个命令的帮助

例:help set 查看set命令的命令帮助

help <tab>获取可能帮助的主题列表

3. redis-benchmark测试工具

redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。
基本的测试语法:redis-benchmark [选项] [选项值]

常用选项

说明

-h

指定服务器主机名

-p

指定服务器端口

-s

指定服务器socket

-c

指定并发连接数

-n

指定请求数

-d

以字节的形式指定SET/GET值的数据大小

-k

1=keep alive 0=reconnect

-r

SET/GET/INCR使用随机key,SADD使用随机值

-P

通过管道传输请求

-q

强制退出redis,仅显示query/sec值

--csv

以CSV格式输出

-l

生成循环,永久执行测试

-t

仅运行以逗号分隔的测试命令列表

-I

Idle模式,仅打开N个idle连接并等待

向IP地址为192.168.10.2,端口号为6379的Redis服务器发送100个并发连接与100000个请求测试性能

因为结果太长了,就不截图了

[root@localhost ~]# redis-benchmark -h 192.168.10.2 -p 6379 -c 100 -n 100000

====== PING_INLINE ======

100000 requests completed in 0.92 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

93.30% <= 1 milliseconds

99.60% <= 2 milliseconds

99.88% <= 3 milliseconds

99.90% <= 15 milliseconds

99.93% <= 16 milliseconds

99.98% <= 17 milliseconds

100.00% <= 17 milliseconds

108225.10 requests per second

 

====== PING_BULK ======

100000 requests completed in 0.90 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

95.28% <= 1 milliseconds

99.96% <= 2 milliseconds

100.00% <= 3 milliseconds

100.00% <= 3 milliseconds

110864.74 requests per second

 

====== SET ======

100000 requests completed in 0.94 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

94.01% <= 1 milliseconds

99.81% <= 2 milliseconds

99.86% <= 3 milliseconds

99.90% <= 8 milliseconds

99.90% <= 17 milliseconds

99.90% <= 23 milliseconds

99.94% <= 24 milliseconds

99.97% <= 25 milliseconds

100.00% <= 25 milliseconds

105932.20 requests per second

 

====== GET ======

100000 requests completed in 0.90 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

95.01% <= 1 milliseconds

99.77% <= 2 milliseconds

100.00% <= 2 milliseconds

110741.97 requests per second

 

====== INCR ======

100000 requests completed in 0.94 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

91.86% <= 1 milliseconds

99.76% <= 2 milliseconds

100.00% <= 2 milliseconds

106157.12 requests per second

 

====== LPUSH ======

100000 requests completed in 0.87 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

95.85% <= 1 milliseconds

99.89% <= 2 milliseconds

99.99% <= 3 milliseconds

100.00% <= 3 milliseconds

115340.26 requests per second

 

====== RPUSH ======

100000 requests completed in 1.00 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

90.96% <= 1 milliseconds

99.25% <= 2 milliseconds

99.84% <= 3 milliseconds

100.00% <= 4 milliseconds

100.00% <= 4 milliseconds

100401.61 requests per second

 

====== LPOP ======

100000 requests completed in 0.88 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

96.65% <= 1 milliseconds

99.68% <= 2 milliseconds

100.00% <= 2 milliseconds

113250.28 requests per second

 

====== RPOP ======

100000 requests completed in 0.96 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

95.13% <= 1 milliseconds

99.85% <= 2 milliseconds

100.00% <= 2 milliseconds

104058.27 requests per second

 

====== SADD ======

100000 requests completed in 0.97 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

92.29% <= 1 milliseconds

99.21% <= 2 milliseconds

99.88% <= 3 milliseconds

100.00% <= 4 milliseconds

100.00% <= 4 milliseconds

103092.78 requests per second

 

====== HSET ======

100000 requests completed in 0.95 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

90.62% <= 1 milliseconds

99.70% <= 2 milliseconds

99.97% <= 3 milliseconds

99.99% <= 4 milliseconds

100.00% <= 4 milliseconds

104712.05 requests per second

 

====== SPOP ======

100000 requests completed in 0.94 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

95.03% <= 1 milliseconds

99.78% <= 2 milliseconds

100.00% <= 2 milliseconds

106837.61 requests per second

 

====== LPUSH (needed to benchmark LRANGE) ======

100000 requests completed in 0.92 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

93.54% <= 1 milliseconds

99.80% <= 2 milliseconds

99.99% <= 3 milliseconds

100.00% <= 3 milliseconds

108342.37 requests per second

 

====== LRANGE_100 (first 100 elements) ======

100000 requests completed in 1.76 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

62.63% <= 1 milliseconds

93.52% <= 2 milliseconds

99.18% <= 3 milliseconds

99.93% <= 4 milliseconds

100.00% <= 4 milliseconds

56882.82 requests per second

 

====== LRANGE_300 (first 300 elements) ======

100000 requests completed in 4.07 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

0.00% <= 1 milliseconds

38.56% <= 2 milliseconds

81.14% <= 3 milliseconds

92.37% <= 4 milliseconds

96.78% <= 5 milliseconds

98.81% <= 6 milliseconds

99.62% <= 7 milliseconds

99.93% <= 8 milliseconds

100.00% <= 9 milliseconds

100.00% <= 9 milliseconds

24594.20 requests per second

 

====== LRANGE_500 (first 450 elements) ======

100000 requests completed in 5.45 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

0.00% <= 1 milliseconds

1.54% <= 2 milliseconds

54.99% <= 3 milliseconds

79.70% <= 4 milliseconds

88.95% <= 5 milliseconds

93.39% <= 6 milliseconds

96.61% <= 7 milliseconds

98.57% <= 8 milliseconds

99.54% <= 9 milliseconds

99.89% <= 10 milliseconds

99.97% <= 11 milliseconds

100.00% <= 12 milliseconds

100.00% <= 12 milliseconds

18358.73 requests per second

 

====== LRANGE_600 (first 600 elements) ======

100000 requests completed in 6.63 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

0.00% <= 1 milliseconds

0.14% <= 2 milliseconds

21.30% <= 3 milliseconds

67.75% <= 4 milliseconds

81.44% <= 5 milliseconds

88.51% <= 6 milliseconds

92.61% <= 7 milliseconds

95.14% <= 8 milliseconds

97.40% <= 9 milliseconds

98.77% <= 10 milliseconds

99.51% <= 11 milliseconds

99.85% <= 12 milliseconds

99.95% <= 13 milliseconds

100.00% <= 14 milliseconds

100.00% <= 14 milliseconds

15087.51 requests per second

 

====== MSET (10 keys) ======

100000 requests completed in 0.96 seconds

100 parallel clients

3 bytes payload

keep alive: 1

 

88.28% <= 1 milliseconds

99.47% <= 2 milliseconds

100.00% <= 2 milliseconds

103950.10 requests per second

测试存取大小为100字节的数据包的性能

[root@localhost ~]# redis-benchmark -h 192.168.10.2 -p 6379 -q -d 100

PING_INLINE: 118203.30 requests per second

PING_BULK: 114810.56 requests per second

SET: 109289.62 requests per second

GET: 108577.63 requests per second

INCR: 115874.86 requests per second

LPUSH: 113250.28 requests per second

RPUSH: 112994.35 requests per second

LPOP: 105708.25 requests per second

RPOP: 116686.12 requests per second

SADD: 115740.73 requests per second

HSET: 116144.02 requests per second

SPOP: 113765.64 requests per second

LPUSH (needed to benchmark LRANGE): 117096.02 requests per second

LRANGE_100 (first 100 elements): 42643.92 requests per second

LRANGE_300 (first 300 elements): 15103.46 requests per second

LRANGE_500 (first 450 elements): 9968.10 requests per second

LRANGE_600 (first 600 elements): 7401.92 requests per second

MSET (10 keys): 86730.27 requests per second

测试本机上Redis服务在进行set与lpush操作时的性能

[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q

SET: 117924.53 requests per second

LPUSH: 118483.41 requests per second

五、Redis数据库常用命令

1. set/get

set:存放数据,命令格式为set key value
get:获取数据,命令格式为get key

[root@localhost ~]# redis-cli

127.0.0.1:6379> set name zhangsan

OK

127.0.0.1:6379> get name

"zhangsan"

2. keys

keys命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用

127.0.0.1:6379> keys *

1) "counter:__rand_int__"

2) "name"

3) "myset:__rand_int__"

4) "mylist"

5) "key:__rand_int__"

创建键后匹配

127.0.0.1:6379> set k1 1

OK

127.0.0.1:6379> set k2 2

OK

127.0.0.1:6379> set k3 3

OK

127.0.0.1:6379> set v1 1

OK

127.0.0.1:6379> set v2 3

OK

127.0.0.1:6379> set v3 5

OK

127.0.0.1:6379> set v11 7

OK

127.0.0.1:6379> keys *

1) "counter:__rand_int__"

2) "v11"

3) "k3"

4) "myset:__rand_int__"

5) "v2"

6) "name"

7) "k2"

8) "v1"

9) "v3"

10) "mylist"

11) "key:__rand_int__"

12) "k1"

127.0.0.1:6379> keys v*

查看当前数据库中以v开头的数据

1) "v11"

2) "v2"

3) "v1"

4) "v3"

127.0.0.1:6379> keys k*

查看当前数据库中以k开头的数据

1) "k3"

2) "k2"

3) "key:__rand_int__"

4) "k1"

127.0.0.1:6379> keys *1

查看当前数据库中以1结尾的数据

1) "v11"

2) "v1"

3) "k1"

127.0.0.1:6379> keys ?1

查看当前数据库中以1结尾并且1前面包含任意一位的数据,例如:e1,g1,y1,51……它们的共同点都是末尾是1的2位数据

1) "v1"

2) "k1"

127.0.0.1:6379> keys ??1

查看当前数据库中以1结尾并且1前面包含任意两位的数据

1) "v11"

127.0.0.1:6379> keys ?11

查看当前数据库中以11结尾并且11前面包含任意一位的数据

1) "v11"

3. exists

exists命令可以判断键值是否存在

127.0.0.1:6379> exists name

判断name键是否存在

(integer) 1

1表示存在

127.0.0.1:6379> exists v11

判断v11键是否存在

(integer) 1

127.0.0.1:6379> exists fdhfs

判断fdhfs键是否存在

(integer) 0

0表示不存在

4. del

del命令可以删除当前数据库的指定key

127.0.0.1:6379> del name

删除name键

(integer) 1

删除成功

127.0.0.1:6379> get name

(nil)

获取不了name键的值

127.0.0.1:6379> exists name

(integer) 0

也无法查看到

127.0.0.1:6379> keys name

(empty list or set)

也无法查看到

127.0.0.1:6379> del namhfd

删除namhfd键

(integer) 0

因为不存在namhfd键,所以删除失败

以下基本命令多练练

127.0.0.1:6379> set name 111

重新设置name键

OK

127.0.0.1:6379> keys name

1) "name"

127.0.0.1:6379> exists name

(integer) 1

127.0.0.1:6379> get name

"111"

5. type

type命令可以获取key对应的value值类型

127.0.0.1:6379> keys *

先查看数据

1) "counter:__rand_int__"

2) "v11"

3) "k3"

4) "myset:__rand_int__"

5) "name"

6) "v2"

7) "k2"

8) "v1"

9) "v3"

10) "mylist"

11) "key:__rand_int__"

12) "k1"

127.0.0.1:6379> type k1

获取k1键对应的value类型

string

下面的是命令练习

127.0.0.1:6379> type k2

string

127.0.0.1:6379> type v11

string

127.0.0.1:6379> type name

string

127.0.0.1:6379> set opt opt

OK

127.0.0.1:6379> type opt

string

127.0.0.1:6379> del opt

(integer) 1

127.0.0.1:6379> del name

(integer) 1

6. rename

rename命令是对已有key进行重命名(覆盖)
命令格式:rename 源key 目标key
使用rename命令进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值。在实际使用过程中,建议先用exists命令查看目标key是否存在,然后再决定是都执行rename命令,以避免覆盖重要数据。
重命名:

127.0.0.1:6379> keys v*

1) "v11"

2) "v2"

3) "v1"

4) "v3"

127.0.0.1:6379> rename v11 v4

将v11键重命名为v4

OK

127.0.0.1:6379> keys v*

1) "v4"

2) "v2"

3) "v1"

4) "v3"

覆盖:

127.0.0.1:6379> get v1

"1"

127.0.0.1:6379> get v2

"3"

127.0.0.1:6379> rename v1 v2

将v1的值覆盖成v2的值

OK

127.0.0.1:6379> keys v*

1) "v4"

2) "v2"

3) "v3"

127.0.0.1:6379> get v1

(nil)

127.0.0.1:6379> get v2

"1"

7. renamenx

renamenx命令的作用是对已有key进行重命名,并检测新名是否存在,如果目标key存在则不进行重命名(不覆盖)
命令格式:renamenx 源key 目标key

127.0.0.1:6379> keys v*

1) "v4"

2) "v2"

3) "v3"

127.0.0.1:6379> renamenx v4 v2

已有v2键,重命名失败

(integer) 0

127.0.0.1:6379> renamenx v4 v1

把v4键重命名为v1键

(integer) 1

127.0.0.1:6379> keys v*

1) "v1"

2) "v2"

3) "v3"

127.0.0.1:6379> renamenx v3 v1

v1键已存在,重命名失败

(integer) 0

127.0.0.1:6379> keys v*

1) "v1"

2) "v2"

3) "v3"

8. dbsize

dbsize命令的作用是查看当前数据库中key的数目

127.0.0.1:6379> keys *

1) "counter:__rand_int__"

2) "k3"

3) "myset:__rand_int__"

4) "v1"

5) "v2"

6) "k2"

7) "v3"

8) "mylist"

9) "key:__rand_int__"

10) "k1"

127.0.0.1:6379> dbsize

(integer) 10

9. 密码设置

使用"config set requirepass password"命令设置密码

127.0.0.1:6379> config set requirepass 123456

OK

设置数据库密码为123456

10. 密码验证

使用auth命令验证密码,一旦设置密码,每次登陆后必须先验证通过密码,否则所有操作不可用

127.0.0.1:6379> keys *

(error) NOAUTH Authentication required.

127.0.0.1:6379> auth 123456验证密码

OK

127.0.0.1:6379> keys *

1) "counter:__rand_int__"

2) "k3"

3) "myset:__rand_int__"

4) "v1"

5) "v2"

6) "k2"

7) "v3"

8) "mylist"

9) "key:__rand_int__"

10) "k1"

也可在登录时使用-a选项,输入密码。

[root@localhost ~]# redis-cli -a 123456

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

127.0.0.1:6379> quit

注:由于密码将被直接暴露,有被history盗密的风险,因此需谨慎使用。

11. 查看密码

使用"config get requirepass"命令查看密码

[root@localhost ~]# redis-cli

127.0.0.1:6379> config get requirepass

(error) NOAUTH Authentication required.

127.0.0.1:6379> quit

[root@localhost ~]# redis-cli -a 123456

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

127.0.0.1:6379> config get requirepass

1) "requirepass"

2) "123456"

127.0.0.1:6379> quit

[root@localhost ~]# redis-cli

127.0.0.1:6379> auth 123456

OK

127.0.0.1:6379> config get requirepass

1) "requirepass"

2) "123456"

12. 取消密码

使用"config set requirepass ''"命令通过重定义空密码的方式,清空密码并取消密码验证

127.0.0.1:6379> config get requirepass 查看密码

1) "requirepass"

2) "123456"

127.0.0.1:6379> config set requirepass '' 设置空密码

OK

127.0.0.1:6379> config get requirepass查看密码

1) "requirepass"

2) "" 空的

127.0.0.1:6379> quit

[root@localhost ~]# redis-cli 本地登录

127.0.0.1:6379> keys v* 操作可使用

1) "v1"

2) "v2"

3) "v3"

13. Redis多数据库常用命令

Redis支持多数据库,Redis默认情况下包含16个数据库,数据库名称是用数字0-15来依次命名的。
多数据库相互独立,互不干扰。

13.1 多数据库间切换

命令格式:select 序号
使用redis-cli连接Redis数据库后,默认使用的是序号为0的数据库

127.0.0.1:6379> select 10

OK

127.0.0.1:6379[10]> select 15

OK

127.0.0.1:6379[15]> select 16

(error) ERR DB index is out of range

超出限制

127.0.0.1:6379[15]> select 1

OK

127.0.0.1:6379[1]> select 0

OK

13.2 多数据库间移动数据

格式:move 键值 序号

127.0.0.1:6379> set name zhangsan    创建"name"键并赋值"zhangsan"

OK

127.0.0.1:6379> get name             查看"name"键

"zhangsan"

127.0.0.1:6379> select 1                切换至数据库1

OK

127.0.0.1:6379[1]> get name            查看"name"键,确认数据库1没有"name"键

(nil)

127.0.0.1:6379[1]> select 0            切换回数据库0

OK

127.0.0.1:6379> move name 1            将数据库0中的"name"键移动至数据库1

(integer) 1

127.0.0.1:6379> get name                查看"name"键,确认数据库0中已无"name"键

(nil)

127.0.0.1:6379> select 1                切换至数据库1

OK

127.0.0.1:6379[1]> get name            查看"name"键,确认已将"name"键从数据库0移动到数据库1

"zhangsan"

13.3 清除数据库数据

flushdb:清空当前数据库数据
flushall:清空所有数据库的数据,慎用

127.0.0.1:6379> select 1            切换至数据库1

OK

127.0.0.1:6379[1]> keys *            查看键

1) "name"

127.0.0.1:6379[1]> flushdb        清空当前数据库

OK

127.0.0.1:6379[1]> keys *            查看键,确认已清空

(empty list or set)

127.0.0.1:6379[1]> select 0        切换至数据库0

OK

127.0.0.1:6379> keys *            查看键

1) "counter:__rand_int__"

2) "k3"

3) "myset:__rand_int__"

4) "v1"

5) "v2"

6) "k2"

7) "v3"

8) "mylist"

9) "key:__rand_int__"

10) "k1"

127.0.0.1:6379> select 1        切换至数据库1

OK

127.0.0.1:6379[1]> flushall        清空全部数据库

OK

127.0.0.1:6379[1]> select 0    切换至数据库0

OK

127.0.0.1:6379> keys *        查看键,确认已清空全部库

(empty list or set)

posted @ 2022-03-04 15:34  wang-a  阅读(614)  评论(0)    收藏  举报