Skip to main content

Redis介绍 Overview

基础数据结构

String

  1. 当做KV存储使用,Key和Value都可以是字符串或者序列化后的字符串
    1. key和value的长度呢?
    2. value可以容纳的数据长度是512MB
  2. 底层实现呢?
  3. 应用场景
    1. 缓存对象
    2. 常规计数,用incr自增KV
    3. 实现分布式锁,setnx key value ex 123语句可以被用于设置带expire time的KV
    4. 共享session信息

List

  1. 底层实现是双向链表或压缩列表,在Redis3.2之后,底层实现为quicklist
  2. 所以删除是pop,增加是append
  3. 使用场景:消息队列

Hash

  1. 常见hash map
  2. 注意hash冲突处理?
  3. 注意性能?

Set

  1. 可以用于过滤电话号码?

ZSet

  1. 有序的set,可以用来做排序

高级数据结构

BitMap

bitmap本质上本质上是bit数组,可以用于统计大量二值状态的数据(二值状态指集合元素的取值只有0或1),可以有效节省内存空间。

  • 使用string类型实现,而string本身就是byte数组,等同于bit数组

即使一天生成1亿(10^8)的数据,bitmap的内存占用也就10^8/8 ~= 12.5*10^6 bytes ~= 12MB,一周就是84MB,没有问题。

TODO: 实例: 每天打卡的用户数

HyperLogLog

  1. 是Redis 2.8.9之后新增的数据结构,用于统计集合中基数(不重复的元素个数)。统计规则是基于概率实现的,误算率为0.81%。
    1. HyperLogLog提供不精确的去重计数。
  2. pros:只需要12KB内存就可以统计接近2^64个不同元素的基数,很省空间。
    1. 如果使用long类型,也就是8 bytes,2^64个不同元素需要2^64*8 ~= 2^67MB ~= 2^37GB内存空间

为什么Redis快?

  1. 纯内存操作
  2. 单线程模型
    1. 实现简单
    2. 无锁
    3. 可虚拟化,单机多实例部署
    4. 新版redis在网络io操作上使用多线程,但操作数据结构的仍旧是单线程
  3. 使用epoll(网络I/O多路复用)

日志备份方案?

RDB

  1. 二进制快照,数据的直接dump,文件小
  2. 时效性差,定期全量备份
  3. BGSAVE命令,背景备份,非阻塞,fork一个子进程来复制dump王文建
  4. 支持冷备,自动同步到云存储
  5. 完整备份,所以恢复快,直接加载到内存

AOF

  1. append only file,文本文件,每个更新命令的执行都需要记录,文件大
    1. 可以rewrite压缩减少记录内容
  2. 时效性高,支持秒级的备份,更新很快,但对cpu和硬盘的压力大。
  3. 恢复时需要一条条重放,恢复速度慢

分布式(主从备份)

实践特殊样例,order fee的计算

Reference

  1. https://xiaolincoding.com/redis/data_struct/command.html#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF