Redis

Redis是目前使用最广泛的内存数据存储系统之一。它支持更丰富的数据结构,支持数据持久化,事务,HA(高可用High Avaliable),双机集群系统,主从库。

Redis 可能会导致的问题:

  1. 缓存和数据库双写一致性问题。
  2. 缓存雪崩问题
  3. 缓存击穿问题
  4. 缓存的并发竞争问题

Redis为什么快

  1. 纯内存操作
  2. 单线程操作,避免了频繁的上下文切换
  3. 采用了非阻塞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) 不稳定

一个好奇的人