redis
缓存过期策略?
定期删除
redis 默认是每过 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。
惰性删除
在删除 key 的时候,并不进行删除,下一次获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。
内存淘汰机制?
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key。
- allkeys-random:当内存不足以容纳新写入数据时,随机移除某个 key。
- volatite-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。
- volatite-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
- volatite-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
为什么使用 redis?
优势:
- 速度快。
- 支持多种数据类型。
- 功能丰富。
- 服务器简单。
- 客户端语言多。
- 支持持久化。
- 高可用,主从复制,分布式。
速度快
- c 语言实现。
- 纯内存操作,数据都在内存中。
- 单线程,避免线程切换及线程竞争带来的开销。
- 采用 epoll,非阻塞 IO,不再网络 IO 浪费时间。
单线程仅仅是说在网络请求这一模块上用一个请求处理客户端的请求,像持久化它就会重开一个线程/进程去进行处理。
多种数据类型
redis 共有 8 种数据类型,常用的是前 5 种。
- string:字符串
- hash:哈希
- list:列表
- set:集合
- zset:有序集合
- bitmaps:位图
- hyperloglog:
- GEO:地理信息定位
功能丰富
- 缓存:基础使用,存储高频次访问的数据。
- 排行榜:利用 zset 数据结构做。
- 计数器,限速器:利用 Redis 中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等。
- 好友关系:利用集合的交集,并集,差集实现。
- 简单的消息队列:自带的发布订阅系统。
- session 服务器:分布式系统中存储公共 session。
- 分布式锁:利用 sync 命令实现。
问题:
- 数据量太大不适合:redis 所有数据都存储在内存中,数据量会造成内存压力大。
- 访问频次低:redis 为了解决高频访问的问题,采用纯内存操作,低频次数据完全是浪费感情。