非关系型数据库Redis部署与常用命令

时间:2024-04-13 19:08:55

前言

Redis是一个高性能的开源内存数据库,常用于缓存、会话存储和实时数据处理,它是一款非关系型数据库。在生产环境中,Redis通过将数据存储在内存中以及支持多种数据结构,提供了快速的读写能力,并且可通过持久化功能确保数据安全。其作为消息代理系统还能支持发布/订阅模式,使得它成为构建实时通信和事件驱动架构的理想选择。

目录

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

1. 关系型数据库

2. 非关系型数据库

3. 区别

二、Redis 简介

1. 概述

2. 优缺点

3. redis 特点(为什么速度快)

三、Redis 部署

1. 环境准备

2. 编译安装

3. 执行脚本文件

4. 软链接

5. 登录

四、服务控制与配置 

1. Redis 服务控制

2. 常用配置文件参数

3. 命令工具

3.1 redis-cli 命令行工具

3.2 redis-benchmark 测试工具 

五、数据库常用命令

1. set 与 get 

2. keys

3. exists 

4. del

5. type

6. rename

7. renamenx

8. dbsize

9. 设置密码

六、Redis 多数据库常用命令

1. select

2. move

3. 清除数据库内数据


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

1. 关系型数据库

关系型数据库是所有实体之间联系的集合,其存储结构是由二维表及其之间的联系所组成的一个数据组织,一般面向于记录。SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。常见关系型数据库:Oracle、MySQL、SQLserver等。MySQL 相关介绍请参考:关系型数据库MySQL_Fang_Qianling的博客-****博客

2. 非关系型数据库

NoSQL(NoSQL = Not Only SQL ),意思是“不仅仅是 SQL”,是非关系型数据库的总称。不需要预先建库建表定义数据存储表结构,以 key-values(键值对)存储,结构不固定,可以减少一些时间和空间的开销。常见的非关系型数据库:Redis、Memcached、mongDB等。Memcached 介绍请参考:Memcached非关系型数据库介绍-****博客

3. 区别

区别 关系型数据库 非关系型数据库
数据结构 二维表 无固定结构
查询语句 SQL通用结构化查询语句,可用于复杂查询 针对特定的数据模型特定的查询语句
存储位置 硬盘 内存,后期支持存储在硬盘
扩展方式 纵向,比如说硬件中添加内存 横向,天然分布式

二、Redis 简介

1. 概述

Redis 是 nosql 非关系型数据库,是一款基于内存运行并支持持久化的服务程序,采用 key-values(键值对)存储;是单进程模型,即一台机器可同时启动多个 redis 进程(一般一台机器做2-3个进程),可以做分布式集群架构。 

2. 优缺点

优点:

  • 极高的数据读写:读最高110000次/秒,写最高81000次/秒
  • 数据类型丰富:支持 key-value、Strings、Lists、Hashes、Sets 及 Sorted Sets 等数据类型操作
  • 支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
  • 原子性:Redis 所有操作都是原子性的,保证两个客户端同时访问一个键,其中一个会先执行完自己的操作后再由另一个执行,避免并发问题
  • 支持数据备份:即 master-salve 模式的数据备份

缺点:

  • 由于 Redis 是基于内存的,所以它的内存消耗比较大。如果你的数据量比较大,可能需要大量的内存
  • 由于 Redis 是基于内存的,所以如果服务器宕机,可能会导致数据丢失。虽然 Redis 支持数据的持久化,但是这并不能完全解决数据一致性的问题

3. redis 特点(为什么速度快)

① 纯内存结构

② 命令处理的核心模块是单线程,减少了锁竞争

  • 锁竞争:当多个线程或进程试图同时访问某个共享资源,但由于彼此之间的执行顺序不确定,可能会导致彼此之间互相等待对方释放资源的情况,从而造成程序无法继续执行下去的情况。这种情况下,系统可能会出现死锁或活锁等问题,影响程序的正常运行

③ 采用 I/O 多路复用(异步非阻塞)机制,大大提升了并发效率

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

三、Redis 部署

企业中一般会使用5版本的 redis,这里选择 redis-5.0.7 源码包进行安装。

1. 环境准备

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y gcc gcc-c++ make
[root@localhost ~]# cd /opt
[root@localhost opt]# tar zxvf redis-5.0.7.tar.gz

2. 编译安装

[root@localhost opt]# cd  /opt/redis-5.0.7/
[root@localhost opt]# cd  /opt/redis-5.0.7/
由于Redis源码包中直接提供了 Makefile 文件,所以在解压完软件包后,不用先执行 ./configure 进行配置,可直接执行 make 与 make install 命令进行安装。
[root@localhost redis-5.0.7]# make -j 2
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis install

3. 执行脚本文件

[root@localhost redis-5.0.7]# cd /opt/redis-5.0.7/utils
[root@localhost utils]# ./install_server.sh
# 执行软件包提供的 install_server.sh 脚本文件设置 Redis 服务所需要的相关配置文件
一直回车
Please select the redis executable path /usr/local/redis/bin/redis-server # 这里需要手动修改

4. 软链接

[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost utils]# netstat -natp | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      8027/redis-server 1
# 当 install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为 6379

5. 登录

格式:
redis-cli -h host -p port -a password
# -h:指定远程主机
# -p:指定redis服务的端口号
# -a:指定密码
[root@localhost ~]# redis-cli   # 这里是本地127.0.0.1默认端口号可以省略
127.0.0.1:6379> 

四、服务控制与配置 

1. 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	#状态
# 也可以使用 systemctl 管理

2. 常用配置文件参数

/etc/redis/6379.conf
bind 127.0.0.1 192.168.190.100		#70行,添加 监听的主机地址
port 6379							#93行,Redis默认的监听端口
daemonize yes						#137行,启用守护进程
pidfile /var/run/redis_6379.pid		#159行,指定 PID 文件
loglevel notice						#167行,日志级别
logfile /var/log/redis_6379.log		#172行,指定日志文件

3. 命令工具

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

3.1 redis-cli 命令行工具

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

3.2 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:通过管道传输<numreq>请求
# -q:强制退出 redis。仅显示 query/sec 值
# --csv:以 CSV 格式输出
# -l:生成循环,永久执行测试
# -t:仅运行以逗号分隔的测试命令列表
# -I:Idle 模式。仅打开 N 个 idle 连接并等待

示例:

向 IP 地址为 192.168.190.23、端口为 6379 的 Redis 服务器发送 10 个并发连接与 1000 个请求测试性能 

[root@localhost ~]# redis-benchmark -h 192.168.190.100 -p 6379 -c 10 -n 1000
……
====== MSET (10 keys) ======
  1000 requests completed in 0.02 seconds
  10 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
52631.58 requests per second

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

[root@localhost ~]# redis-benchmark -h 192.168.190.100 -p 6379 -q -d 100
PING_INLINE: 60716.46 requests per second
PING_BULK: 63694.27 requests per second
SET: 64308.68 requests per second
GET: 64977.26 requests per second
……

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

[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
SET: 65316.79 requests per second
^C ……

五、数据库常用命令

1. set 与 get 

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

示例:

127.0.0.1:6379> set student lisi
OK
127.0.0.1:6379> get student
"lisi"

2. keys

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

示例:

127.0.0.1:6379> set a1 1
127.0.0.1:6379> set a2 2
127.0.0.1:6379> set a11 11
127.0.0.1:6379> set b1 3
127.0.0.1:6379> set b22 123
# 存放一些数据

127.0.0.1:6379> keys *    # 查看所有数据
1) "a11"
2) "student"
3) "a1"
4) "b22"
5) "a2"
6) "b1"

127.0.0.1:6379> keys a*   # 查看你以a开头的所有数据
1) "a11"
2) "a1"
3) "a2"

127.0.0.1:6379> keys a?   # 以a开头第一个数值
1) "a1"
2) "a2"

127.0.0.1:6379> keys b??  # 以b开头两个任意数据
1) "b22"

3. exists 

可以判断键值是否存在。

示例:

127.0.0.1:6379> exists class
(integer) 0                    # 0代表不存在
127.0.0.1:6379> exists student
(integer) 1                    # 1代表存在

4. del

可以删除当前数据库的指定 key。

示例:

127.0.0.1:6379> keys *      # 查看所有键数据
1) "a11"
2) "student"
3) "a1"
4) "b22"
5) "a2"
6) "b1"
127.0.0.1:6379> del student # 删除键
(integer) 1
127.0.0.1:6379> get student # 获取数据
(nil)

5. type

可以获取 key 对应的 value 值类型。

示例:

127.0.0.1:6379> type a1
string

5个数据类型:

① String

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

② List

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

③ Hash (散列类型) 

  • hash用于存储对象。可以采用这样的命名方式(hash格式):对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值

④ set(无序集合)

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

⑤ Sorted Set (zset、有序集合) 

  • 有序集合,元素类型为Sting,元素具有唯一性, 不能重复
  • 每个元素都会关联–个double类型的分数score(表示权重),可以通过权重的大小排序,元素的score可以相同

6. rename

命令是对已有 key 进行重命名(覆盖),使用 rename 命令进行重命名时,无论目标 key 是否存在都进行重命名,且源 key 的值会覆盖目标 key 的值。

示例:

格式:
> rename 源key 目标key

127.0.0.1:6379> keys a*
1) "a11"
2) "a1"
3) "a2"
127.0.0.1:6379> rename a2 a2
127.0.0.1:6379> keys a*
1) "a22"
2) "a11"
3) "a1"

127.0.0.1:6379> rename a11 a22
OK
127.0.0.1:6379> keys a*
1) "a22"
2) "a1"
127.0.0.1:6379> get a11
(nil)
127.0.0.1:6379> get a22   # 值覆盖
"11"

7. renamenx

对已有 key 进行重命名,并检测新名是否存在,如果目标 key 存在则不进行重命名(不覆盖)。

示例:

格式:
> renamenx 源key 目标key

127.0.0.1:6379> keys b*
1) "b22"
2) "b1"
127.0.0.1:6379> renamenx b3 b1   # b3源key不存在
(error) ERR no such key
127.0.0.1:6379> renamenx b1 b3
(integer) 1
127.0.0.1:6379> keys b*
1) "b3"
2) "b22"

127.0.0.1:6379> renamenx b3 b22
(integer) 0                     # 目标key的名字已存在,不支持将源key重命名该名字

8. dbsize

查看当前数据库中 key 的数目。

示例:

127.0.0.1:6379> keys *
1) "a22"
2) "b3"
3) "a1"
4) "b22"
127.0.0.1:6379> dbsize
(integer) 4

9. 设置密码

使用config set requirepass yourpassword 命令设置密码。

示例:

127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.  # 一旦设置密码,必须先验证通过密码,否则所有操作不可用
127.0.0.1:6379> auth 123456
127.0.0.1:6379> keys *
1) "a22"
2) "b3"
3) "a1"
4) "b22"

六、Redis 多数据库常用命令

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

1. select

多数据库间切换,使用 redis-cli 连接 Redis 数据库后,默认使用的是序号为 0 的数据库。

示例:切换数据库

格式:
select 序号

127.0.0.1:6379> select 2
127.0.0.1:6379[2]> select 16
(error) ERR DB index is out of range # 16个数据库,0-15
127.0.0.1:6379[2]> select 15
127.0.0.1:6379[15]> select 0

2. move

多数据库间移动数据。

示例:

格式:
move 键值 序号

127.0.0.1:6379> get a1
"1"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get a1    # 此时1库目标数据不存在
(nil)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> move a1 1    # 移动键值
(integer) 1
127.0.0.1:6379> get a1       # 此时0库目标数据不存在
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get a1    # 此时1库目标数据存在
"1"

3. 清除数据库内数据

flushdb:清空当前数据库数据
flushall :清空所有数据库(0-15)的数据,慎用!

示例:

127.0.0.1:6379> keys *
1) "a22"
2) "b3"
3) "b22"
127.0.0.1:6379> flushdb  # 清空当前数据库0库数据
127.0.0.1:6379> keys *
(empty list or set)