一. Redis介绍

Redis社区发展历程

一.  Redis系统架构

1. Redis特性

1.1 内存NoSQL数据库

支持key-value类型的数据

支持GET/PUT/DELETE形式访问操作

1.2 高性能

百纳秒,微妙级别响应延迟

1.3 丰富的数据类型

Key:String

Value:多种类型(String,List,Hash,Set,Sorted Set)

1.4 可持久化保存数据

支持对数据库做内存快照

支持日志记录写操作

对比memcached

1.5 高可用

支持主从集群

读写分离,故障切换

1.6 高可扩展

支持切片集群,例如Redis Cluster,Codis等

2. Redis系统架构

RDB:Redis database 内存快照(数据保存到磁盘)

AOF:append only flie 日志记录 (操作保存到磁盘)

RDB和AOF的区别详见:https://blog.csdn.net/zhao_crystal/category_10903905.html

二.  Redis 主要数据结构

1. 基本数据类型

1.1 Key:Value

1.2 Value多样化

   (1) String

 a) 二进制安全的字符串,最大512MB。\0并不代表字符串结束,redis会有元数据,来计算字符串的长度大小(length)。为了兼容C语言操作库函数,会主动给二进制安全字符串加上\0。

 b)  使用广泛,数值,字符串,图片等

(2)List

a) 双向链表,支持POP和PUSH

b) 应用:排行榜,关注列表

(3)Hash

a) 字典,一个key可对应多个value

b) 结构化数据

(4)Set

a) 无序集合,支持元素去重和集合操作

b) 应用:社交应用中共同关注,共同好友

(5)Sorted Set

a) 有序集合

b)应用:排行榜

(6)Bitmap(可节省内存)

a) 位图,一个bit位表示一个状态

b) 应用:用户签到,状态统计

(7)HyperLogLog(可节省内存)

a) 基数统计,一个集合中不重复的元素个数

b) 应用:用户日活,月活统计

2. 不同Value类型使用不同底层数据结构

(1)兼顾性能和空间开销

(2)有序集合和无序集合的设计选择

(3)hash表的使用注意:rehash影响。

Redis静态hash扩容时,要做rehash的操作,会涉及Key-value的数据搬移。

SDS:Simple dynamic string

三. Redis高性能关键技术

1. 内存访问

Redis属于内存数据库,数据直接在内存上访问。

内存访问延迟:百ns;磁盘访问延迟:ms级

2. 单线程运行模型(redis6.0之前)

主要工作由单线程完成。

请求解析,键值对操作,结果返回,AOF日志

优势:开发简单,避免同步开销。

3. 高效网络通信机制

基于epoll实现IO复用

支持高并发客户端连接

fork 和 pthread_create 可避免单线程的冲突。

4. 影响Redis性能的关键因素

bigKey是指键值对的value特别大。

四. Redis高可用关键技术

1. Redis主从集群

主从复制

全量复制+增量复制

2. 故障切换

哨兵机制负责故障切换

监听主从实例的心跳

根据心跳信息判断主实例是否下线:主观下线(1个哨兵认为主实例没了心跳)+客观下线(指达成共识,所有哨兵都认为主实例没了心跳)

执行主从切换:基于投票机制确定切换的laeder + 选主 + 切换

   

五. Redis高扩展性关键技术

1. 高可扩展方法

Scale-up:扩展单个实例的容量

Scale-out:增加多个实例,共同分担压力

 

2. Scale-up的不足

单实例物理容量有限

主从复制压力大

持久化压力大

3. Redis Cluster

去中心化集群技术:没有中心化的转发点,避免单点故障。

客户端需支持Cluster相关命令

数据切片

16483个哈希槽

CRC16(key) % 16384

支持平均分配哈希槽或手动分配

客户端请求转发

基于Gossip的哈希槽分配信息传递

客户端缓存哈希槽信息

MOVED重定向机制

4. Codis

Redis Cluster方案前的业界常用方案(中心化

Codis proxy(可做成集群,分担压力)

请求转发

支持RESP协议,兼容现有客户端

Codis server

二次开发的实例

支持额外数据结构

支持数据迁移操作

Codis dashboard/fe

集群管理及web界面

增删codis server,进行数据迁移

Zookeeper集群

保存集群元数据信息,例如数据位置。

5. Redis Cluster VS. Codis

成熟度:Codis应用广泛,Redis Cluster也有一定使用

客户端兼容性:Codis proxy直接兼容面向单实例的客户端,Redis Cluster需要二次开发客户端。

数据迁移:Codis支持一步迁移,性能影响较小

新增命令和特性:Codis基于Redis3.2.8开发,并且并不支持所有命令

六. Redis 总结

Redis借助于内存数据库,单线程+异步子进程/线程模型,epoll网络IO复用实现高性能访问。

Redis充分利用不同数据结构性能和空间特点,支持丰富value类型

Redis性能至关重要,抓住Redis关键机制,避免操作阻塞,内存溢出

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值