redis详情-----介绍、优化。。。。
更新:HHH   时间:2023-1-7


一、SQL和NoSQL

1、SQL

1、一个结构化的数据库,创建在关系模型基础上,一般面向于记录;
2、包括 Oracle 、Mysql 、 SQL Server 、Microsoft Access 、DB2 等。
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、对于高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

2、NoSQL

1、除了主流的关系型数据库以外的数据库,都认为是非关系型的;
2、包括 Redis 、 MongBD 、 Hbase 、 CouhDB 、Memcache 等;
3、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
1、格式灵活:存储数据的格式可以是 key-value(键-值)形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型;
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、不支持事务,容错率低;
3、数据结构相对复杂,复杂查询方面稍欠。

3、NoSQL产生的背景介绍

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

二、redis

(1)Redis 基于内存运行并支持持久化;
(2)采用 key-value (键值对) 的存储形式;
(3)优点:

具有极高的数据读写速度;
支持丰富的数据类型;
支持数据的持久化;
原子性;
支持数据备份

(4)Redis 和 Memcache 的比较:
1、存储方式:
Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;
Redis有部份存在硬盘上,这样能保证数据的持久性。
2、数据支持类型:
Memcache对数据类型支持相对简单;
Redis有复杂的数据类型。
3、使用底层模型不同:
它们之间底层实现方式以及与客户端之间通信的应用协议不一样;
Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、value大小:
redis最大可以达到1GB,而memcache只有1MB。
(5)使用redis有哪些好处?
1、速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
2、支持丰富数据类型,支持string,list,set,sorted set,hash
3、支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
4、丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除。
redis 相比 memcached 的优势:

memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型;
redis的速度比memcached快很多;
redis可以持久化其数据;
Memcache 支持结构化,但是 Redis支持结构化和非结构化。

三、安装部署redis

1、安装redis环境
最新安装包:redis-5.0.7.tar.gz
系统:Linux
2、操作步骤

第一步:通过远程挂载的办法将 windows上的安装包下载到 Linux本地。
第二步:安装编译工具

yum install gcc gcc-c++ make -y

第三步:解压

tar zxvf redis-5.0.7.tar.gz -C /opt/

第四步:安装
cd redis-5.0.7/

make
make PREFIX=/usr/local/redis install

第五步:创建软连接

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

第五步:启动安装脚本,查看端口状态

cd  /redis-5.0.7/utils/

./install_server.sh        ###启动脚本,注意:这步一路回车到底就行了
将最后一个文件路径改为: /usr/local/redis/bin/redis-server

netstat -natp | grep 6379

除此之外,还可以用 redis_6379 控制其开启关闭:

/etc/init.d/redis_6379 stop       //关闭

/etc/init.d/redis_6379 start      //开启

/etc/init.d/redis_6379 restart    //重启

redis-cli远程连接操作:

1、先修改配置文件,添加主机的IP地址

vim /etc/redis/6379.conf

bind 127.0.0.1 192.168.220.131
###添加主机的IP地址,不添加监听地址则无法连接

如图所示:

2、重启服务
3、远程连接:

redis-cli -h 192.168.220.131 -p 6379
//-h:指定主机IP地址,-p:指定端口

四、redis配置文件

配置参数 ( /etc/redis/6379.conf ):

五、redis数据库常用命令

1、常用命令
(1)来连接本地数据库

/usr/local/redis/bin/redis-cli

(2)连接远程数据库

redis-cli  -h  192.168.220.131  -p  6379

(3)存放数据:set
(4)获取数据:get

2、key命令
(1)keys :获取符合规则的键值列表

>keys *        //查看当前数据库中所有的键

>keys v*       //查看当前数据库中以v开头的键

>keys v?       //查看当前数据库中以v开头后面包含任意一个字符的键

>keys v??      //查看当前数据库中以v开头后面包含任意二个字符的键

(2)exists:判断键值是否存在

(3)del :删除当前数据库的指定 key

(4)type :获取 key 对应的 value 值类型

(5)rename(覆盖)/ renamenx(不覆盖):对已有的 key 进行重命名:

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

(7)redis-benchmark 测试工具:

redis-benchmark -h 192.168.220.131 -p  6379  -c 100 -n 100000
//向IP地址为192.168.220.131、端口为6379的redis服务器发送 100个并发连接与 100000个请求测试性能
redis-benchmark -h 192.168.220.131 -p 6379 -q -d 100
//测试存取大小为100字节的数据包的性能

3、Redis 多数据操作
(1)Redis 支持多数据库,默认支持16个数据库,0-15 命名;
(2)多数据相互独立,互不干扰;
(3)多数据常用命令;
1、select:多数据库间的切换(默认是在数据库0中)

2、move:多数据库间移动数据

3、flushdb:清除数据库内数据

六、Redis 持久化:

(1)持久化概述:

Redis 是运行在内存中,内存中的数据断电就会丢失;
为了能重用 Redis 数据,或者防止系统故障,需要将 Redis 中的数据写入到磁盘空间中,即持久化。

(2)持久化分类:
1、RDB 方式:创建快照的方式获取某一时刻 Redis 中所有数据的副本。
2、AOF 方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化。
(3)RDB持久化:
1、它是 Redis的默认持久化方式,默认文件名为 dump.rdb
2、触发条件:
—在指定的时间间隔内,执行指定次数的写操作(配置文件控制);
—执行 save 或者是 bgsave (异步)命令;
—执行 flushall 命令,清除数据库所有数据;
—执行 shutdown 命令,保证服务器正常关闭且不丢失任何数据。

3、优缺点:

适合大规模的数据恢复;
如果业务对数据完整性和一致性要求不高,RDB 是很好的选择;
数据的完整性和一致性不高;
备份时占用内存。

4、通过 RDB 文件恢复数据:

将 dump.rdb 文件拷贝到 redis 的安装目录的 bin 目录下,重启 redis 服务即可。
5、配置文件选项

vim /etc/redis/6379.conf

save 900 1              
save 300 10
save 60 10000
//900秒之内至少一次写操作、300秒之内至少发生10次写操作、60秒之内发生至少10000次写操作,只要满足其一都会触发快照操作,注释所有的save项表示关闭 RDB

dbfilename dump.rdb         // RDB文件名称
dir /var/lib/redis/6379     // RDB文件路径
rdbcompression yes          // 是否进行压缩

(4)AOF 持久化:

Redis 默认是不开启的;
弥补 RDB 的不足(数据的不一致性);
采用日志的形式来记录每个写操作,并追加到文件中;
Redis 重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

1、根据 AOF 文件恢复数据:

将 appendonly.aof 文件拷贝到 redis 的安装目录的 bin 目录下,重启 redis 访问即可。
2、配置文件选项

vim /etc/redis/6379.conf

appendonly yes                     //开启AOF持久化
appendfilename "appendonly.aof"    //AOF文件名称

# appendfsync always    
appendfsync everysec
#appendfsync no
//解释:always:同步持久化,每次发生数据变化会立刻写入磁盘;
       everysec:默认推荐,每秒异步记录一次(默认值);
       no:不同步,交给操作系统决定如何同步。

aof-load-truncated yes         //忽略最后一条可能存在问题的指令


3、AOF 的重写机制:

AOF 的工作原理是将写操作追加到文件中,文件的冗余会越来越多;
当 AOF 文件的大小超过所设定的阈值时,Redis 就会对 AOF 文件的内容压缩;

4、AOF 的重写原理:

Redis 会 fork 出一条新进程,读取内存中的数据(并没有读取旧文件),并重新到一个临时文件中,最后替换旧的 aof 文件
5、AOF 的重写配置:

vim /etc/redis/6379.conf

在日志进行 BGREWRITEAOF 时,如果设置为 yes 表示新写操作不进行同步 fsync,只是暂存在缓冲区里,避免造成磁盘 IO 操作冲突,等重写完成后在写入。redis 中默认为 no

no-appendfsync-on-rewrite no
//当前 AOF文件大小是上次日志重写时 AOF 文件大小两倍时,发生 BGREWRITEAOF操作

auto-aof-rewrite-percentage 100
//当前 AOF文件执行 BGREWRITEAOF命令的最小值,避免刚开始启动 redis 时由于文件尺寸较小导致频繁的 BGREWRITEAOF

auto-aof-rewrite-min-size 64mb

七、Redis性能管理

1、内存碎片率
(1)操作系统分配的内存值 used_memory_rss 除以 redis 使用的内存值 used_memory 计算得出的;
(2)内存碎片是由操作系统低效的分配/回收物理内存导致的;

不连续的物理内存分配

(3)跟踪内存碎片率对理解 redis 实例的资源性能是非常重要的;

-----内存碎片率稍大于 1 是合理的,这个值表示内存碎片率比较低;
-----内存碎片率超过 1.5 ,说明 redis 消耗了实际需要物理内存的 150% ,其中 50% 是内存碎片率;
-----内存碎片率低于 1 的,说明 Redis 内存分配超出了物理内存,操作系统正在进行内存交换。



2、内存使用率
(1)redis 实例的内存使用率超过可用最大内存,操作系统开始进行内存与 swqp 空间交换;
(2)避免内存交换:
------针对缓存数据大小选择;
------尽可能的使用 Hash 数据结构;
------设置 key 的过期时间
3、回收key
1、保证合理分配 redis 有限的内存资源;
2、当内存使用达到设置的最大阈值时,需要选择一种 key 的回收策略:
-------默认情况下回收策略是禁止删除的;
-------redis.conf 配置文件中修改 maxmemory-policy 属性值

返回云计算教程...