redis整理与设置过期时间问题

一:redis数据类型简介

redis有五种数据类型,分别是String,Hash,List,set,zset。

String:二进制安全的(可包含任何数据,如jpg图片或者序列化对象,value最大为512m);

hash:类似于Java中的hashmap;

List:链表类型;arraylist?linkedlist?

set:底层是hashmap(无序,无重复);

Zset:游戏中常用的数据类型,每个元素匹配一个分数,元素不可重复,分数可以重复;

二:过期时间设置

    设置过期时间指的是在key上设置一个时间,使得key在这个时间之内存活,过了这个时间,则删除该key及其对应的值;redis中一般设置过期时间,而非使用del命令消除  元素;

    一旦设置了过期时间,这个key只能被命令清除、删除或者重写其内容。这些命令包含del、set、getset以及所有的*store命令。这些命令只能改变key对应的value的存储值而不改变过期时间的设置。

    例如:使用incr改变key对应的value、使用lpush添加一个新的元素到lists中、使用hset设置field对应value的值等等,这些操作都不影响已经对key设置的过期时间的属性。

1.通过expire命令实现:demo:expire key 10    ----->为给定的key设置过期时间为10秒

2.通过setex命令实现:demo:setex key 10  value ----->设置key的值为value,存活10秒--->针对key的value为String类型;

以上两种方式均是针对的key,为其设置过期时间;想要对value中的某一部分数据(其他数据类型)进行过期时间的设置,则需通过其他的方式进行;

设置了过期时间的key依然可以使用persist命令重新持久化。(PERSIST命令可以移除一个键的过期时间

注意:

      rename命令重命名key后,原始的key对应属性全部发生转移。如果key设置了过期时间,并且尚未被删除,使用rename命令重新命名后,该过期时间将转移到新的key上。

     如果调用expire或者pexpire时传给一个负值作为参数以及expireat或者pexpireat调用的时候时间戳已经过去,那么该key将直接被删除而不是等待过期。

刷新过期时间

       对一个设置了过期时间的key仍然可以调用expire更新其过期时间。

返回值

       设置过期时间会返回一个整数值;

        1)如果过期时间被设置成功,返回1;

        2)如果设置失败或者key不存在,则返回0;

原理:Redis每分钟执行10次检测:

       1)在所有的建中随机找到20个设置了过期时间的keys;

       2)删除其中已经过期的keys;

       3)如果超过25%的keys被删除,那么从1)开始再次执行,直到被删除的keys比例降低到25%以下;

       这意味着,任何给定的时刻,被过期删除的keys的数量最大等于每秒钟写操作执行次数除以4的最大值。

       过期清楚keys时复制链接和AOF文件的处理  

       为了保持一致性并获得较好的性能。当一个key过期时,删除AOF文件的del操作在master和slaves之间同步执行,这样不存在一致性错误的可能。

       然而,slaves是不可以单独的执行del操作的,而是等待master发送过来的del指令,而此时会携带全部的过期设置信息,所以当slave被选中成为master时,它就可以单独地清除过期的keys,完全像一个master一样。

redis失效时间问题:博客上看到的,未经验证;https://blog.csdn.net/duzm200542901104/article/details/78755401/

1、在没有设置Redis的Value的时候,设置key的失效时间没有用

2、对于Redis 字符串(String),设置了失效日期之后再设置值,那么将会丢掉失效日期

3、当Redis hash中的键值对清空的时候,这个redisKey也被Redis删除了,也就没有失效日期了

过期时间问题还可参考:

https://www.cnblogs.com/zhangchao-letv/p/6114030.html

猜你喜欢

转载自blog.csdn.net/qq_33999844/article/details/81390617