Redis

39 阅读5分钟

redis是一种基于内存的数据库,读写速度快,常用于缓存、消息队列等场景。 remote dictonary service,远程字典服务器 使用c语言进行编写的

Redis的特性

  1. 支持持久化,RDB、AOF
  2. 支持丰富的数据类型,string、list、hash、set、zset
  3. 支持数据的备份,也就是主从复制

Redis的优点

  1. 性能极高,操作redis就是操作内存、单线程避免了多线程之间的竞争、采用IO多路复用机制,用一个线程监听多个socket。
  2. 具备高并发,QPS可以轻松破10w
  3. 原子操作,执行命令由单线程负责,不存在并发竞争问题
  4. 丰富的特性

Redis的基本命令

select indesx

获取子串命令 getrange key strat end

设置子串 setrange key offset newvalue

累加的命令

Redis的数据类型

image.png string:缓存对象、常规计数。 使用SDS(简单动态字符串)进行实现

  1. SDS是二进制安全的,可以包含任何数据(图片、音频、视频),包括空字符‘\0’,根据len属性值而不是空字符来判断字符串是否结束。
  2. SDS获取字符串长度的时间复杂度为O(1)
  3. SDS拼接字符串不会导致缓冲区溢出,会进行检查并在不足时进行扩容

list:消息队列

  1. 如果元素个数小于512个,每个元素值小于64字节,会使用压缩列表作为底层数据结构
  2. 否则使用双向链表作为底层数据结构
  3. 3.2版本之后使用quicklist来实现

hash:缓存对象、购物车

  1. 如果元素个数小于512个,每个元素值小于64字节,会使用压缩列表作为底层数据结构
  2. 否则使用哈希表作为底层数据结构
  3. 7.0版本后,使用listpack数据结构来实现

set:聚合计算场景,点赞、共同关注、抽奖活动

  1. 如果元素个数小于512个,每个元素值小于64字节,会使用整数集合作为底层数据结构
  2. 否则使用哈希表作为底层数据结构

zset:排序场景,排行榜、电话、姓名排序

  1. 如果元素个数小于128个,每个元素值小于64字节,会使用压缩列表作为底层数据结构
  2. 否则使用跳表作为底层数据结构
  3. 7.0版本后采用listpack数据结构来实现

持久化

定义 redis的读写操作都是在内存中,所以redis的性能才会高,但当redis重启后,内存中的数据就会丢失,未来保证内存中的数据不会丢失,redis就实现了数据持久化,把数据存储到磁盘。

RDB持久化 RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据

优点

  1. 适合大规模数据的恢复,恢复速率比较快
  2. 数据的完整性和一致性不高,可以使用RDB
  3. 数据恢复的文件是二进制的

缺点:

  1. 数据完整性和一致性不高,有可能丢失更多的数据
  2. 采用子进程的形式

AOF持久化 Redis 在执行完一条写操作命令后,就会把该命令以追加的方式写入到一个文件里,然后 Redis 重启时,会读取该文件记录的命令,然后逐一执行命令的方式来进行数据恢复。

优点 数据的完整性与一致性更高

缺点 数据的恢复速率比较慢,导致文件的大小比较大

该如何选择持久化的方式?

  1. 数据恢复速率快选择RDB,如果比较完整选择AOF
  2. 两种持久化的方式是可以同时使用的

单独使用任何一种持久化的方式都可以启动服务器,如果AOF持久化的方式是唯一的持久化方式,并且AOF文件损坏了,那么服务器是无法启动的。

Redis集群

主从赋值 是Redis高可用服务的最基本的保证,实现方案就是将从前的一台Redis服务器,同步数据到多台从Redis服务器上,且主从服务器之间采用的是读写分离的方式。 主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而且从服务器一般只是只读,并且接收主服务器同步过来的写操作命令,然后执行这条命令。

哨兵模式 哨兵模式可以监控主从服务器,并且提供主从节点故障转移的功能。

切片集群模式 当Redis缓存数据量达到一台服务器无法缓存时,就需要使用切片集群,将数据分布在不同的服务器上,来降低系统对单节点的依赖,从而提高redis服务器的读写性能。

Redis过期删除与内存淘汰

过期删除 redis可以对key设置过期时间,因此需要有对应的机制来将已过期的键值对删除。

删除策略:惰性删除+定期删除

  1. 惰性删除:不主动删除过期键,每次从数据库访问 key 时,都检测 key 是否过期,如果过期则删除该 key。
  2. 定期删除:每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。

内存淘汰 当redis的运行内存达到了某个阈值时,就会触发内存淘汰机制。

  1. 不进行数据淘汰的策略
    1. noeviction,不淘汰任何数据,直接返回错误
  2. 进行数据淘汰的策略
    1. 范围:设置了过期时间内的数据
      1. volatile-random,随机淘汰设置了过期时间的任意键值
      2. volatile-ttl,优先淘汰更早过期的键值
      3. volatile-lru,淘汰所有设置过期时间的键值中,最久未使用的键值
      4. volatile-lfu,淘汰所有设置过期时间的键值中,最少使用的键值
    2. 范围:所有数据
      1. allkeys-random,随机淘汰任意键值
      2. allkeys-lru,淘汰整个键值中最久未使用的键值
      3. allkeys-lfu,淘汰整个键值中最少使用的键值