NoSQL之Redis配置与优化

本文介绍了关系型数据库与非关系型数据库的区别,重点讲解了Redis的特性、优点及五种数据类型。此外,详细阐述了Redis的安装、部署、命令工具及数据库操作,包括内存管理和性能优化,为读者提供了一套完整的Redis实战教程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、关系型数据库与非关系型数据库

1、关系型数据库

2、非关系型数据库

3、关系型数据库与非关系型数据库区别

3.1 数据存储方式不同

3.2 扩展方式不同

3.3 对事务性的支持不同

4、非关系型数据库的北京

5、总结

二、Redis

1、Redis简介

2、Redis的优点

3、Redis为什么会这么快

4、Redis五种数据类型

4.1 String数据类型

4.2 List数据类型

4.3 Hash数据类型(散列类型)

4.4 Set数据类型(无序集合)

4.5 Sorted Set数据类型(zset、有序集合)

三、redis的安装与部署

1、关闭防火墙,上传软件包

2、解压编译安装

3、执行脚本

4、将redis命令放入PATH变量定义的路径中

5、查看redis的6379端口是否启用 

6、Redis的服务控制

7、修改redis配置文件参数

四、redis的命令工具

1、redis的bin目录下可执行文件

2、redis-cli 命令行工具

3、redis-benchmark 测试工具

五、redis数据库操作

1、set 存放数据,get获取数据

2、keys 查看键值列表

3、exists , del ,type命令 

4、rename,renamex重命名

5、dbsize统计key个数 

6、设置,查看,验证通过密码

7、redis 多数据库常用命令

7.1 多数据库之间的切换

7.2 多数据库之间移动数据

7.3 清空数据库

六、redis的性能管理

1、查看redis的内存

2、内存碎片率

3、内存使用率

4、内回收key


一、关系型数据库与非关系型数据库

1、关系型数据库

  •         关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型) 基础上,一般面向于记录
  •         SOL语句(标准数据查询语言) 就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
  •         主流的关系型数据库包括 Oracle、MySQL、SQL Server、MicrosoftAccess、DB2、PostgresoI 等。
  •         以上数据库在使用的时候必须先建库建表设计表结构,然后存储数据的时候按表结构去存,如果数据与表结构不匹配就会存储失败。

2、非关系型数据库

  •         NOSOL(NSOL = Not only SOL ),意思是"不仅仅是 SOI”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型。
  •         不需要预先建库建表定义数据存储表结构,每条记录可以有不同的数据类型和字段个数(比如微信群聊里的文宇、图片、视频、音乐等)。
  •         主流的 NOSOL 数据库有 Redis、MongBD、Hbase、Memcached 等。

3、关系型数据库与非关系型数据库区别

3.1 数据存储方式不同

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

3.2 扩展方式不同

  • SOL和NOSOI数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。要支持更多并发量,SOL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来克服。虽然SOL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。
  • 而NOSOL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NOSOI数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点) 来分担负载。
  1. 关系型: 特别适合高事务性要求和需要控制执行计划的任务
  2. 非关系型: 此处会稍显弱势,其价值点在于高扩展性和大数据量处理方面

3.3 对事务性的支持不同

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

4、非关系型数据库的北京

可用于应对 Web2.0 纯动态网站类型的三高问题。

  • Highperformance——对数据库高并发读写需求
  • Huge Storage——对海量数据高效存储与访问需求
  • High Scalability && High Availability——对数据库高可扩展性与高可用性需求

关系型数据库和非关系型数据库都有各自的特点与应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思略。让关系数据库关注在关系上,非关系型数据库关注在存储上。

例如,在读写分离的MySQL数据库环境中,可以把经常访问的数据存储在非关系型数据库中,提升访问速度。

5、总结

非关系数据库:

  • 数据保存在缓存中,利于读取速度/查询数据/
  • 架构中位置灵活分布式、扩展性高
  • 实例-->数据库-->集合(collection)-->键值对 (key-value)非关系型数据库不需要手动建数据库和集合 (表)。

关系数据库:

  • 安全性高(持久化)
  • 事务处理能力强
  • 任务控制能力强
  • 可以做日志备份、恢复、容灾的能力更强一点。
  • 实例-->数据库-->表(table)-->记录行(row)、数据字段(column)------》存储数据

二、Redis

1、Redis简介

  • Redis基于内存运行并支持持久化
  • 采用key-value(键值对)的存储形式
  1. Redis (远程字典服务器) 是一个开源的、使用 c 语言编写的 NOSQL 数据库。
  2. Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。
  3. Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降:若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPu资源比较紧张,采用单进程即可。

2、Redis的优点

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

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

3、Redis为什么会这么快

  • Redis是一款纯内存结构,避免了磁盘I/o等耗时操作。
  • Redis命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减小了线程上下文切换的消耗。
  • 采用了 I/o 多路复用机制,大大提升了并发效率。

注:在 Redis 6.0中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的。

4、Redis五种数据类型

4.1 String数据类型

概述:String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等

4.2 List数据类型

概述:列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素

4.3 Hash数据类型(散列类型)

概述:hash用于存储对象。可以采用这样的命名方式:对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。如:存储ID为2的汽车对象。

如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。

4.4 Set数据类型(无序集合)

概述:无序集合,元素类型为String类型,元素具有唯一性,不允许存在重复的成员。多个集合类型之间可以进行并集、交集和差集运算。

应用范围:

1.可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。

2.充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。

4.5 Sorted Set数据类型(zset、有序集合)

概述:有序集合,元素类型为Sting,元素具有唯一性,不能重复。

每个元素都会关联一个double类型的分数score(表示权重),可以通过权重的大小排序,元素的score可以相同。

应用范围:

1)可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP10的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。

2)Sorted-Set类型还可用于构建索引数据。

三、redis的安装与部署

1、关闭防火墙,上传软件包

[root@localhost ~]# systemctl disable firewalld  --now
[root@localhost ~]# setenforce  0

#将redis软件包上传到/opt目录
[root@localhost ~]# cd /opt/
[root@localhost ~]# ls redis-5.0.7.tar.gz 

2、解压编译安装

#安装必须的软件包
[root@localhost opt]# yum -y install gcc gcc-c++ make

[root@localhost opt]# tar zxvf redis-5.0.7.tar.gz
[root@localhost opt]# cd /opt/redis-5.0.7/

[root@localhost redis-5.0.7]# make -j 4
#工作目录为/usr/local/redis
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis install

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

3、执行脚本

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

[root@localhost redis-5.0.7]# cd /opt/redis-5.0.7/utils/
[root@localhost utils]# ./install_server.sh
........... #一直回车直到出现redis executable path 
#可执行文件路径。在redis的工作目录的bin目录下,有个redis-server文件
Please select the redis executable path [] /usr/local/redis/bin/redis-server

#配置完会输出配置信息。如果正确,就回车,如果有错误就ctrl c终止
Is this ok? Then press ENTER to go on or Ctrl-C to abort.

4、将redis命令放入PATH变量定义的路径中

ln -s /usr/local/redis/bin/* /usr/local/bin/

5、查看redis的6379端口是否启用 

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

[root@localhost~]# netstat -natp |grep redis
#redis使用的是tcp 6379端口
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      17382/redis-server  

6、Redis的服务控制

  • /etc/init.d/redis_6379 stop #停止redis服务
  • /etc/init.d/redis_6379 start #启动redis服务
  • /etc/init.d/redis_6379 restart #重启redis服务
  • /etc/init.d/redis_6379 status #查看redis服务状态

7、修改redis配置文件参数

redis 的主配置文件为/etc/redis/6379.conf

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

#70行,添加监听的主机地址
70// bind 127.0.0.1 192.168.157.10

#93行,redis的默认监听地址。保持默认即可
93// port 6379

#137, 启用守护进程。保持默认即可
137// daemonize yes

#167,定义redis的日志级别为notice。保持默认即可
167// loglevel notice

#172,指定redis的日志文件。保持默认即可
172// logfile /var/log/redis_6379.log

#保存退出
:wq

#重启服务
[root@localhost ~]# /etc/init.d/redis_6379 restart

四、redis的命令工具

1、redis的bin目录下可执行文件

[root@localhost utils]# cd /usr/local/redis/bin/
[root@localhost bin]# ll
总用量 32768
-rwxr-xr-x. 1 root root 4366224 12月 12 01:05 redis-benchmark
-rwxr-xr-x. 1 root root 8125848 12月 12 01:06 redis-check-aof
-rwxr-xr-x. 1 root root 8125848 12月 12 01:05 redis-check-rdb
-rwxr-xr-x. 1 root root 4807408 12月 12 01:05 redis-cli
lrwxrwxrwx. 1 root root      12 12月 12 01:06 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8125848 12月 12 01:05 redis-server

redis 的bin目录下一共有6个文件。除去一个redis-sentinel 是redis-server的软连接外,其余的5个都是可执行文件

  • redis-server: 用于启动redis的工具
  • redis-benchmark: 用于检测redis在本机的运行效率
  • redis-check-aof: 修复AOF持久化文件
  • redis-check-rdb:修复RDB持久化文件
  • redis-cli:redis命令行工具

2、redis-cli 命令行工具

语法: redis-cli -h host -p port -a password

选项释义
-h指定远程主机
-p指定redsi服务的端口号
-a指定密码。未设置数据库面,可以省略-a选项

如果不添加热河选项,则表示使用127.0.0.1:6379 连接本机上的redis数据库

#进入192.168.157.10主机的redis数据库,连接端口为6379
[root@localhost bin]# redis-cli -h 192.168.157.10 -p 6379
192.168.157.10:6379>    #当前连接提示符

#默认连接本机127.0.0.1的6379端口
[root@localhost bin]# redis-cli
127.0.0.1:6379>

3、redis-benchmark 测试工具

redis-benchmark 工具是官方自带的redsi性能测试工具。可以有效的测试redis服务的性能。

语法:redis-benchmark [选项] [选项值] 

选项释义
-h指定服务器主机名
-p指定服务器端口
-s指定服务器socket
-c指定并发连接数
-n指定请求数
-d以字节的形式指定 SET/GET值的数据大小
-k1=keep alive , 0=reconnect
-rSET/GET/INCR 使用随机key,SADD使用随机值
-p通过管道传输<numreq>请求
-q强制退出redis,仅显示query/sec值
--csv以CSV格式输出
-l(小写的L)生成循环,永久执行删除
-t仅运行以逗号分隔的测试命令列表
-I(大写的 i )Idle模式。仅打开N个idle连接并等待
#向ip为192.168.157.10 ,端口为6379的redis服务器发送100 个并发连接与100000个请求,测试性能
[root@localhost bin]#  redis-benchmark  -h 192.168.157.10 -p 6379 -c 100 -n 100000


#测试存取大小为 100 字节的数据包的 性能
[root@localhost bin]# redis-benchmark -h 192.168.157.10 -p 6379 -q -d 100


#测试本机上Redis 服务正在进行set与;lpush操作时的性能
[root@localhost bin]# redis-benchmark  -t set,lpush -n 100000 -q

五、redis数据库操作

1、set 存放数据,get获取数据

格式

  • set 存放数据:set key value
  • get 存放数据: get key
#设置 键 boss,值Wiewanglei
127.0.0.1:6379> set boss zhanglin
OK

#获取 键boss的值
127.0.0.1:6379> get boss
"zhanglin"

2、keys 查看键值列表

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

  • *: 匹配任意字符任意次数
  • ?:匹配任意字符一次

  • keys * 查看当前数据库中所有键
  • keys a* 查看当前数据库中所有以a 开头的数据
  • keys b? 查看当前数据库中所有b开头后面包含任意一位的数据
  • keys b?? 查看当前数据库中所有b 开头后面包含任意两位的数据
#先创建一下几个键值对
set a1 1
set a2 2
set a3 3
set b1 4
set b5 5
set b22 5

#查看当前数据库中所有键
127.0.0.1:6379> keys *
 1) "key:__rand_int__"
 2) "b22"
 3) "mylist"
 4) "a1"
 5) "b5"
 6) "counter:__rand_int__"
 7) "boss"
 8) "a3"
 9) "b1"
10) "a2"


#查看当前数据库中所有以a 开头的键
127.0.0.1:6379> keys  a*
1) "a1"
2) "a2"
3) "a3"

#查看b开头,后面包含任意一位的数据
127.0.0.1:6379> keys  b?
1) "b1"
2) "b5"

#查看b 开头,后面包含任意两位位的数据
127.0.0.1:6379> keys  b??
1) "b22"

3、exists , del ,type命令 

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

  • existis key_name
    • 返回1 表示该键存在'
    • 返回0 表示改键不存在

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

  • del key_name
    • 返回值表示删除键的数量

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

  • type key_name
    • 返回的值表示键的类型
#查看 boss键是否存在
27.0.0.1:6379> EXISTS boss
#返回1表示 boss键存在
(integer) 1

#查看键 hello是否存在
127.0.0.1:6379> EXISTS hello
#返回 0 表示不存在
(integer) 0


#删除键b5
127.0.0.1:6379> del b5
#返回值表示删除的键的数量
(integer) 1

#删除a1,a2键
127.0.0.1:6379> del a1 a2 
#返回2,表示删除了2个
(integer) 2

#c1,d1键不存在,所以命令执行后,返回0,表示删除了0个
127.0.0.1:6379> del c1 d1 
(integer) 0


#查看boss键的值类型(redis默认值类型是string)
127.0.0.1:6379> type boss
#string表示字符类型
string

#查看b22键的值类型
127.0.0.1:6379> type b22
string

4、rename,renamex重命名

  • rename 命令对已有的key进行重命名(覆盖)
  • renamex 命令的作用是对key 进行重命名,并检测新名是否存在,如果目标key存在,则不进行重命名(不覆盖)
  • 使用rename 命令经行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值。在实际使用过程 中,建议先用exists 命令查看目标key是否存在,然后再决定是否执行rename 命令,以避免覆盖重要数据

格式:

rename或者renamex 源key_name 目标key_name

127.0.0.1:6379> keys *
1) "boss"
2) "b1"
3) "a1"
4) "a2"
5) "b22"
6) "a3"

#当前a1 值为“1”
127.0.0.1:6379> get a1
"1"
#将a1 重命名为 a11
127.0.0.1:6379> rename a1 a11
OK
#a11有值 "1",而a1 键则没有了
127.0.0.1:6379> get a11
"1"
127.0.0.1:6379> exists a1
(integer) 0

#当前b1键存在,且值为 ”4“
127.0.0.1:6379> get b1
"4"
# 将 键a11 重命名为b1
127.0.0.1:6379> rename a11 b1
OK
#查看b1 键的值,发现值被a11的值覆盖
127.0.0.1:6379> get b1
"1"
#原键 a11 不再存在
127.0.0.1:6379> exists a11
(integer) 0


#使用 renamex 将键 b1 重命名为 b11
127.0.0.1:6379> RENAMENX b1 b11
(integer) 1
#键b11 存在,值为”1“
127.0.0.1:6379> get b11
"1"

#当前键 b22 存在,且值为”5“
127.0.0.1:6379> get b22
"5"
#使用 renamex 将b11 键重命名为b22
127.0.0.1:6379> RENAMENX b11 b22
#可以从返回值为0看出失败了
(integer) 0
#查看键b22 和b11,都存在,且值没有改变,renamex重命名操作没有执行成功
127.0.0.1:6379> get b22
"5"
127.0.0.1:6379> get b11
"1"

5、dbsize统计key个数 

dbsize 命令的作用是查看当前数据库中key的数目,返回值表示key的数目

#查看所有key,可以看出一共有5个
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"

#dbsize统计当前数据库的key个数,返回5表示有5个
127.0.0.1:6379> dbsize
(integer) 5

6、设置,查看,验证通过密码

设置密码:config set requirepass 密码

  • 一旦设置密码,必须先验证通过密码,否则所有操作不可用

查看密码:config get requirepass

验证通过密码:auth 密码

  • 退出redis数据库后,重连失效,要再次验证
  • 在连接数据库时,使用 -a 选项跟上密码可以不用auth验证
#设置密码abc123
127.0.0.1:6379> config set requirepass abc123
OK
#当没有验证通过时,命令不可用
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.

--------------------------

#验证通过密码
127.0.0.1:6379> auth  abc123
OK
#此时,命令可以使用
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"

----------------------------------------------

#获取密码
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "abc123"

-------------------------------------

#退出redis 数据库
127.0.0.1:6379> exit

#重新进入redis数据库 
[root@host103 ~]# redis-cli 

#再次使用命令,报错。因为auth验证通过,在退出数据库后失效
127.0.0.1:6379> keys
(error) ERR wrong number of arguments for 'keys' command
#重新使用auth 命令进行密码验证后,命令可用
127.0.0.1:6379> auth abc123
OK
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"

------------------------------

#退出数据库
127.0.0.1:6379> exit

#在连接数据库时,使用 -a 选项指定密码,则可以不用auth验证
[root@host103 ~]# redis-cli  -a abc123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
#在没有使用auth 命令验证的情况下,也可以正常使用数据库命令
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"


--------------------------
#将密码设置为空
127.0.0.1:6379> config set  requirepass ''
OK
#退出连接后再进入数据库
[root@host103 ~]# redis-cli  
#此时也可以正常使用命令了
127.0.0.1:6379> set a123 123
OK

7、redis 多数据库常用命令

redis 支持多数据库,默认情况下包含16 个数据库,数据库名称是用数字0-15来依次命名的。

多数据库相互独立,互不干扰

7.1 多数据库之间的切换

命令格式: select 序号

使用redis-cli连接redis数据库后,默认使用的是0号数据库.

除了0号数据库,其余数据库会在提示符后面使用 [序号] 标明

#切换到 10 号数据库
127.0.0.1:6379> select 10
OK

#当前提示符后面有[10],表明是10号数据库
#切换到15号数据库
127.0.0.1:6379[10]> select 15
OK

#当前提示符后面有[15],表明是15号数据库
#切换到0号数据库
127.0.0.1:6379[15]> select 0
OK

#此时,0号数据库没有标识
#切换到16号数据库(没有这个序号的数据库)
127.0.0.1:6379> select 16
#报错提示,超出范围
(error) ERR DB index is out of range

7.2 多数据库之间移动数据

格式: move 键值 序号

#再当前的0 号库,设置 k1 键,值为”100“
127.0.0.1:6379> set k1 100
OK
#当前可以获取到k1键的值
127.0.0.1:6379> get k1
"100"

#切换到 10 号库
127.0.0.1:6379> select 10
OK
#查看发现 k1 键不存在,因为多数据库相互独立
127.0.0.1:6379[10]> EXISTS k1
(integer) 0

-------------

#切换会 0号库
127.0.0.1:6379[10]> SELECT 0
OK

#将 当前库中的 k1 键 移动到 10 号库
127.0.0.1:6379> MOVE k1 10
(integer) 1
#当前库查看,k1 键不存在
127.0.0.1:6379> EXISTS k1
(integer) 0

#切换到10 号库
127.0.0.1:6379> SELECT 10
OK

#k1键存在,且值为"100"
127.0.0.1:6379[10]> EXISTS k1
(integer) 1
127.0.0.1:6379[10]> GET k1
"100"

7.3 清空数据库

flushdb 清空当前数据库数据

flushall 清空所有数据库数据

#切换到 15 号库,创建键 k222,值为"2222"
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> set k222 2222
OK
127.0.0.1:6379[15]> keys *
1) "k222"

#切换到10号库,当前10号库有键 k1
127.0.0.1:6379[15]> select 10
OK
127.0.0.1:6379[10]> keys *
1) "k1"

#使用flushdb 命令,清空当前库数据
127.0.0.1:6379[10]> FLUSHDB 
OK
#当前10号库没有数据
127.0.0.1:6379[10]> keys *
(empty list or set)

#切换到15号库和0号库查看,数据都存在。flushdb命令没有影响其他库
127.0.0.1:6379[10]> select 15
OK
127.0.0.1:6379[15]> keys *
1) "k222"
127.0.0.1:6379[15]> select 0
OK
127.0.0.1:6379> keys *
1) "boss"
2) "b11"
3) "b22"
4) "a2"
5) "a3"

-------------------------------------------

#在 0 号库执行 flushall 命令,清空所有库的数据
127.0.0.1:6379> flushall 
OK
#查看,当前库数据为空
127.0.0.1:6379> keys *
(empty list or set)

#切换到15号库查看,数据也为空。flushall 命令影响到了所有的库
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> keys *
(empty list or set)

六、redis的性能管理

1、查看redis的内存

可以进入数据库中查看,也可以在linux 命令行中直接查看

进入数据库执行info memory 查看:

[root@host103 ~]# redis-cli   
127.0.0.1:6379> info memory

直接在linux命令行查看

[root@host103 ~]# redis-cli info memory

查询到的信息详解

指标含义
used_memory由 Redis 分配器分配的内存总量,包含了redis进程内部的开销和数据占用的内存,以字节(byte)为单位,即当前redis使用内存大小。
used_memory_human已更直观的单位展示分配的内存总量。
used_memory_rss向操作系统申请的内存大小,与 top 、 ps等命令的输出一致,即redis使用的物理内存大小。
used_memory_rss_human已更直观的单位展示向操作系统申请的内存大小。
used_memory_peakredis的内存消耗峰值(以字节为单位),即历史使用记录中redis使用内存峰值。
used_memory_peak_human以更直观的格式返回redis的内存消耗峰值
used_memory_peak_perc使用内存达到峰值内存的百分比,used_memory/ used_memory_peak) 100%,即当前redis使用内存/历史使用记录中redis使用内存峰值100%
used_memory_overheadRedis为了维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF重写缓冲区和主从复制的backlog。
used_memory_startupRedis服务器启动时消耗的内存
used_memory_dataset数据实际占用的内存大小,即used_memory-used_memory_overhead
used_memory_dataset_perc数据占用的内存大小的百分比,100%*(used_memory_dataset/(used_memory-used_memory_startup))
total_system_memory整个系统内存
total_system_memory_human以更直观的格式显示整个系统内存
used_memory_luaLua脚本存储占用的内存
used_memory_lua_human以更直观的格式显示Lua脚本存储占用的内存
maxmemoryRedis实例的最大内存配置
maxmemory_human以更直观的格式显示Redis实例的最大内存配置
maxmemory_policy当达到maxmemory时的淘汰策略
mem_fragmentation_ratio碎片率,used_memory_rss/ used_memory。ratio指数>1表明有内存碎片,越大表明越多,<1表明正在使用虚拟内存,虚拟内存其实就是硬盘,性能比内存低得多,这是应该增强机器的内存以提高性能。一般来说,mem_fragmentation_ratio的数值在1 ~ 1.5之间是比较健康的。详解
mem_allocator内存分配器
active_defrag_running表示没有活动的defrag任务正在运行,1表示有活动的defrag任务正在运行(defrag:表示内存碎片整理)详解
lazyfree_pending_objects0表示不存在延迟释放的挂起对象

2、内存碎片率

查看Redis内存使用

92.168.9.236:7001> info memory

----内存碎片率 --------

操作系统分配的内存值used_memory_rss除以Redis使用的内存值used_memoryit算得出

内存碎片是由操作系统低效的分配/回收物理内存导致的(不连续的物理内存分配)

跟踪内存碎片率对理解Redis实例的资源性能是非常重要的:·

  • 内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低·

  • 内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率。需要在redis-cli工具上输入shutdown save命令,并重启Redis服务器。

  • 内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。需要增加可用物理内存或减少Redis内存占用。

3、内存使用率

----内存使用率----

redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换。

避免内存交换发生的方法:

  • 针对缓存数据大小选择安装Redis实例
  • 尽可能的使用Hash数据结构存储
  • 设置key的过期时间

4、内回收key

----内回收key--

  • 内存清理策略,保证合理分配redis有限的内存资源。
  • 当达到设置的最大阀值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除。

配置文件中修改maxmemory-policy属性值:

vim /etc/redis/6379.conf

--598--

maxmemory-policy noeviction

策略有

  • volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据(移除最近最少使用的key,针对设置了TTL的key)
  • volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰(移除最近过期的key)
  • volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰(在设置了TTL的key里随机移除)
  • allkeys-lru:使用IRU算法从所有数据集合中淘汰数据(移除最少使用的key,针对所有的key)
  • allkeys-random:从数据集合中任意选择数据淘汰(随机移除key)
  • noeviction:禁止淘汰数据(不删除直到写满时报错)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值