Nosql--Redis

时间:2022-12-05 18:59:09

一、Nosql概述

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。 NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。Nosql不遵循SQL标准、 不支持ACID、 远超于SQL的性能。

Nosql适用于对数据高并发的读写,对海量数据的读写,对数据高可扩展性。

Nosql不适用场景:

需要事务支持

基于sql的结构化查询存储,处理复杂的关系,需要即席查询

Nosql不需要预先建库建表定义数据存储表结构,每条记录可以有不同的数据类型和字段个数(如文字、图片、视频、音乐等)。

二、关系型数据库与非关系型数据库的区别

1、数据存储方式不同

关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。

非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。

2、扩展方式不同

SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。

要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来克服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。

NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。

3、对事务性的支持不同

如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。

虽然NoSQL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面。

非关系数据库

1、数据保存在缓存中,利于读取速度/查询数据

2、架构中位置灵活

3、分布式、扩展性高

例-->数据库-->集合(collection)-->键值对(key-value)

关系数据库

1、安全性高(持久化)

2、事务处理能力强

3、任务控制能力强

4、可以做日志备份、恢复、容灾的能力更强一点。

例-->数据库-->表(table)-->记录行(row)、数据字段(column)------>存储数据

三、Redis概述

1、redis概述

Redis 是一个开源的 key-value 存储系统。

它支持存储的 value 类型相对更多,包括 string(字符串)、 list(链表)、set(集合)、zset(sorted set --有序集合)和 hash(哈希类型)。

这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作, 而且这些操作都是原子性的。

在此基础上,Redis 支持各种不同方式的排序。

为了保证效率,数据都是缓存在内存中。

Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。

并且在此基础上实现了 master-slave(主从)同步。

​2、redis应用场景

1.配合关系型数据库做高速缓存

-->高频次,热门访问的数据,降低数据库 IO

-->分布式架构,做 session 共享

2. 多样的数据结构存储持久化数据

四、Redis安装

Redis官方网站:​​http://redis.io​

Redis中文官方网站:​​http://redis.cn/​

1、安装版本

5.0.7 for Linux (redis-5.0.7.tar.gz)

2、安装步骤

2.1.下载安装最新版的gcc编译器安装C语言的编译环境

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

2.2下载redis-5.0.7.tar.gz到/opt下

2.3解压tar包

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

2.4解压完进入redis-5.0.7目录下执行make命令

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

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

[root@localhost redis-5.0.7]# cd utils/
[root@localhost utils]# ./install_server.sh
###执行脚本一路回车到下面这行,在括号后面输入路径后继续回车
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port : 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!

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/bin/redis-cli                 #客户端命令工具

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

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

2.7查看redis服务端口状态

[root@localhost utils]# netstat -natp | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 28274/redis-server

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     #状态

2.8修改配置文件/etc/redis/6379.conf 参数

[root@localhost utils]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.246.77 #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行指定日志文件

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

3、查看安装目录

[root@localhost utils]# ll /usr/local/redis/bin/.
total 32788
-rwxr-xr-x. 1 root root 4367640 Dec 5 03:45 redis-benchmark
-rwxr-xr-x. 1 root root 8127288 Dec 5 03:45 redis-check-aof
-rwxr-xr-x. 1 root root 8127288 Dec 5 03:45 redis-check-rdb
-rwxr-xr-x. 1 root root 4808824 Dec 5 03:45 redis-cli
lrwxrwxrwx. 1 root root 12 Dec 5 03:45 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8127288 Dec 5 03:45 redis-server

redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何

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

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

redis-sentinel:Redis 集群使用

redis-server:Redis 服务器启动命令

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 -h 192.168.246.77 -p 6379

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.246.77、端口为 6379 的 Redis 服务器发送 100 个并发连接与 100000 个请求测试性能

redis-benchmark -h 192.168.246.77 -p 6379 -c 100 -n 100000

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

redis-benchmark -h 192.168.246.77 -p 6379 -q -d 100

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

redis-benchmark -t set,lpush -n 100000 -q

五、Redis数据库常用命令

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

get:获取数据,命令格式为 get key

127.0.0.1:6379> set teacher zhangsan

OK

127.0.0.1:6379> get teacher

"zhangsan"

KEYS:查看符合模板的所有key

SET:添加或者修改已经存在的一个String类型的键值对

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

127.0.0.1:6379> set k1 1

127.0.0.1:6379> set k2 2

127.0.0.1:6379> set k3 3

127.0.0.1:6379> set v1 4

127.0.0.1:6379> set v5 5

127.0.0.1:6379> set v22 5

127.0.0.1:6379> KEYS *    #查看当前数据库中所有键

127.0.0.1:6379> KEYS v*    #查看当前数据库中以 v 开头的数据

127.0.0.1:6379> KEYS v?    #查看当前数据库中以 v 开头后面包含任意一位的数据

127.0.0.1:6379> KEYS v??    #查看当前数据库中以 v 开头 v 开头后面包含任意两位的数据

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

127.0.0.1:6379> exists teacher  #判断 teacher 键是否存在

(integer) 1       # 1 表示 teacher 键是存在

127.0.0.1:6379> exists tea

(integer) 0       # 0 表示 tea 键不存在

DEL:删除一个指定的key

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

127.0.0.1:6379> keys *

127.0.0.1:6379> del v5

127.0.0.1:6379> get v5

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

127.0.0.1:6379> type k1

string

RENAME:对已有KEY重命名

# rename 命令是对已有 key 进行重命名。(覆盖)

命令格式:rename 源key 目标key

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

127.0.0.1:6379> keys v*

1) "v1"

2) "v22"

127.0.0.1:6379> rename v22 v2

OK

127.0.0.1:6379> keys v*

1) "v1"

2) "v2"

127.0.0.1:6379> get v1

"4"

127.0.0.1:6379> get v2

"5"

127.0.0.1:6379> rename v1 v2

OK

127.0.0.1:6379> get v1

(nil)

127.0.0.1:6379> get v2

"4"

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

命令格式:renamenx 源key 目标key

127.0.0.1:6379> keys *

127.0.0.1:6379> get teacher

"zhangsan"

127.0.0.1:6379> get v2

"4"

127.0.0.1:6379> renamenx v2 teacher

(integer) 0

127.0.0.1:6379> keys *

127.0.0.1:6379> get teacher

"zhangsan"

127.0.0.1:6379> get v2

"4"

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

127.0.0.1:6379> dbsize

密码设置命令

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

127.0.0.1:6379> config set requirepass 123456

#使用config get requirepass命令查看密码(一旦设置密码,必须先验证通过密码,否则所有操作不可用)

127.0.0.1:6379> auth 123456

127.0.0.1:6379> config get requirepass

六、Redis 多数据库常用命令 

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

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

1、多数据库间切换

命令格式:select 序号

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

127.0.0.1:6379> select 10   #切换至序号为 10 的数据库

127.0.0.1:6379[10]> select 15  #切换至序号为 15 的数据库

127.0.0.1:6379[15]> select 0   #切换至序号为 0 的数据库

2、多数据库间移动数据

格式:move 键值 序号

127.0.0.1:6379> set k1 100

OK

127.0.0.1:6379> get k1

"100"

127.0.0.1:6379> select 1

OK

127.0.0.1:6379[1]> get k1

(nil)

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

OK

127.0.0.1:6379> get k1        #查看目标数据是否存在

"100"

127.0.0.1:6379> move k1 1   #将数据库 0 中 k1 移动到数据库 1 中

(integer) 1

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

OK

127.0.0.1:6379[1]> get k1      #查看被移动数据

"100"

127.0.0.1:6379[1]> select 0

OK

127.0.0.1:6379> get k1          #在数据库 0 中无法查看到 k1 的值

(nil)

3、清除数据库内数据

FLUSHDB :清空当前数据库数据

FLUSHALL :清空所有数据库的数据

相关文章