Redis学习(一):Redis入门

7c2dbf05d1b89657682a1e70b8ca361.jpg 这是我的第一篇博客,一起参与掘金新人创作活动,开启写作之路

Redis是一种开源的基于BSD许可的内存数据库,可用作数据库、缓存、消息代理等,是NoSQL型数据库

Redis的特点

  1. Redis是基于内存的,操作速度非常快
  2. Redis是单进程单线程的,线程安全,采用IO多路复用机制
  3. Redis支持丰富的数据类型,字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(sorted set)等
  4. Redis所有操作都是原子性的,要么全部成功,要么全部失败

Redis为什么这么快?

redis速度非常快,可达到每秒十万级的吞吐量,这基于以下几点原因

  1. redis是基于内存实现的,内存的读写速度要远高于硬盘的读写速度

  2. redis主体是单线程的,没有锁的问题。说明:redis整体不是单线程的,处理请求时是单线程执行

  3. 特殊的数据结构,redis中字符串用的是SDS动态字符串

    SDS与C的字符串:

c51e820e8ad0b012e79057ba76053ee.png

  1. C中字符串未记录字符串长度,查询字符串长度时需要遍历整个字符串,时间复杂度为O(n),并且在扩充和缩短字符串时,要注意缓冲区溢出和内存泄漏问题

  2. SDS字符串的len存储了字符串长度信息,查询字符串长度时间复杂度为O(1),在扩充字符串时会先检查空间是否满足需求空间,如果不满足,则会先对SDS空间进行扩展,避免了缓冲区溢出

  3. SDS字符串减少了内存分配次数,在扩充字符串时会执行==空间预分配==(空间分配策略),在修改后字符串长度时,不仅分配了必须的空间,还会分配一定大小的free未使用空间(修改后长度小于1MB,则和字符串长度相等,反之,最大为1MB);在缩短字符串时,采用了==惰性空间释放==,即修改字符串长度后,不会立即释放空间,而是将空间分配到free未使用空间中,以便于下次使用

    扫描二维码关注公众号,回复: 13471260 查看本文章
  4. SDS字符串是二进制安全的,因为buf存储的不是字符,存储的是二进制数据

  5. I/O多路复用

    Redis服务器是一个事件驱动程序,包含了文件事件和时间事件。文件事件就是redis服务器和其他端进行通信时产生的相应的文件;时间事件是redis内部的一些在给定时间内要进行的操作

    文件事件处理器是单线程执行的,但内部实现了I/O多路复用,即内部通过监听同时监听多个Socket连接,快速响应连接请求,但在内部I/O多路复用程序会将Socket放在一个有序的队列中,通过文件事件分派器有序分配给事件处理器进行处理,一个Socket的事件执行完毕后,才会执行下一个Socket,即是单线程。但这里也要注意事件处理器里并不是单线程的

Redis数据的更新、过期可采用的策略是什么?

  1. 数据更新策略(redis缓存与DB数据保证一致性)

    Cache-Aside pattern 缓存更新模式

a338ea3eb6642a5645d4a1858aa5cae.png 4c8c12fa535eb5afac6454758847377.png 在查询时,首先去查询缓存,如果命中了缓存,就取出返回数据。如果没有命中缓存,则去数据库进行查询,并保存在redis缓存中,这样保证了缓存的数据会进行更新;对数据进行更新的时候,先进行DB数据的更新,再删除缓存,这样避免了旧数据缓存一直存在(查询时一直命中旧数据缓存)

  1. 数据过期策略

    1. 定期删除 ==优点:节约了内存 缺点:cpu压力大==

      redis会间隔一段时间(默认100ms)去随机抽取一些设置了过期时间的缓存,检查其是否过期。随机抽取的原因是,如果按照一定数量去顺序查询时,后面的过期缓存可能长时间不能被清理,若每次都是全量的检查时,数据量大,cpu压力。

    2. 惰性删除 ==优点:cpu压力小 缺点:内存压力大==

      redis不进行主动的删除,当查询数据时,若该数据没有过期,则返回数据,反之,则删除数据,避免了cpu压力大的情况,但是若过期数据长期未被查询,则一直存留,增加了内存的压力

Redis的淘汰机制有哪些?

在数据过期策略中提到惰性删除时,可能会有数据长时间未被删除,再加上未过期数据,那么就可能达到内存限制的上限,此时需要进行数据淘汰

  1. 新写入数据时报错(默认策略)

  2. 在键空间中,随机移除某个key

  3. 在键空间中,移除最近很少使用的key(LRU算法推荐)

Redis持久化有哪些方式?

  1. RDB

    快照形式,定时在redis需要做持久化时,redis会开启子进程,将redis中的数据写入dump.rdb文件中保存在硬盘

    优点:RDB存储效率高,文件体积小,恢复时速度快于AOF

    缺点:定时执行,未保存数据,redis就重启了,不能保证数据完整性

  2. AOF

    默认每秒钟一次,将redis的修改命令全部保存在一个AOF文件中,每当redis服务器做一次修改命令,都将该命令保存下来,从而达到持久化

    优点:数据足够完整,即便丢失也仅丢失了一秒的数据

    缺点:相对于RDB文件,恢复数据速度慢,文件体积大

    ==从优缺点中可以看出当你的程序需要高度保证数据的完整性时还是采用AOF方式更加可靠==

猜你喜欢

转载自juejin.im/post/7037042516666875911