Redis 基础知识

浅浅的花香味﹌ 2022-09-06 10:18 308阅读 0赞

目录

      • redis的特点 | 优点
      • redis常见的使用场景
      • redis高性能的原因
      • memcache和redis的区别 | redis相比memcached的优势
      • redis的线程模型
      • redis的数据淘汰机制
        • 过期删除策略 | key失效机制
        • 内存淘汰策略

redis是一个用C语言编写的键值数据库,基于内存、性能极高,使用广泛

redis的特点 | 优点

  • 基于内存,性能极高
  • 支持数据持久化
  • 数据类型丰富
  • 特性丰富,支持事务、管道、发布/订阅、 过期删除、支持lua脚本等特性
  • 提供了众多原生的原子性指令

redis常见的使用场景

  • 作为(分布式)缓存,缓存数据库的查询结果
  • 实现分布式系统的数据共享、协调,比如session共享、分布式锁
  • 利用key过期删除的特性,实现数据的过期处理
  • 作为任务队列,实现秒杀、抢购、抢票等功能

redis高性能的原因

镜像问题:redis为什么这么快?redis是单线程的,为什么还那么快?

  • redis是内存型数据库,完全基于内存,把全量数据存储在内存中,读写速度快;绝大部分请求是纯粹的内存操作,处理快,cpu不是redis的性能瓶颈(不太吃cpu性能)
  • redis采用键值存储,数据结构经过精心设计,数据结构简单,数据操作也简单,数据存储、查找性能高
  • 底层使用I/O多路复用模型,非阻塞IO,提高了并发
  • 使用单线程处理客户端的请求,避免了线程上下文切换、锁竞争引起的开销

memcache和redis的区别 | redis相比memcached的优势

memcache,mem cache 显然和redis一样是基于内存的

  • memcache数据类型单一,只支持字符串类型,redis数据类型丰富
  • 都是基于内存的,把全量数据存储在内存中,但redis支持数据持久化,memcache不支持,所以memcache一般只作为缓存使用
  • redis提供了丰富的特性,功能丰富、扩展性强
  • redis原生支持集群模式,集成了主从同步、哨兵机制,可用性强;memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据
  • memcache使用限制较多,比如key不能超过 250 个字节,value不能超过 1M,key 的最大失效时间是 30 天

以上也是redis相比memcached的优势。

如果问题是:你们项目用了redis,为什么不用其他缓存,比如memcached?

还需要结合业务进行分析,比如需要用redis做分布式锁、计数限流,需要用zset做榜单统计热销商品。

  • redis使用单线程,6.0开始也支持多线程,但默认关闭;memcache使用多线程。在存储的数据量少时,redis性能更高;在存储的数据量大时(超过100K),memcached使用了多线程,性能往往更高。
  • 使用底层模型不同,底层实现方式不同,与客户端之间的通信协议不同

redis的线程模型

redis处理网络请求使用的是单线程模型,通过 IO 多路复用来提高并发。redis内部用于处理网络请求的文件事件处理器(file event handler)是单线程的,所以叫做单线程模型。

文件事件处理器包含 4 个部分

  • 多个 socket
  • IO 多路复用程序
  • 文件事件分派器
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

文件事件处理器采用 IO 多路复用机制同时监听多个 socket ,将产生事件的 socket 压入队列中,文件事件分派器处理队列中的socket,根据 socket 的事件类型交给对应的事件处理器处理。

redis客户端与redis服务器的一次通信过程
在这里插入图片描述

redis的数据淘汰机制

redis的数据淘汰机制可分为2类

  • 设置了过期时间,过期自动删除(过期删除策略)
  • redis内存不足,需要淘汰部分数据(内存淘汰策略)

过期删除策略 | key失效机制

redis服务器会自动删除过期的key,使用的删除策略是定期删除+惰性删除

  • 定期删除:间隔指定时间(默认100s),随机抽取一部分设置了过期时间的key,检查是否过期,过期则删除。redis是单线程的,扫描检查设置了过期时间的全部key很耗性能、耗时长,所以折中抽取部分进行检查。
  • 惰性删除:访问key时先检查key是否已过期,过期则删除。

2种共同作用,惰性删除用于兜底,来删除定期删除没有删除的过期的key。

大量的key同时过期,定期删除时容器导致redis服务器卡顿,设置key的过期时间时尽量加一个随机值,以分散过期时间。

内存淘汰策略

redis配置文件中的2个相关配置项

  1. #最大内存占用,单位byte,此处设置为10GB
  2. maxmemory 10737418240
  3. #内存淘汰策略,缺省时默认为noeviction
  4. maxmemory-policy noeviction

内存占用达到maxmemory时,redis会使用指定的内存淘汰策略来回收内存。注意是内存淘汰策略,不是缓存。

redis常用的6种内存淘汰策略

  • noeviction:no eviction 禁止驱逐,默认策略,只处理读请求以及delete类型的写请求,不处理delete之外的写请求,防止写请求要添加、更新的数据丢失,内存占用达到上限时会出现只能读、不能写(增加、更新)的情况。
  • allkeys-lru:优先淘汰所有key中最近使用次数少的key。
  • allkeys-random:在所有的key中随机淘汰一部分key。
  • volatile-lru:优先淘汰设置了有效期(有效期不为-1)的key中的最近使用次数少的key。
  • volatile-random:在设置了有效期(有效期不为-1)的key中随机淘汰一部分key。
  • volatile-ttl:优先淘汰设置了有效期(有效期不为-1)的key中ttl值小(早失效)的key。

allkeys是在所有key中进行淘汰,volatile是只在设置了有效期(有效期不为-1)的key中进行淘汰,lru即Least Recently Used 最近最少使用。

redis实现的lru是近似lru,并非真实lru,不是完全可靠,即实际被淘汰的键并不一定是真正的最久未使用的。如果采用真实lru,对全部键空间进行数据淘汰,内存占用大、耗时长,redis是单线程的,对耗时操作十分谨慎,折中使用了近似lru,以减少内存占用、耗时,并进行了优化,让结果更接近真实的lru。

如果只是把redis作为缓存使用,可以使用noeviction之外的策略,否则尽量使用默认的noeviction,以保证数据不丢失。

发表评论

表情:
评论列表 (有 0 条评论,308人围观)

还没有评论,来说两句吧...

相关阅读

    相关 redis基础知识

    目录 一、关系数据库与非关系型数据库 1、关系型数据库 2、非关系型数据库 3、关系型数据库和非关系型数据库区别 3.1、数据存储方式不同 3.2、扩展方式不同