Redis
Redis是目前使用最广泛的内存数据存储系统之一。它支持更丰富的数据结构,支持数据持久化,事务,HA(高可用High Avaliable),双机集群系统,主从库。
Redis 可能会导致的问题:
- 缓存和数据库双写一致性问题。
- 缓存雪崩问题
- 缓存击穿问题
- 缓存的并发竞争问题
Redis为什么快
- 纯内存操作
- 单线程操作,避免了频繁的上下文切换
- 采用了非阻塞I/O多路复用机制
Redis的适用场景
1. 高并发的读写
Redis特别适合将方法的运行结果放入缓存,以便后续在请求方法时直接去缓存中读取。对执行耗时,且结果不频繁变动的sql查询的支持极好。
在高并发的情况下,应避免请求直接访问数据库,这时可以使用Redis进行缓存操作。让请求先访问Redis。
2. 计数器
电商网站(App)商品的浏览量、视频网站(App)视频的播放数等数据都会被统计,以便用于运营或产品分析。为了保证数据实时生效,每次浏览都得+1,这将会导致非常高的并发量。这时可以用Redis提供的incr命令来实现计数器的功能。这一切在内存中操作,所以性能非常好,非常适用于这些计数场景。
3. 排行榜
可以利用Redis提供的有序集合数据类,实现各种复杂的排行榜应用。如京东、淘宝的销量榜,商品按时间、销售排行等。
4. 分布式会话
在集群模式下,一般会搭建以Redis等内存数据库以中心的session服务,它不再由容器管理,而是由session服务及内存数据库管理。
5. 互动场景
使用Redis提供的散列、集合等数据结构,可以很方便地实现网站中的点赞、踩、关注共同好友等社交场景的基本功能。
6. 最新列表
Redis可以通过LPUSH在列表头部插入一个内容id作为关键字,LTRIM可用限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID查找对应的内容即可。
Redis的数据类型
数据类型 | 存储的值 | 读写能力 |
---|---|---|
string(字符串) | 可以是字符串、整数或浮点数 | 对整个字符串或字符串其中一部分内容操作;对对象和浮点数执行自增(increment)自减(decrement)操作。 |
list(列表) | 一个链表,链表的每个节点都包含一个字符串 | 从链表的两端推入或弹出元素;根据偏移量对链表进行修剪(trim);读取单个或多个元素;根据值查找或移除元素 |
set(集合) | 包含字符串的无序收集器(unorderedcollection),并且包含的字符串无重复 | crud元素;计算交集、并集、差集;从集合中随机读取元素 |
hash(散列) | 包含键值对的无序散列表 | crud单个键值对;获取所有键值对 |
zset(有序集合) | 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值大小决定 | crud单个元素;根据分指范围(range)获取元素 |
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n²) | O(nlogn) | O(n²) | O(1) | 稳定 |
简单选择 | O(n²) | O(n²) | O(n²) | O(1) | 稳定 |
直接插入 | O(n²) | O(n) | O(n²) | O(1) | 稳定 |
希尔排序 | O(nlogn)~O(n²) | O(n^1.3) | O(n²) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 不稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n²) | O(nlogn)~O(n) | 不稳定 |