redis架构设计
一、 简介
- 高性能(目前已知性能最快)
- 读速度:110000 次 /s
- 写速度:81000 次 /s
- key-value(单个value的最大限制是1GB)类型的内存数据库
- 数据库在内存中进行操作
- 支持数据持久化
- 定期异步操作将数据库数据flush到硬盘上
- 支持string,list,set,sorted set,hash
- 操作都是原子性
- 支持事务
- 对数据的更改要么全部执行,要么全部不执行
- 事务中任意命令执行失败,其余命令依然被执行(Redis 事务不保证原子性,也不支持回滚)
- 事务中的多条命令被一次性发送给服务器,服务器在执行命令期间,不会去执行其他客户端的命令请求
- 支持数据备份( master - slave 模式的数据备份)
- 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写
- 适合的场景局限在较小数据量的高性能操作和运算上
二、 可实现的功能
2.1 消息队列服务
用List来做FIFO双向链表(前一个元素和后一个元素),实现一个轻量级的高性能消息队列服务
2.2 tag系统
Set可以做高性能的tag系统
2.3 缓存
高并发情况下,将用户基本信息放到redis中,减少对数据库的访问,直接做法就是建立用户的内存模型
存储用户会话缓存信息
2.4 消息(支持 publish/subscribe 通知)
2.5 排行榜/计数器
**计数器:**Redis在内存中对数字进行递增或递减的操作实现的非常好。
**排行榜:**有序集合(Sorted Set)通过分数来实现
三、淘汰策略
3.1从已经设置过期时间的数据集中
volatile-lru: 挑选最近最少使用的数据淘汰
volatile-ttl: 挑选即将要过期的数据淘汰
volatile-random: 随机挑选数据淘汰
3.2从所有的数据集中
allkeys-lru: 挑选最近最少使用的数据淘汰
allkeys-random:,随机挑选数据淘汰
3.3 no-enviction:禁止淘汰数据
四、过期键的策略
4.1定时删除
缓存过期时间到就删除,创建timer耗CPU
4.2惰性删除
获取的时候检查,不获取一直留在内存,对内存不友好
4.3定期删除
CPU和内存的折中方案
五、数据类型分析
5.1 string
最基本的数据类型。
二进制安全的,可以包含任何数据。
最大能存储 512 MB。
5.2 hash
- 一个键值对(key - value)集合。
- 一个 string 类型的 key 和 value 的映射表,
- 适合用于存储对象
- 可以对对象某一项属性值进行存储、读取、修改等操作。
5.3 list
- 是简单的字符串列表(集合)。
- 按照插入顺序排序。我们可以网列表的左边或者右边添加元素。
- 元素是可重复的。
- 适用做消息队列或最新消息排行等功能。
5.4 set
- 无序
- 通过哈希表实现,因此添加、删除、查找的复杂度都是 O(1)。
- 是一个 key 对应着多个字符串类型的 value的集合
- 集合元素不能重复
- 可以统计访问网站的所有独立ip。
5.5 Zset
- 和set 一样
- 不同的是zset 每个元素都会关联一个 double 类型的分数,通过分数来为集合中的成员进行从小到大的排序。
- value元素是唯一的,但是分数(score)却可以重复。
- 可用作排行榜等场景。