【整理】Redis学习-redis介绍(一)

Redis关键定义整理

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 只使用单核, 实际上是个单线程工作模型
Redis 支持高可用(主从备份、复制)、一致性(事务)、持久化(存储)
Redis 支持的数据结构多,常见五种。官网上列出了详细清单。
Redis 将数据存放在内存中,内存数据库
虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘 。
Redis 数据丢失后可以通过AOF恢复(灾难恢复)。

Key-Value数据库

Key-Value顾名思义,按Key存储Value,Java中常⽤的Map就属于键值型存储结构。
数据库和直接使⽤基础数据结构不同,数据库在基本操作之上,更加注重系统在海量数据环境下的⾼性能、⾼可靠、⾼扩展、⾼可⽤性。
Key-Value数据库跟传统数据库⽐,在海量、分布式、扩展性上⼜更胜⼀筹,并不像传统关系型数据库更注重模式、事务、SQL。我们在做技术选型的时候,就要根据技术的特性是否满⾜
业务需求来做取舍了。错误的选择会使我们陷⼊泥潭不可⾃拔。
Key-Value数据库不仅仅只有Redis(Redis发展到今天,也不仅仅只有Key-Value特性。⼤多数据库都是如此,不断发展的过程中会⽀持更多数据库模型),如果在⼀个技术驱动型团队,横向⽐较选择技术就是架构师必备技能了。以下是业界其他Key-Value数据库列表:

数据库名 语⾔ 官⽹
Redis C https://redis.io
Memcached C https://memcached.org
Amazon DynamoDB https://aws.amazon.com/dynamodb/
Hazelcast Java https://hazelcast.com
Ehcache Java https://www.ehcache.org

更多数据库排名和特性⽐较: https://db-engines.com/en/ranking/

Redis与其他key-value存储有什么不同

Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

Redis 与其他 key - value 缓存产品有以下三个特点

1、Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。(持久化)
2、Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。(支持数据结构种类多)
3、Redis支持数据的备份,即master-slave模式的数据备份。(高可用)

Redis单核

单线程模型效率也很高:
1、纯内存操作
2、核心是基于非阻塞的 IO 多路复用机制
3、单线程反而避免了多线程的频繁上下文切换问题

备注:
redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis,虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。

Redis的线程模型

redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:

多个 socket
IO 多路复用程序
文件事件分派器
事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

客户端与 redis 的一次通信过程:
在这里插入图片描述
客户端 socket01 向 redis 的 server socket 请求建立连接,此时 server socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给连接应答处理器。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 AE_READABLE 事件与命令请求处理器关联。

假设此时客户端发送了一个 set key value 请求,此时 redis 中的 socket01 会产生 AE_READABLE 事件,IO 多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事件,由于前面 socket01 的 AE_READABLE 事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 key value 并在自己内存中完成 key value 的设置。操作完成后,它会将 socket01 的 AE_WRITABLE 事件与命令回复处理器关联。

如果此时客户端准备好接收返回结果了,那么 redis 中的 socket01 会产生一个 AE_WRITABLE 事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ok,之后解除 socket01 的 AE_WRITABLE 事件与命令回复处理器的关联。

这样便完成了一次通信。

Redis主要的五种数据结构

Redis能从其他同类Key-Value产品中脱颖⽽出的根本原因,不是其速度有多快,同类产品差距都不是很⼤,⽽是其⽀持丰富的数据结构和⼤多数编程语⾔⾥的⼀样,⽽且操作起来没有太⼤差别。丰富的数据结构和操作指令,避免了⽤户需要更改变通业务需求才能使⽤的尴尬场景。虽然是远程内存数据库,但⽀持原⼦操作和事务也是其能流⾏的原因。

结构类型 存储值 功能
String 字符串、整数、浮点数 对存储值的常规操作,和Java中的操作类似
List 链表,节点是字符串 常规的链表操作
Set 存储⽆序唯⼀字符串的集合 单⼀元素操作和交、并、差集
Hash 键值对⽆序散列表 类似Java中hashmap
Sorted Set 存储有序唯⼀字符串的集合 排序相关操作

数据类型介绍: https://redis.io/topics/data-types-intro

Redis核⼼特性

官⽅介绍中并没有把速度快当成其主要特性。
 持久化,是内存数据库必备特性,有快照和⽇志两种⽅式
 复制,是集群和分布式的必备特性
 事务,和传统数据库事务稍微有点区别,仅仅是执⾏多个命令,⼀个结果
 位图,⼆进制⽅式存储,适合⼤数据量
 发布/订阅,就是常⻅的发布订阅模式
 地理位置存储,在移动应⽤普及的今天,这也是常⽤特性
 哨兵,分布式架构下宕机的运维问题
 Cluster,分布式集群解决⽅案
 Lua脚本,⽤户可以扩展Redis
 Pipeline,⼀次发送多个命令,节省⽹络时间
 缓存,LRU缓存策略

Redis 优势

性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

参考文献:
https://blog.csdn.net/chang384915878/article/details/86748083

发布了42 篇原创文章 · 获赞 0 · 访问量 1447

猜你喜欢

转载自blog.csdn.net/tcctcszhanghao/article/details/103245622