一: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失效时间问题:博客上看到的,未经验证;
1、在没有设置Redis的Value的时候,设置key的失效时间没有用
2、对于Redis 字符串(String),设置了失效日期之后再设置值,那么将会丢掉失效日期
3、当Redis hash中的键值对清空的时候,这个redisKey也被Redis删除了,也就没有失效日期了