Redis
命令参考:http://doc.redisfans.com/
单线程为何那么快
- redis 是存储在内存上的,读写的话不会受到硬盘 I/O 速度的限制
- 多路 IO 复用模型,非阻塞 IO 解释:多路:多网络连接 复用:复用同一个线程
- 数据结构简单,对数据操作也简单
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
支持的数据结构,底层实现
持久化:AOF、RDB
redis 使用,单机版、哨兵模式、集群
与 memcache 对比
实现分布式锁
缓存雪崩、缓存穿透、缓存击穿
- 缓存雪崩,是指在某一个时间段,缓存集中过期失效。
- 缓存击穿,是指一个 key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞
- 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果 key 不存在或者 key 已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
Redis 的应用场景
热点数据缓存、发布订阅、队列、分布式锁、登录 Token
Redis 支持的数据类型(必考)
- String,字符串
- Hash,HashMap
- List, 列表
- Set,集合
- ZSet,有序集合
Redis 的数据过期策略 + Redis 的 LRU 过期策略的具体实现
如何解决 Redis 缓存雪崩,缓存穿透问题
- 缓存雪崩,是指在某一个时间段,缓存集中过期失效。
- 缓存击穿,是指一个 key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞
- 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果 key 不存在或者 key 已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
Redis的管道pipeline
Redis 集群
redis 支持的数据类型
redis 分布式锁解决方案
https://www.cnblogs.com/cxyyh/p/11132161.html > https://cloud.tencent.com/developer/news/241627
悲观锁、乐观锁
redis 过期策略
- redis 的过期策略就是:定期删除 + 惰性删除
内存淘汰机制
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。这个一般很少用。allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key,这个是最常用的。allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。