Redis-记录

第一章 Redis 概述

一、Redis(Remote Dictionary Server)远程字典服务

  1. 使用 ==ANSI C 语言==编写、==支持网络、可基于内存亦可持久化的日志型、NoSQL 开源内存数据库==,其提供多种语言的 API。

  2. Redis被称为字典服务的原因在于,redis是一个key-value的存储系统。

    支持存储的value类型有很多,包括String(字符串)、List(链表)、Set(集合)、Zset(sorted set– 有序集合)和哈希类型等

二、NoSQL

Nosql(non-relational,Not Only SQL),泛指的是非关系型的数据库。

比如社交类的等等

==NoSQL 数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题==

传统方法不适合这种情况。

1. 键值存储数据库

类似Map的key-value对。

典型代表redis

2. 列存储数据库

注意的是 ,关系数据库是行关系库,其存在的问题在于,按照行存储的数据在物理层面占用的是连续的存储空间,==是不适合海量的数据存储==的。

而按列存储则可以实现一个分布式存储,适合海量的存储

典型的代表就是HBase

3. 文档型数据库

NoSQL与关系型数据的结合,最想关系型数据库的NoSQL

典型代表就是MongoDB。

4. 图像(Graph)数据库

用于存放一个节点关系的数据库,例如描述不同人间的关系。典型代表是 Neo4J。

三、Redis的用途

1.数据缓存

Redis在生产中用的最多的场景:==数据缓存==。

正常情况下,用户->服务器->数据库 (query),然后再返回。

但是当用户很多的时候,就是高并发的时候,解决不了了。

因此提出解决方案: 用户->服务器->缓存-> 数据库 (query)

image-20240223001703204

这样DBMS压力就会减轻。

即客户端从 DBMS 中查询出的数据首先写入到 Redis 中,后续无论哪个客户端再需要访问该数据,直接读取 Redis 中的即可,不仅减小了 RT,而且降低了 DBMS 的压力。

而且,DBMS一般存放在磁盘中,而Redis作为内存数据库是放在内存中的,且直接通过key来查询,缓存层的查询非常的快,高并发的问题可以解决。

数据不一致问题?:

当一个用户提出要修改,修改了DBMS,没有修改缓存层,就会存在一个脏数据/

image-20240223074739083

预热:服务器不是刚开就提供服务,会有一个预热,把一些基础数据先保存到缓存中

四、Redis 特性

1.性能极高:

Redis 读的速度可以达到 11w 次/s,写的速度可以达到 8w 次/s。只所以具有,这么高的性能,因为以下几点原因:

1)Redis 的所有操作都是在内存中发生的。

2)Redis 是用 C 语言开发的。

3)Redis 源码非常精细(集性能与优雅于一身)。

2.简单稳定

Redis 源码很少。早期版本只有 2w 行左右。从 3.0 版本开始,增加了集群功能,代码变为了 5w 行左右。

3.持久化

数据缓存是暂时的,要保存到磁盘,才能保证数据安全。Redis 内存中的数据可以进行持久化,其有两种方式:RDB 与 AOF。

4.高可用集群

Redis 提供了高可用的主从集群功能,可以确保系统的安全性

5.丰富的数据类型

Redis 是一个 key-value 存储系统。支持存储的 value 类型很多,包括String(字符串)、List(链表)、Set(集合)、Zset(sorted set –有序集合)和 Hash(哈希类型)等,还有 BitMap、HyperLogLog、Geospatial 类型

  1.  BitMap:一般用于大数据量的二值性统计。
    比如员工是否打卡

  2.  HyperLogLog:其是 Hyperlog Log,用于对数据量超级庞大的日志做去重统计。

  3.  Geospatial:地理空间,其主要用于地理位置相关的计算。

    比如“附近的人”

6.强大的功能

Redis 提供了数据过期功能、发布/订阅功能、简单事务功能,还支持 Lua脚本扩展功能。

7.客户端语言广泛

Redis提供了简单的 TCP 通信协议,编程语言可以方便地的接入 Redis。所以,有很多的开源社区、大公司等开发出了很多语言的 Redis 客户端。

8.支持 ACL 权限控制

之前的权限控制非常笨拙。从 Redis6 开始引入了 ACL 模块,可以为不同用户定制不同的用户权限。

image-20240223081342029

linux 的drwxr-xr-x :d表示目录/l表示链接,rwx表示用户(创建者User)读写可执行;Group r-x后三位表示和创建者同组用户读可执行。Other r-x

9.支持多线程 IO 模型

Redis 之前版本采用的是单线程模型,从 6.0 版本开始支持了多线程模型。

五.Redis IO 模型

单线程模型 多线程模型 混合模型

Redis 客户端提交的各种请求是如何最终被 Redis 处理的?Redis 处理客户端请求所采用的处理架构,称为 Redis 的 IO 模型。不同版本的 Redis 采用的 IO 模型是不同的。

1.单线程模型

性能还是很强,写8w/qps,读11w/qps–>内存\单线程可维护性比较高(多线程存在线程切换问题,顾及到数据安全问题\死锁问题)

问题:持久化等操作和客户端没太多联系,但是又比较费时,于是提出了混合线程模型

对于 Redis 3.0 及其以前版本,Redis 的 IO 模型采用的是纯粹的单线程模型。即所有客户端的请求全部由一个线程处理。

image-20240223082516763

每个客户端若要向 Redis 提交请求,都需要与 Redis 建立一个 socket 连接,并向事件分发器注册一个事件。

一旦该事件发生就表明该连接已经就绪。而一旦连接就绪,事件分发器就会感知到,然后获取客户端通过该连接发送的请求,并将由该事件分发器所绑定的这个唯一的线程来处理。

如果该线程还在处理多个任务,则将该任务写入到任务队列等待线程处理。只所以称为事件分发器,是因为它会根据不同的就绪事件,将任务交由不同的事件处理器去处理

==Redis 的单线程模型采用了多路复用技术。==

对于多路复用器的多路选择算法常见的有三种:select 模型、poll 模型、epoll 模型。

  1. poll 模型的选择算法:采用的是轮询算法。该模型对客户端的就绪处理是有延迟的。

  2. epoll 模型的选择算法:采用的是回调方式。根据就绪事件发生后的处理方式的不同,又可分为 LT 模型与 ET 模型。

2.混合线程模型

从 Redis 4.0 版本开始,Redis 中就开始加入了多线程元素。处理客户端请求的仍是单线

程模型,但对于一些比较耗时但又不影响对客户端的响应的操作,就由后台其它线程来处理。

例如,持久化、对 AOF 的 rewrite、对失效连接的清理等

3.多线程模型

image-20240223083447687

内存响应时间(RT)100ns

Redis 每秒处理读写请求 达到:1s/100ns = =1kw次,实际情况是,redis8w/qps,读11w/qps,差距那么大的原因 就是redis的单线程

是将单线程和多线程各取其优点.

image-20240223083854779