10.7. Redis
10.7.1. NoSql简介
- 关系型数据库每次操作都是I/O操作,会影响程序执行的性能,关系型数据库都是树状结构,当数据量特别大的时候,就会导致树比较深,此时查询性能就会降低,也就是说,我们 减少对数据库的操作就能提升程序的运行效率。引出NoSql,也就是不仅仅可以使用关系型数据库,在一些特定的场合使用就可以了
- 常见的NoSql数据库有 :
- Redis : 主要是具备持久化能力
- memcached : 键值对,内存型数据库,所有数据存储在内存中
- Hanbse : 以列作为存储
- MongoDB : 以Document作为存储
- Redis的瓶颈:
- 内存:因为读写在内存中进行,内存大小会影响Redis性能。可以通过加内存、读写分离优化性能。
- 网络带宽:网络 IO是Redis最大瓶颈,也就是客户端和服务端之间的网络传输延迟。Redis6.0引入了网络IO多线程模型,提高了性能瓶颈。
- 功能:键过期、事务、lua脚本(基于C语言,性能快)、持久化机制。
10.7.2. Redis 简介
- Redis是以键值对的形式进行存储的,使用C语言编写,平时操作的数据都放在内存中,存取效率高
- 读的效率是11万次/秒 ; 写的效率是八万一千次/秒,所以多把Redis当作缓存工具使用
- 缓存工具意思是把数据库中的数据缓存到Redis中,使用的时候直接访问Redis而不是访问数据库
- Redis是是以槽作为存储单元,每个槽存储N个键值对,固定有16384槽,也就是16384个Redis
10.7.3. Redis工作流程
- 应用程序向Redis查询数据,判断key是否存在
-
- 存在的话就将结果查询出来返回给应用程序
- 不存在的话就向MySql查询数据,再把数据返回给应用程序,最后将结果缓存在Redis中
10.7.4. Redis基本数据类型
【1】String字符串类型 ; 【2】List数组 ;【3】 Set集合 ;【4】 Hash哈希表 ;【5】 SortedSet 有序集合
10.7.5. Redis持久化策略
10.7.5.2. AOF(AppendOnly File)
10.8. Jedis
Redis给Java语言提供了客户端Api,叫做Jedis,指令基本一样,但是Jedis不具备把对象转换为字符串的能力,所以每次都要借助Json转换工具进行转换;
- Redis不仅是内存型数据库(非关系型数据库),更具备持久化能力
- Redis每次启动时都会从硬盘中读取数据然后把数据读取到内存中,运行过程中操作的数据都是内存中获得数据
10.7.5.1. RDB(Redis DataBase)
- RDB 就是 Redis DataBase 的缩写,中文名为快照/内存快照,RDB持久化是把当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。
- Redis 可以通过创建快照(save)来获得存储在内存里面的数据在某个时间点上的副本。Redis 创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本,还可以将快照留在原地以便重启服务器的时候使用。
- 监听执行的命令,如果发现执行了修改数据的操作,同时直接同步到数据库文件中,同时会把命令记录到日志中。即使突然出现问题,由于日志文件中已经记录命令,下一次启动时也可以按照日志进行恢复数据,由于内存数据和硬盘数据实时同步,即使出现意外情况也需要担心。
- 与RDB存储某个时刻的快照不同,AOF持久化方式会记录客户端对服务器的每一次写操作命令,并将这些写操作以Redis协议追加保存到以后缀为aof文件末尾,在Redis服务器重启时,会加载并运行aof文件的命令,以达到恢复数据的目的。
- AOF 默认是关闭的,需要在配置文件 redis.conf 中开启 AOF。Redis 支持 AOF 和 RDB 同时生效,如果同时存在,AOF 优先级高于 RDB(Redis 重新启动时会使用 AOF 进行数据恢复)