如你所说,任何事情都不是绝对的。虽然说是内存数据库,但是真的是所有数据都放到内存中吗?应该是这样的吧,否则还叫什么内存数据库,其实错了,任何事情都有轻重缓急,而且内存不可能有硬盘那么大,不必要的数据还是放在了硬盘上面。
目标只有一个:提升速度。
那么就没必要将不经常使用的数据放内存里了,毕竟数据多了速度也会变慢。同时一些没必要存储的数据其实可以直接在内存中销毁,没必要写入磁盘。所以有两种策略来实现这一目标
设置过期时间–>临时数据自动销毁
1 2 3 4
| expire key time # time单位为秒 setex(string key,int seconds,string value) # 字符串使用(特例)
ttl key # 查看过期时间
|
撤销设置的过期时间
1
| persist key # 如果不想销毁,可以撤销
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| eg: 127.0.0.1:6379> set name lanzhan # 插入数据key-value,name->lanzhan OK 127.0.0.1:6379> ttl name # 查看过期时间,-1为永不过期 (integer) -1 127.0.0.1:6379> expire name 20 # 设置过期时间为20s (integer) 1 127.0.0.1:6379> persist name # 撤销过期时间 (integer) 1 127.0.0.1:6379> ttl name # 现在又为永不过期 (integer) -1 127.0.0.1:6379> expire name 2 # 设置过期时间为2s (integer) 1 127.0.0.1:6379> ttl name # 已经过期,-2为已过期 (integer) -2 127.0.0.1:6379> keys * # 数据已销毁,不存在了 (empty list or set)
|
适合场景:临时数据(验证码),中间数据(类似与oracle中建的那些临时表)
LRU动态算法–>不用数据不加载到内存
redis启动时默认会将所有数据都加载到内存中,lru算法会将不常用数据在内存中销毁,需要时才会从硬盘中再次读取