redis数据库总结
Redis有哪几种数据结构
redis一共有5中基本数据结构和4中高级数据结构
string类型
redis的所有的key都是string类型,对于值也可以存储为string类型。
string类型是以二进制存储的,所以它也可以存储图片、音视频等转换后的数据。
List类型
lis类型可以当作一个简易的消息队列使用,但是无法提供消息的成功消费、多次消费的功能
Set类型
redis的set类型类似于java中的set类型,他的数据也是不可重复的,但是在求并集交集等操作方面有较好的实现
ZSet类型
是一种排序的set类型,他为每一个set新增了一个score分数,set中的数据按照分数排序。
zset的底层数据结构是跳表,类似于一种树,有链表构成的树。用一倍的空间,换取了logn的查询复杂度
Map类型
Map类型和java中的hashmap基本一致
HyperLogLog类型
用概率论的算法统计网站的UV和PV,数据量高时,准确率很高
GEO
记录地理信息,经纬度
BitMap
32位的二进制,可以做签到等逻辑
stream
一种加强的消息队列数据结构,为每一个消息有唯一的id,可以支持多个消费者同时订阅消息,页可以对消息进行分组。
Redis的如何判断数据是否过期
redis有一个过期字典,我们添加一个带有过期时间的数据时,会将此数据的key和过期时间存入过期字典中。
每次查询时,会先查询过期字典中是否有查询的key值,如果没有则正常查询,如果有,如果没过期就正常查询,如果过期了就删除。
redis对过期数据的删除采用的是懒惰删除+定时删除的策略
懒惰删除是指:每次查询key时,如果发现key过期了,再进行删除
- 优点:惰性删除对CPU友好,只在每次访问时才检查key是否过期
- 缺点:对内存不友好,如果一个key过期了,切长时间没人访问,那么就不会释放内存。
定时删除是指:没隔一段时间,从过期字典中抽取20个key检查,如果发现过期的key超过25%则会继续抽取20个key,直到达到规定的删除时间,到达删除时间后,就算上一次抽取也有超过25%的key过期,也不会继续删除了。弥补了懒惰删除的缺点。
Redis的持久化
Redis集群
主从复制、哨兵模式、分片集群