Redis

基本数据结构

  • String类型:热点数据,缓存对象,分布式锁,共享Session信息
  • List类型:消息队列
  • hash类型:缓存对象购物车,redission中可重入锁实现
  • set类型: 交集,并集,差集场景,比如点赞,共同关注
  • Zset类型:排序场景,比如排行榜
  • BitMap:适用于二值状态统计,比如说签到,判断用户的登录状态
  • GEO:存地理位置经纬度,比如滴滴打车
  • Stream:消息队列,能自动生成全局唯一ID

Zset实现排行榜和String

  • Zset是有序,唯一元素集合,并且带有score分数,zadd添加元素,zincrby可以给这个scope+1,Zscore返回分数,Zrank获得排名
  • 底层是这个压缩列表和跳表实现的,当元素个数小于128个并且每个元素值小于4的时候使用压缩列表,否则使用跳表
  • 跳表的查找就是在多个层级上跳来跳去,最后到这个指定元素,复杂度O(logN)。在mysql中使用B+树是为了降低树的高度,从而减少磁盘I/O的次数。但是redis是纯内存操作,指针跳转速度非常快,所以哪怕多跳转几次开销也很小,而且实现难度低
  • String使用的是SDS结构,主要由len(字符串长度),alloc(分配空间长度),flags(展示不同类型的SDS),字符数组

Redis为什么快

  • 大部分操作直接在内存中进行
  • 采用的是单线程模型,避免了多线程之间的竞争
  • I/O多路复用:通过epoll/select等机制,同时监听多个网络连接的I/O事件,避免单链接阻塞导致整体卡顿。当有某个连接可读/可写的时候,redis才会处理改连接的请求/响应,既保证了高并发处理能力,又避免了多线程资源竞争开销。
  • 在Redis6.0之后采用了多线程处理I/O网络请求,因为对着网络硬件的提升,redis的性能有时候会出现在这个网络I/O请求上,但是对于命令的执行还是使用单线程

Redis的两种持久化方式

  • AOF日志:每一次造作命令追加到一个文件。redis重启的时候会读取这个文件记录的命令,然后注意执行来进行数据的恢复,有三种回写磁盘策略:同步写回(可靠性高,最大程度上保证数据不丢失),每秒写回(性能适中,但是宕机可能丢失1秒的数据),由操作系统写回(宕机会丢掉很多数据)。优点:能很好的保证数据的安全性,而且支持多种同步策略。缺点就是AOF的文件通常比RDB文件更大,消耗更多的磁盘空间
  • RDB快照:将某一时刻内存数据以二进制的方式写入磁盘,只保存某一时刻的数据状态文件体积比较小,备份和恢复速度很快。缺点是如果两次快照之间服务器崩掉,这段时间的数据将会丢失。

过期删除和内存淘汰

  • 内存淘汰是在内存满了的时候,redis触发淘汰策略删除一些数据;过期删除是对已经过期的数据进行删除
  • 淘汰策略:1.不进行数据淘汰,内存满了如果有数据写入会报错禁止写入。 2.随机淘汰设置了过期时间的任意键值 3.优先淘汰更早过期的键值 4.淘汰所有设置了过期时间中最久没使用的 5.淘汰所有设置了过期时间中最少使用的键值 6.随机淘汰任意键值 6.随机任意淘汰 7.随机淘汰最久未使用的 8.淘汰整个键值中使用最少的键值
  • 过期删除策略:惰性删除+定期删除
  • 惰性删除:在访问或者修改key之前,检查是否过期,如果过期删除该key,如果没有过期不做任何处理
  • 定期删除:每隔一段时间随机选出一定数量(默认20个)key进行检查,并且删除其中的过期key

大Key问题

  • 大key问题就是key的value占用内存空间过大,导致redis性能下降,内存占用过高。可以对大Key进行拆分,对过期的数据定期清理。

布隆过滤器

  • 主要是由初始值为0的位图数组和N个哈希函数两部分组成。数据会先使用N个哈希函数对数据做哈希计算,得到N个哈希值,然后对数组长度取模,得到在位图数组中对应的位置,然后设置成1
  • 当数据来查找是否存在的时候也进行布隆过滤器计算,在对应的位置上只有有一个是0,就表示这个数据库一定不存在这个数据。
posted @ 2025-12-20 15:40  Huangyien  阅读(2)  评论(0)    收藏  举报