Redis生存时间、删除策略和排序
生存时间
设置命令
expire key long:设置数据在long秒后过期。
pexpire key long:设置数据在long毫秒后过期。
ttl key:查询数据剩余的生存时间。如果数据已过期被删除,返回-2(和版本有关),如果数据没有被设置过期时间,返回-1。
persist key:取消数据的生存时间,重新变成永久生存。
expireat key long:使用UNIX时间,设置数据存活到long时刻。long是从1980年8月1日开始到生存截止时间的秒数。
pexpireat key long:使用UNIX时间,设置数据存货到long时刻,long是从1980年8月1日开始到生存截止时间的毫秒数。
注意事项
(1)数据过期并不是表示一定会被立即删除
Redis不可能时时刻刻遍历所有被设置了生存时间的key,来检测数据是否已经到达过期时间,然后对它进行删除。这会产生大量的性能消耗,同时也会影响数据的读取操作。
在Redis中,采用了定期删除和惰性删除的策略来防止用户获取过期了的数据。
- 定期删除:定期随机获取某些数据,检测它们是否已经过期,对过期数据进行删除。
- 惰性删除:用户查询某个数据前,检查它的生存时间是否已经过期,如果是,对它进行删除。
(2)Set和GetSet命令会清除过期时间
执行了Set和GetSet命令对key重新赋值,会同时清除掉它的生存时间。要注意目前只有这两个命令能清楚生存时间,其余的如hset、lpush等均不行。
删除策略
Redis的最大内存和删除策略都是在配置文件中进行配置。
配置参数
maxmemory:配置最大可用内存。
maxmemory-policy:配置达到最大内存后的删除策略。
maxmemory-samples:指定删除策略中随机取数的个数。
注意事项
(1)删除策略
volatile-lru:从设置了生存时间的数据中,找到使用最少的数据删除(LRU算法是找出使用时间最久远的数据)。
allkeys-lru:从所有数据中,找到使用最少的数据删除。
volatile-random:从设置生存时间的数据中,随机删除一个数据。
allkeys-random:从所有数据中,随机删除一个数据。
volatile-ttl:删除设置了生存时间中,ttl查询出来的时间最少的数据。
noeviction:不删除数据,返回错误。
(2)删除策略并不会全表扫描
和数据过期的情形一样,假如使用volatile-lru策略,按字面意思Redis需要遍历所有的数据,找出他们最后一次的使用时间,然后比较谁最久没有被使用,就删除它。但是实际这样操作会产生极为严重的性能消耗,降低Redis的读写性能。因此在删除策略中,Redis也是采用了随机数据的方式,每次随机取某些数据,在这些数据中执行LRU算法,RANDOM算法,或者是找出TTL时间最少的数据,而不会扫描全部数据。至于每次取多少数据,通过参数maxmemory-samples配置。
排序
排序其实只有一个命令SORT,但是在这个命令后面可以配置许多不同的参数来满足不同的情况需求。
详细命令
SORT KEY [BY 参考键] [ALPHA] [DESC|ASC] [LIMIT OFFSET COUNT] [GET 参考键] [STORE KEY]
命令说明
sort key:最简单的排序命令,可以使用在列表类型、集合类型和无序集合类型中,将数字类型的键值按照从小到大的顺序排列,键值是字符串将返回错误。
下面的命令都是建立在sort key的基础上的扩展。
- sort key alpha:新增可以对字符串的排序。
- sort key desc:排序顺序变为从大到小。
- sort key limit offset count:常用在分页上。排序后,按从左往右的顺序从下标为offset的元素开始返回,一共返回count个元素。
- sort key store key1:将返回结果保存在key1上。
- sort key by 参考键:依照参考键内容进行排序,排序结果仍返回key的键值。参考键可以是字符串类型和散列类型,必须带*,否则不会执行排序。
- sort key get 参考键:排序后返回参考键的键值,参考键可以是字符串类型和散列类型。
下面会进行相关的样例说明
样例1:创建一个列表类型list=[0 6 2 4 8 9 3 1],对它进行排序,排序结果[0 1 2 3 4 6 8 9]。
注意:这里只是对list的数据作有序返回,而并没有改变list里面元素的顺序。如果此时再通过lrange list 0 -1直接输出list的内容,将仍然是[0 6 2 4 8 9 3 1]
样例2:创建一个列表类型list=[b c e d a],先直接用sort对它排序,会返回一个错误,根据错误提示我们可以发现sort其实是将键值转为双精度浮点类型的数据来进行比较的。字符串类型需要添加参数alpha来进行标注,告诉redis这里是对字符串类型排序。
样例3:使用样例2的list,使用desc对它进行了倒序排序。
样例4:使用样例2的list,限制了返回值要从从下标为2的元素开始,连续取两个元素返回(Redis中的下标从左往右是从0开始,从右往左是从-1开始)。
样例5:在样例4的基础上,使用store命令,将返回结果保存在list2中,查询list2的结果可以看到里面只有两个元素c和d
样例6:在样例2的list上,我们这里又创建了三个字符串类型数据s:a=3,s:b=5,s:c=-2。然后使用by 参考键来指定list的排序方式。
在这里有几个奇怪的地方:
- 返回的结果是字符串类型,但是我们没有使用alpha参数。
- 在不使用desc的情况下,默认是按从小到大的顺序排序,正常的应该是[a b c d e],但是实际返回的顺序是[c d e a b]
由于我们在这里使用了'by 参考键',因此它排序实际是依据s:*的键值来进行,因为我们list的键值是[a b c d e],用它们替代by s:*的通配符,分别对应[s:a s:b s:c s:d s:e],由于s:d和s:e并不存在,因此会使用0来作为他们的键值,因此取出来的数据是[3 5 -2 0 0],这些都是数字类型,因此并不需要使用alpha参数,同时对他们按从小到大的顺序排序[-2 0 0 3 5],分别对应[s:c s:d s:e s:a s:b],对应list的值就是[c d e a b],里面s:d和s:e都是0,当使用参考键的键值不能排序的时候,会再按照list里的键值进行排序,因此最终结果是[c d e a b]。
样例7:在样例6的基础上,我们使用'get 参考键'来获取数据,排序使用的是list的键值,因此排序结果是[a b c d e],然后匹配get后面的参考键s:*,可以匹配为[s:a s:b s:c s:d s:e],由于s:d和s:e不存在,因此返回nil。
注意事项
- by和get的参考键中没有*时,不会进行排序。
- by和get的参考键键值相等时,会在按照key的键值排序。
- 如果key的键值匹配by的参考键组成的键不存在,则默认键值为0。
- 在by和get的参考键中,*只能使用在字符串类型和散列类型的键上,不能使用在散列类型的域上。
- 由上一条引发出来的问题,如果将*使用在散列类型的域上,由于Redis检测参考键中有*,因此会进行排序,但是不会用key的键值替换*,因此只是按照key的键值进行的排序。
- get可以返回多个元素,以'get 参考键 get 参考键...'的形式排列,同时如果要返回*的内容,使用get #
排序时间复杂度
sort时间复杂度是O(n+mlogm),其中n是被排序数据的个数,m是返回结果的个数。
因此,如果要优化sort性能,只要考虑减小n和m的值即可。
- 尽可能减少待排序中元素的数量。
- 尽可能使用limit减少返回的元素数量。
- 尽可能得将返回结果使用store保存,而不是直接返回。
Redis生存时间、删除策略和排序的更多相关文章
- Redis淘汰删除策略
Redis淘汰删除策略 Redis淘汰删除策略6种淘汰Key策略3种删除过期键策略定时删除惰性删除定期删除其他模块的淘汰处理RDB 快照持久化创建载入AOF 只追加持久化写入重写主从复模式下对过期键的 ...
- 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?
作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...
- redis 数据删除策略和逐出算法
数据存储和有效期 在 redis 工作流程中,过期的数据并不需要马上就要执行删除操作.因为这些删不删除只是一种状态表示,可以异步的去处理,在不忙的时候去把这些不紧急的删除操作做了,从而保证 redis ...
- Redis详解(十一)------ 过期删除策略和内存淘汰策略
在介绍这篇文章之前,我们先来看如下几个问题: ①.如何设置Redis键的过期时间? ②.设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗? ③.如何设置R ...
- 【Redis】过期键删除策略和内存淘汰策略
Redis 过期键策略和内存淘汰策略 目录 Redis 过期键策略和内存淘汰策略 设置Redis键过期时间 Redis过期时间的判定 过期键删除策略 定时删除 惰性删除 定期删除 Redis过期删除策 ...
- redis中关于过期键的删除策略
我们已经了解到了Redis是一种内存数据库,Redis中数据都是以key-value的形式存储在内存中.由Redisserver来维护和管理这部分内存,内存是何足珍贵,不须要的数据或者是已经使用过的无 ...
- Redis 键的过期删除策略及缓存淘汰策略
前言 Redis缓存淘汰策略与Redis键的过期删除策略并不完全相同,前者是在Redis内存使用超过一定值的时候(一般这个值可以配置)使用的淘汰策略:而后者是通过定期删除+惰性删除两者结合的方式进行内 ...
- Redis详解(四)——删除策略
Redis详解(四)--删除策略 Redis中的数据特征 Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令来获取其状态,当 key 不存在时,返回 -2 . 当 k ...
- Redis 过期键删除策略
Redis 中数据库键的过期时间都保存在过期字典中,当一个键过期了,Redis 存在三种不同的删除策略:定时删除.惰性删除和定期删除 定时删除 定义 在设置键的过期时间的同时创建一个计时器,让定时器在 ...
随机推荐
- 夏令营501-511NOIP训练17——蛇形矩阵
传送门:QAQQAQ 题意:话说小X在孩提时,都会做标准的蛇形矩阵了,发现很好玩.现在的小X很想对其进行改版,变为如下类型的一个无限大蛇形数阵:令S(x)表示以1为左上角,x为右下角的矩形内所有数之和 ...
- 第六篇:fastJson常用方法总结
1.了解json json就是一串字符串 只不过元素会使用特定的符号标注. {} 双括号表示对象 [] 中括号表示数组 "" 双引号内是属性或值 : 冒号表示后者是前者的值(这个值 ...
- C# 中的三个高级参数 params
params params 关键字可以指定采用数目可变的参数的方法参数. 可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组. 还可以不发送参数. 在方法声明中的 params 关键 ...
- Eclipse Unable to install breakpoint in XXX 解决办法
Debug 时偶尔会出现:Eclipse Unable to install breakpoint in XXX 情况一: 清除所有断点就行了,原因是断点打到注释上了. breakpoint 窗口: ...
- 打开新窗口(window.open) open() 方法可以查找一个已经存在或者新建的浏览器窗口。 语法: window.open([URL], [窗口名称], [参数字符串])
打开新窗口(window.open) open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 参数说明: URL: ...
- Luogu P2827 蚯蚓(模拟)
P2827 蚯蚓 题意 题目描述 本题中,我们将用符号\(\lfloor c\rfloor\)表示对\(c\)向下取整,例如:\(\lfloor 3.0\rfloor =\lfloor 3.1\rfl ...
- Python全栈开发:基本数据类型
1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2 ...
- 【珍惜时间】vuepro
老规矩放上大大的github开源地址:https://github.com/goodheart222/vuepro 我们再来看看项目的效果,初步根据效果做到心中有数 看到效果的话,我们会发现,肯定是有 ...
- selenium学习笔记11——driver.get(url) 页面加载时间太长
在执行自动化测试用例过程中,发现因为网络慢或其他原因导致driver.get(url) 时,页面一直在加载,页面没有加载完成就不会去继续执行下面的动作,但是实际上需要操作的元素已经加载出来了. 解决方 ...
- Aria2 使用
没错,又是受够了迅雷.旋风的各种奇葩减速(哥哥我还买了了VIP!),IDM 对协议支持又太少还有事没事提示你不是正版三天两头闹着要更新.于是我想起来之前看到过的 Aria2,虽然之前也只是略有耳闻,但 ...