Redis教程

程序猿成长之路之Redis(1)-- redis介绍

本文主要是介绍程序猿成长之路之Redis(1)-- redis介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

什么是redis?

Redis 是目前最为流行的开源的、包含多种数据结构、用于在高并发、强请求压力下辅助关系型数据库的缓存数据库。
Redis和常用的关系型数据库完全不一样:

  1. 关系型数据库(如Mysql、Oracle)的存储空间是服务器的硬盘而redis则是使用服务器的内存,这也造就了redis的优缺点。(查询速度快但存储容量小)
  2. 此外,查询数据方式也不同,传统关系型数据库通过sql命令查询,而redis则是采用操作系统命令行进行操作。
  3. 关系型数据库通过表和记录的形式存储数据,但是在redis中一切都通过数据结构存储数据。
  4. 关系型数据库存在外键、主键等关联的字段,而redis中不存在。

Redis和memcached等其他的缓存数据库也不同:

这里引用了https://blog.csdn.net/weixin_42295141/article/details/81380633 的文字,感谢“不由不该-”大佬

  1. 网络IO模型方面:Memcached是多线程,分为监听线程、worker线程,引入锁,带来了性能损耗。Redis使用单线程的IO复用模型,将速度优势发挥到最大,也提供了较简单的计算功能
  2. 内存管理方面:Memcached使用预分配的内存池的方式,带来一定程度的空间浪费 并且在内存仍然有很大空间时,新的数据也可能会被剔除,而Redis使用现场申请内存的方式来存储数据,不会剔除任何非临时数据 Redis更适合作为存储而不是cache
  3. 数据的一致性方面:Memcached提供了cas命令来保证.而Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断
  4. 存储方式方面:Memcached只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能

Redis 优点?

  1. Redis基于内存运行,I/O读写速度快。Redis能支持超过 100K+ 每秒的读写频率。
  2. 支持分布式,理论上可以无限扩展
  3. 丰富的数据类型(string、bitmap、hash、list、set 和zset)
  4. 支持事务,操作具有原子性
  5. 持久化

Redis缺点?

  1. 一旦服务器崩溃,redis就会停止运行,存储其中的数据可能就会丢失。(未持久化情况下)
  2. 由于内存限制,redis无法作为海量数据的存储介质。
  3. Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

Redis 的用途?

  1. 高并发请求拦截处理,如秒杀系统的请求处理。
  2. 数据的处理和场景应用,如set 数据类型中的SRANDMEMBER 函数可以从集合中随机获取一个或者多个key(如用户id),可以用于抽奖活动。set数据类型中的SINTERCARD函数可以获取两个集合的交集,用于处理公共好友或者共同喜爱的物品等。又如hash数据类型可以用来存储购物车的数据并进行处理。

Redis的基本术语:

  1. Master(主机)/ slave (从机)
    a) 主机:主服务器,就是作为数据复制主体的服务器
    b) 从机:从服务器,就是作为数据复制从体的服务器
  2. 哨兵
  3. 集群: 由多台服务器组成的服务器群,其中为了能够正常的选举(选出主机),至少需要3台服务器。而如果要搭建主从服务器集群则至少需要3台主机,3台从机。
  4. 心跳检测
  5. 缓存击穿、缓存雪崩、缓存穿透
    a) 缓存击穿:常在高并发情况下出现,若是redis有个热点数据过期或是被删除但是此时就有大量和该数据有关的请求发送过来,这时候redis无法起到拦截请求作用,大量请求就会直接到达数据库,这时候就会导致出现缓存击穿甚至数据库崩溃。解决方案:使用setnx(set if not exists)设置互斥锁(后续文章会进行详细说明)
    b) 缓存雪崩: 如果某一时刻大量的热点数据到期或者被删除,这时候大量的请求便会到达数据库,会给数据库造成很大压力。解决方式: 缓存失效时间分散开或者对数据库访问加锁、使用消息队列等。
    c) 缓存穿透: 如果查询的数据(key)在redis中未找到数据,那么请求就会直接访问数据库,这时redis缓存形同虚设,这时会给数据库造成一定的压力。解决方式可以使用布隆过滤器去判断该请求的数据是否存在。(后续文章会进行详细说明)

Redis的基本原理?

  1. 哨兵机制
    哨兵: 又称监视者,用于监听sentinel(哨兵)、master(主机)和 slave(从机)的状态。
    如何监听?
    1) 一个sentinel(哨兵)定时向其他sentinel(哨兵)、master(主机)和 slave(从机)发送一条消息(ping命令)之后等待对方实例回应
    2) 如果对方服务器当前时间距离上一次有效回复pong命令的时间差超过down-after-milliseconds选项所指定的值,那么该服务器将会被标记为主观下线(SDOWN – subjective down)。
    3) 如果是master(主机)被标记为主观下线,则正在监控这个服务器的所有Sentinel(哨兵)都要以每秒一次的频率确认服务器是否真的已经进入主观下线状态 (SDOWN – subjective down)。
    4) 当有足够数量的的sentinel (哨兵)发现该主机处于主观下线状态 (SDOWN – subjective down)。则该master(主机)标记为客观下线状态(ODOWN – objective down)
    5) 若没有足够数量的sentinel(哨兵)发现该主机处于主观下线状态 (SDOWN – subjective down)或者该服务器发送了有效pong回复则该服务器的SDOWN 状态被移除。
    具体内容会在后文进行更新,敬请关注
  2. 主从复制(同步)原理
    数据从主机备份到从机的过程
    具体内容会在后文进行更新,敬请关注
  3. Redis 持久化原理
    Redis 持久化是将redis中的数据定期以文件形式保存,这样妈妈就不用担心服务器宕机redis数据丢失的问题啦。具体的持久化方式有RDB和AOF两种。
    具体内容会在后文进行更新,敬请关注
这篇关于程序猿成长之路之Redis(1)-- redis介绍的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!