Redis 基础知识
目录
- 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个相关配置项
#最大内存占用,单位byte,此处设置为10GB
maxmemory 10737418240
#内存淘汰策略,缺省时默认为noeviction
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,以保证数据不丢失。
还没有评论,来说两句吧...