NoSQL之Redis配置与基本命令

156 阅读15分钟

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

1.1 关系型数据库

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

1.2 非关系型数据库

  • NoSQL(NoSQL=NotonlysQL),意思是“不仅仅是SQL",是非关系型数据库的总称。

  • 除了主流的关系型数据库外的数据库,都认为是非关系型。

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

  • 主流的NOSQL 数据库有Redis、MongBD、 Hbase(分布式非关系型数据库,大数据使用)、Memcached、ElasticSearch(简称ES,索引型数据库)、TSDB(时续型数据库) 等。

1.3 关系型数据库与非关系型数据库的区别

  1. 数据存储方式不同
  • 关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在數据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
  • 与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
  1. 扩展方式不同
  • SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
  • 要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来克服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。
  • 而NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
  1. 对事务性的支持不同
  • 如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的sQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
  • 虽然NoSQL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面。

总结

区别SQLNoSQL
存储方式二维表格(行、列)数据集(文档、键值对(K/V)、图结构)
扩展方式纵向扩展(提升硬件计算能力)横向扩展(扩展节点数量)
事务支持事务控制的细粒度更高、更稳定,更易于回滚事务稳定性较弱

1.4 非关系型数据库产生背景

可用于应对Web2.0纯动态网站类型的三高问题(高并发、高性能、高可用)。

  1. High performance :对数据库高并发读写需求。
  2. Hugestorage :对海量数据高效存储与访问需求。
  3. High Scalability && High Availability :对数据库高可扩展性与高可用性需求。

关系型数据库和非关系型数据库都有各自的特点与应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思路。让关系型数据库关注在关系上和对数据的一致性保障,非关系型数据库关注在存储和高效率上。例如,在读写分离的MySQI数据库环境中,可以把经常访问的数据(即高热数据)存储在非关系型数据库中,提升访问速度。

二、Redis概述

2.1 Redis简介

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

2.2 Redis的优点

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

2.3 Redis的五大数据类型

  • String 字符串型(默认情况下Redis使用的数据类型)
  • List 列表型
  • Hash 哈希(散列)
  • Set 无序集合
  • Sorted Set 有序集合(或称zset)
结构类型结构存储的值结构的读写能力
String可以是字符串、整数、浮点数对整个字符串或者字符串的其中一部分进行操作,对整数的浮点数执行自增或者自减操作
list一个链表,链表上每个节点都包含了一个字符串从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪;读取单个或多个元素,根据值查找或者移除元素
set包含字符串的无序收集器,并且被包含的每个字符串都是独一无二各不相同的添加、获取、移除单个元素,检车一个元素是否存在与集合中,计算交集,并集,差集,从集合里面随机获取元素
hash包含键值对的无序散列添加、获取、移除单个键值对,获取所有键值对
zset字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定添加、获取、删除单个元素,根据分值范围或者成员来获取元素

2.4 Redis的使用场景

  • Redis作为基于内存运行的数据库,是一个高性能的缓存,一般应用在Session缓存、队列、排行榜、计数器、最近最热文章、最近最热评论、发布订阅等。
  • Redis适用于数据实时性要求高、数据存储有过期和淘汰特征的、不需要持久化或者只需要保证弱一致性、逻辑简单的场景。
  • 我们通常会将部分数据放入缓存中,来提高访问速度,然后数据库承担存储的工作。

哪些数据适合放入缓存中?

  • 即时性。例如查询最新的物流状态信息
  • 数据一致性要求不高。例如门店信息,修改后,数据库中已经改了,五分钟后缓存中才是最新的,但不影响功能使用。
  • 访问量大且更新频率不高,例如网站首页的广告信息,访问量大,但是不会经常变化。

2.5 Redis为什么这么快?

  1. Redis是一款纯内存结构,避免了磁盘 I/O 等耗时操作。(基于内存运行)
  2. Redis命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。(单线程模型)
  3. 采用了 I/O 多路复用机制,大大提升了并发效率。(epoll模式)
  • 注:inux系统中有两种I/O类型:磁盘I/O,网络请求I/O。

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

总结 Redis是基于内存运行的;Redis处理线程的命令是单线程处理(减少锁竞争与线程切换的资源消耗);采用了I/O多路复用(可用让单线程处理多个连接请求,减少网络IO的消耗),提高了并发。

三、Redis安装部署

#准备redis软件包到/opt下,版本如下
redis-5.0.7.tar.gz

#关闭防火墙
systemctl stop firewalld
setenforce 0

#安装环境依赖包,确保已有本地仓库并且挂载
yum install -y gcc gcc-c++ make

#解压软件包
cd /opt/  
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/

#编译安装,指定安装路径为/usr/local/redis
make && make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了Makefile 文件,所以在解压完软件包后,不用先执行./configure 进行配置,可直接执行make与make install命令进行安装。

#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件
cd /opt/redis-5.0.7/utils
./install_server.sh

Please select the redis executable path [] /usr/local/redis/bin/redis-server  
#这里默认为/usr/local/bin/redis-server,需要手动修改为/usr/local/redis/bin/redis-server,注意要一次性正确输入

image.png

---------------------- 虚线内是注释 ----------------------------------------------------
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.
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

#当install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为6379
netstat -natp | grep redis

image.png

#把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
ln -s /usr/local/redis/bin/* /usr/local/bin/

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

#编辑配置文件,参数
vim /etc/redis/6379.conf
--70行修改--
bind 127.0.0.1 192.168.142.50     #监听的IP地址(添加本机IP地址)
--93行含义--
port 6379                         #监听端口
--137行含义--
daemonize yes                     #使用守护进程的方式启动,即后台启动
--159行含义--
pidfile /var/run/redis_6379.pid   #Redis的进程号保存位置
--172行含义--
logfile /var/log/redis_6379.log   #日志保存的位置
--187行含义--
databases 16                      #监听库的数量(编号0-15)
#上方设置完成后重启服务
/etc/init.d/redis_6379 restart  #重启redis服务

四、Redis数据库命令工具介绍

4.1 Redis 命令工具

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

4.2 redis-cli 命令行工具

语法:redis-cli -h <主机名> -p <端口号> -a <密码>

选项含义
-h指定远程主机
-p指定Redis服务的端口号
-a指定密码,未设置数据库密码可以省略-a选项(默认情况下未设置密码)

若不添加任何选项表示,使用127.0.0.1:6379连接主机上的Redis数据库

4.3 redis-benchmark 测试工具

① redis-benchmark 测试工具选项及参数

  • redis-benchmark 是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。
  • 基本的测试语法:redis-benchmark [选项] [参数]
选项参数
-h指定服务器主机名
-p指定服务器端口
-s指定服务器 socket
-c指定并发连接数
-n指定请求数
-d以字节的形式指定SET/GET值的数据大小
-kl=keep alive 0=reconnect
-rSET/GET/INCR 使用随机key,SADD使用随机值
-P通过管道传输<numreg>请求
-q强制退出redis,仅显示query/sec值
--csv以CSV格式输出
-l生成循环,永久执行测试
-t仅运行以逗号分隔的测试命令列表
-IIdle模式,仅打开N个idle连接并等待

② 示例1

#向IP地址为192.168.142.50、 端口为6379 的Redis 服务器发送100个并发连接与10000 个请求测试性能。
redis-benchmark -h 192.168.142.50 -p 6379 -c 100 -n 10000
-h 192.168.142.50   #指定本机IP
-p 6379             #指定redis端口号
-c 100              #指定并发连接数为100
-n 10000            #指定请求数为10000

image.png

image.png

示例2

#测试存取大小为100字节的数据包的性能。
redis-benchmark -h 192.168.142.50 -p 6379 -d 100 -q 
#测试大小为100字节的数据包

-d 100    #指定数据包大小为100字节
-q        #退出redis,只显示query或者sec的值

image.png

示例3

#测试本机Redis服务在进行指定操作时的性能
redis-benchmark -t set,lpush -n 10000 -q
#测试redis在请求数为10000使用set,lpush命令时的性能

-t set,lpush     #指定只测试set与lpush两条命令

image.png

五、Redis数据库常用命令

5.1 string数据类型命令

5.1 存放数据(set)与查看数据(get)

    set [键名] [键值]
    # 创建键、并赋予键值,也可以进行值的覆盖(修改)
    get [键名]
    # 查看键名对应的键值

image.png

5.2 查看所有键

    keys *
    #查看目前库中所有类型的键
    

image.png

5.3 查看指定条件键

keys k*
#查看所有以k开头的键

keys k?
#  ? 代表单个任意字符
#查看以k开头且后方只有一个任意字符的键

keys k??
#查看以k开头且后方只有两个任意字符的键

image.png

image.png

5.4 查询是否存在键

EXISTS [键名]
#查看是否有该键名的键

image.png

5.5 删除键

del [键名]
#删除指定的键名

image.png

5.6 查看键的数据类型

type [键名]
#查看指定键的数据类型

image.png

5.7 修改键的名称(重命名)

rename [旧键名] [新键名]
#将已有键的键名修改
#若旧键与新键都具有值,则前者旧键会将新键的值覆盖

image.png

image.png

renamenx [旧键名] [新键名]
#该命令不同于rename,该命令在重命名前,会查看重命名的新键名是否之前已有键值,若新键在之前已经拥有键值,则不进行重命名覆盖操作

image.png

5.8 查看当前库中所有键的数量

dbsize
#查看当前库中键的总数

image.png

5.9 设置查看redis的密码

config set requirepass [密码]
#设置密码后,登录redis后需要输入密码才可以查看库中的内容
config get requirepass [密码]
#查看当前redis的密码
config set requirepass ''
#此命令为设置空密码

auth [密码]
#在设置密码后,登录redis后输入该命令,才可以查看库的内容
redis-cli -a[密码]
#设置密码后,登录redis时使用此命令一样可以查看库中内容

image.png

![ik3u1fbpfcp/e42cbf77bd3c4a98b09f9bc295ddd226~tplv-k3u1fbpfcp-watermark.image?)

image.png

5.10 设置指定键的过期时间

setex [键名] [时间] [键值]
#setex命令用于设置键的过期时间
#过期时间默认单位为秒

ttl [键名]
#查看指定键的生命周期

image.png

六、Redis多数据库常用命令

6.1 多数据库切换

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

select [序号]
#切换数据库,序号范围为0-15
#使用redis-cli连接数据库后,默认使用的是序号为0的数据库

image.png

6.2 多数据库之间数据传输

move [键名] [序号]
#将当前库中的某个键移动到指定序号的库

image.png

6.3 清空当前数据库

flushdb
#清空当前所在的数据库

image.png

6.4 清空所有库

flushall
#清空所有库(0-15)的所有数据

七、Redis五大数据类型常用命令补充

数据类型赋值命令查看键值命令删除键命令
Stringsetgetdel
Listlpushlrangedel
Hashhsethgethdel
Setsaddsmembersdel
Sortde Setzaddzrankdel