redis的概述及安装、使用和管理

135 阅读13分钟

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

关系型数据库

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

非关系型数据库

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

关系型数据库和非关系型数据库区别

数据存储方式不同

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

扩展方式不同

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

对事物性的支持不同

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

非关系型数据库产生背景

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

  • High performance——对数据库高并发读写需求;

  • Huge Storage——对海量数据高效存储与访问需求;

  • High Scalability and High Availability——对数据库高可扩展性与高可用性需求。 关系型数据库和非关系型数据库都有各自的特点与应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思路:

    关系型数据库关注在关系和对数据的一致性保障上;
    
    非关系型数据库关注在存储和高效率上。
    
    例如:在读写分离的Mysql数据库环境中,可以把经常访问的数据存储在非关系型数据库中,提升访问速度。
    

Redis概述

简介

  • Redis(远程字典服务器)是一个开源的、使用c语言编写的 NoSQL数据库。

  • Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。

  • Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠主进程的执行效率。

优点

  • 具有极高的数据读写速度:数据读取的速度最高可达到110000 次/s,数据写入速度最高可达到 81000 次/s。

  • 支持丰富的数据类型:支持 key-value、Strings、Lists、Hashes、Sets 及 Sorted Sets等数据类型操作。

  • 支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

  • 原子性:Redis 所有操作都是原子性的。

  • 支持数据备份:即支持 master-salve 模式的数据备份。

image.png

Redis读写快的原因

  • Redis基于内存运行,避免了磁盘I/O等耗时操作。
  • Redis命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。
注:在Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的。
  • 采用了I/O多路复用机制,减少网络I/O消耗,大大提升了并发效率。

适用场景

  • Redis作为基于内存运行的数据库,是一个高性能的缓存,一般应用在session缓存、队列

  • 、排行榜、计数器、最近最热文章、最近最热评论、发布订阅等。

  • Redis 适用于数据实时性要求高、数据存储有过期和淘汰特征的、不需要持久化或者只需要保证弱一致性、逻辑简单的场景。

我们通常会将部分数据放入缓存中,来提高访问速度,然后数据库承担存储的工作

哪些数据适合放入缓存中

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

Redis安装配置

#将安装包放在/opt下
cd /opt
tar xf redis-5.0.7.tar.gz
cd redis-5.0.7/

#编译
make

#安装到指定目录
make install PREFIX=/usr/local/redis

微信截图_20221111085109.png

还需要到安装包中的utils/下,执行install_server.sh

微信截图_20221111091349.png

再在配置文件/etc/redis/6379.conf中修改监听地址

微信截图_20221111095605.png

微信截图_20221111095838.png

redis的使用

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

1.命令行工具redis-cli(登录

微信截图_20221111101036.png

2.测试工具redis-benchmark(测试)

redis-benchmark [选项] [选项值]
                  -h        指定服务器主机名
                  -p        指定服务器端口
                  -s        指定服务器 socket
                  -c        指定并发连接数
                  -n        指定请求数
                  -d        以字节的形式指定SET/GET值的数据大小
                  -k        1代表keep alive保持连接 ;0代表reconnect重连
                  -r         SET、GET、INCR 使用随机key ;SADD使用随机值
                  -P        通过管道传输<numreg>请求
                  -q         强制退出redis 仅显示query/sec值
                  --csv    以CSV格式(,分割字段的文本)输出
                  -l          生成循环,永久执行测试
                  -t          仅运行以逗号分隔的测试命令列表
                  -I          Idle模式(仅打开N个idle连接并等待)

#向IP地址为192.168.10.40、端口为6379的Redis服务器发送100个并发连接与100000个请求测试性能
redis-benchmark -h 192.168.10.40 -p 6379 -c 100 -n 100000

微信截图_20221111110404.png

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

微信截图_20221111110715.png

#测试本机上Redis服务在进行set与lpush操作时的性能
redis-benchmark -t set,lpush -n 100000 -q

微信截图_20221111110935.png

redis命令的使用

(1)存入键值对

SET 键 值

微信截图_20221111111119.png

(2)获取键的值

GET 键

微信截图_20221111111229.png

(3)判断键的数据类型(redis默认数据类型为string)

TYPE 键

微信截图_20221111111514.png

Redis中的五大数据类型

名称类型
String字符串
List列表
Hash散列
Set无序集合
Sorted Set有序集合

(4)查看键

KEYS *                  查看所有键

KEYS 通配符        查看通配符匹配的指定键

微信截图_20221111112045.png

(5)判断键是否存在

EXISTS 键

微信截图_20221111112256.png

(6)删除键

DEL 键

微信截图_20221111112519.png

(7)修改键名

RENAME 原键名 新键名     

若要更改的新键名已存在,则会覆盖此键名的值(建议改名前先exists一下)或使用:

RENAMENX 原键名 新键名         // 修改前判断新键名是否存在,存在则返回0,不存在则返回1并执行修改

微信截图_20221111113102.png

微信截图_20221112133134.png

(8)统计键数量

DBSIZE

微信截图_20221112170513.png

(9)设置密码

CONFIG SET REQUIREPASS 密码

微信截图_20221112170830.png

AUTH 密码        登入后做验证

微信截图_20221112170949.png

(10)查看当前密码

 CONFIG GET REQUIREPASS

微信截图_20221112171056.png

(11)删除密码

 CONFIG SET REQUIREPASS ' '

微信截图_20221112171315.png

Redis多库常用命令

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

(1)切换数据库

 SELECT 库号

微信截图_20221112174858.png

(2) 将数据移动到指定库

MOVE 键 库号

微信截图_20221112174858.png

(2) 将数据移动到指定库

MOVE 键 库号

微信截图_20221113140832.png

Redis性能管理

查看内存使用

info memory

微信截图_20221113141050.png

mem fragmentation _ratio        #内存碎片率= used memory_rss / used memoryused

memory _rss                            #是Redis向操作系统申请的内存。
used memory                           #是Redis中的数据占用的内存。
used memory peak                  # redis内存使用的峰值。

清理内存碎片

(1)内存碎片如何产生

Redis内部有自己的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。

Redis中的值删除的时候,并没有把内存直接释放,交还给操作系统,而是交给了Redis内部有内存管理器。

Redis中申请内存的时候,也是先看自己的内存管理器中是否有足够的内存可用。

Redis的这种机制,提高了内存的使用率,但是会使Redis中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。

(2)内存碎片率

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

  • 内存碎片率在1到1.5之间是正常的,这个值表示内存碎片率比较低,也说明Redis没有发生内存交换。
  • 内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率。
  • 内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。需要增加可用物理内存或减少Redis内存占用。

(3)清理内存碎片

Redis版本4.0以下

需要在 redis-cli工具上输入shutdown save 命令,让Redis数据库执行保存操作并关闭Redis服务,再重启服务器。Redis服务器重启后,Redis会将没用的内存归还给操作系统,碎片率会降下来。

Redis4.0版本以上

执行 config set activedefrag yes,开启自动碎片清理; 执行 memory purge,手动碎片清理。

内存使用率

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

避免内存交换发生的方法

  • 针对缓存数据大小选择安装 Redis实例
  • 尽可能的使用Hash数据结构存储
  • 设置key的TTL生命周期(setex 键名 时间(s) 值)

内回收key

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

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

微信截图_20221113142534.png

volatile-lru #使用LRU算法从已设置过期时间的数据集合中淘汰数据(移除最近最少使用的key,针对设置了TTL的key)

volatile-ttl #从已设置过期时间的数据集合中挑选即将过期的数据淘汰(移除最近过期的key)

volatile-random #从已设置过期时间的数据集合中随机挑选数据淘汰(在设置了TTL的key里随机移除)

allkeys-lru #使用LRU算法从所有数据集合中淘汰数据(移除最少使用的key,针对所有的key)

allkeys-random #从数据集合中任意选择数据淘汰(随机移除key)

noenviction #禁止淘汰数据(不删除直到写满报错)

总结

1.常见的关系型数据库?

oracle、MySQL、SQL Server、Microsoft Access、DB2、PostgreSQL

2.常见的非关系型数据库?

Redis、MongBD、Hbase、Memcached、ElasticSearch(索引数据库)、TSDB(时间序列数据库)

3.什么是Redis?

Redis(远程字典服务器)是一个开源的、使用c语言编写的NosQL数据库。

Redis 基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或的一环。

4.为什么需要Redis?

Redis 适用于数据实时性要求高、数据存储有过期和淘汰特征的、不需要持久化或者只需要保证弱一致性、逻辑简单的场景。

5.Redis如何性能测试?

使用 redis-benchmark 测试工具。

6.Redis默认数据类型:string

7.Redis为什么这么快?

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

8.Redis数据库命令

1)常用名命令

set 、get: 存放、获取数据

del: 删除键

keys: 获取key,可以结合通配符 * 和 ?

exists: 判断key是否存在

type: 查看数据类型

rename和renamenx: 重命名的两种,后者会进行判断,存在则不改

dbsize: 查看当前数据库中key的数目

2)多数据库操作

select 序号 : 切换库名(16个数据库,数据库名称是用数字0-15)

move 键值 序号: 多数据库间移动数据

FLUSHDB : 清空当前数据库数据

FLUSHALL : 清空所有数据库的数据,慎用!!!