Redis: redis是一个数据结构服务器,并不是传统意义上的key value存储;
key最大长度不得超过512M、value最大长度不得超过512M ;
key 可以设置过期时间,ttl key 可以获取key的剩余时间,当key未设置过期时间,ttl 返回-1 ,当key 已过期,ttl返回-2
支持 的数据结构:string、list、set、sortedset、hash 、bitmaps、HyperLogLogs 。
redis 官方默认支持的命令数在210个左右
1、 string 二进制安全
2、 list: 获取list长度的时间复杂度O(1),redis 底层实现是linked list 而不是array数组,list长度建议不要超过8Kb,否则会影响性能;
基于list 模拟实现一个有上限限制的list:lpush +ltrim 操作来实现,比如说存储用户最新上传的10张照片
涉及阻塞队列的数据结构:brpop、blpop 、brpoplpush
当往一个list中添加元素的时候,如果对应list不存在,会先创建list,在执行add元素值list中
当删除元素时,如果list对应长度为0时,redis会自动销毁该list ,这个操作都是又redis server来控制的,用户不用去关心这个,只需要调用相应的命令进行操作即可
3、hash:hash中field的数量并无限制,除了可用内存的影响
4. set:无序的字符串集合
5.sorted set:有序集合,唯一的、不重复的字符串集合,每一个元素对应有一个浮点值score,当a.scroe >b.score ,那么a对于b,如果a.score==b.score,那么按字典序来处理;
有序集合支持按字典排序查询操作
6. Bitmaps:严格上来说,bitmaps并不是一个数据类型,它只是string类型面型bit的一个集合,
应用场景:可以用bitset来统计每天的日活跃用户
关于key设置过期时间的几点说明:
1. 当针对一个设置有过期时间的key进行rename后,该key的过期时间会被传递到新的key上
2. 对于一个设置了过期时间的key,所有从概念上来讲修改了key对应的value而并不是用一个新的value替换一个旧的value的这种操作并不会影响该key的ttl,例如 incr、lpush、hset 等操作
3. 对一个key调用expire、pexpire设置一个非正整数的过期时间 或者expireat/pexpireat 设置一个历史的时间戳 ,等同于删除了 对应key
4. redis处理过期key 两种方式:
被动策略:当客户端访问key时,发现key 过期,这个时候会删除掉对应key
主动策略:
1秒中检查10次,也就是每100毫秒抽样一次
1.随机抽样检测过期键空间中的20个key
2.删除检测到的过期key
3. 如果超过25%的keys过期,则跳转到第一步继续执行
生成rdb 快照的时候,如果发现已过期key,并不会写入至rdb文件中