点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- Hadoop(已更完)
- HDFS(已更完)
- MapReduce(已更完)
- Hive(已更完)
- Flume(已更完)
- Sqoop(已更完)
- Zookeeper(已更完)
- HBase(已更完)
- Redis (正在更新...)
章节内容
上一节我们完成了:
- RDB的配置方式、触发方式
- RDB的文件结构、优点、缺点
- AOF的配置方式、触发方式
- AOF的优点、缺点、瘦身方式
- RDB + AOF 混合方式
Redis性能
官方数据是:
- 读 110000次/s
- 写 81000次/s
长期使用,Key会不断地增加,Redis作为缓存使用,物理内存也会满。
所以需要一个过期淘汰的策略
。
MaxMemory
不设置的情况:
- Redis 的 Key 是固定的,不会增加。
- Redis 作为 DB 使用,保证数据的完整性,不允许淘汰,可以做集群进行扩展。
淘汰策略:
禁止驱逐(默认
设置)
设置的情况
Redis 作为缓存使用,不断地增加Key,MaxMemory默认是0不进行限制。
在服务器上,保留1G给操作系统,剩下的就可以用作Redis的缓存。
通过修改 redis.conf 可以配置这个值:
shell
maxmemory 1024mb
# 获取值
CONFIG GET maxmemory
设置MaxMemory
后,当趋近于
设置的值时,通过缓存的淘汰
策略,就会从内存中删除
。
Expire
(最常用的方式
)在 Redis 中可以使用 expire
设置一个键的存活时间,过了这段时间
,键会自动被删除
。
可以进行如下的测试:
shell
./redis-cli
# 2秒失效
expire name 2
get name
# 这种是永久有效
set name 123
ttl name
# 设置过期时间
expire name 10
ttl name
删除策略
Redis 数据的删除有定时删除
、惰性删除
、主动删除
三种方式。'
Redis 目前采用的是:
- 惰性删除
- 主动删除
定时删除
在设置键的过期时间时,创建一个定时器,让定时器在指定时间时删除键。
惰性删除
在 key 被访问的时候发现过期了,就删除这条数据。
主动删除
我们打开 redis.conf 可以配置主动删除的策略:
shell
# 默认是 no-enviction 不删除
maxmemory-policy allkeys-lru
主动删除: LRU
LRU(Least Recently Used)最近最少使用,算法根据数据的历史访问记录来进行淘汰数据。
其核心思想是:如果数据最近被访问过,那么将来被访问的概率也会更高
最常见的实现是使用一个链表
来保存数据:
新数据
插入到链表头部
- 每当
缓存命中
的时候,则将数据移动到链表的头部
- 当
链表满了
的时候,将链表尾部
的数据删除
- 在Java中可以使用LinkedHashMap来实现LRU
Redis-LRU
在服务器中保存了 LRU 计数器:server.lrulock
,会定时更新,这个值是根据 server.unixtime
来计算的。
LRU的数据淘汰机制是:在数据集中随机挑选几个值,取出其中LRU最大的淘汰掉。
volatile-lru
:从设置过期时间的数据集中挑选最少使用的淘汰allkeys-lru
:从数据集中挑选最近最少使用的数据淘汰
LFU
LFU(Least Frequency used)最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么将来一段时间内被使用的可能性也很小。
- volatile-lfu 同LRU
- allkeys-lfu 同LRU
- volatile-random 从设置过期时间的数据集中随机淘汰数据
- allkeys-random 从数据集中任意选择进行淘汰
TTL
volatile-ttl
从设置过期时间的数据里,选择快要过期的数据淘汰
noenviction
禁止驱逐数据,不淘汰
数据(默认
的)
淘汰策略选择
allkeys-lru
在不确定时一般采用的策略冷热数据交换
等volatile-lru
比allkeys-lru
性能要差,因为要查过期时间allkeys-random
希望请求符合平均分布(每个值被访问的概率差不多)- 自己控制
volatile-ttl