美文网首页
reids 使用总结

reids 使用总结

作者: 风洛神 | 来源:发表于2022-05-17 10:18 被阅读0次
    • Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库,键的类型只能为字符串。
      支持五种基本的数据类型:字符串(String)、列表(List)、集合(Set)、散列表(Hash)、有序集合(Sort Set)。
      其他高级数据类型:HyperLogLog,发布订阅,事务,脚本,GEO, Stream

    • 优点


    读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
    
    支持数据持久化,支持AOF和RDB两种持久化方式。
    
    支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
    
    数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
    
    支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
    
    • Redis应用场景

    1. 计数器
      可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。
    2. 缓存
      缓存一些热点数据等,也可以缓存序列化后的对象数据
    3. 回话缓存
    4. 全页缓存(?)
    5. 查找表(?)
    6. 消息队列(订阅/发布)
    7. 分布式锁功能
    8. 其他
      Set 可以实现交集、并集等操作,从而实现共同好友等功能。ZSet 可以实现有序性操作,从而实现排行榜等功能。
    • 持久化

    1. RDB(默认:如果开启了持久化,且没有配置策略)
      按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
      优点:
    1. 只有一个文件 dump.rdb,方便持久化。
    2. 容灾性好,一个文件可以保存到安全的磁盘。
    3. 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能。
    4. 相对于数据集大时,启动恢复数据时比 AOF 的效率更高。
    

    缺点:

    1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)
    2、AOF(Append-only file)持久化方式:是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储)保存为 aof 文件。
    
    1. AOF
      AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
      当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
      优点:
      1、数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。
      2、通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
      3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
      缺点:
      1、AOF 文件比 RDB 文件大,且恢复速度慢。
      2、数据集大的时候,比 rdb 启动效率低。

    优缺点是什么?
    AOF文件比RDB更新频率高,优先使用AOF还原数据。
    AOF比RDB更安全也更大
    RDB性能比AOF好
    如果两个都配了优先加载AOF

    • Redis的过期键的删除策略
      Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。
      过期策略通常有以下三种:

      1. 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量
      2. 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
      3. 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
        (expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)

      Redis中同时使用了惰性过期和定期过期两种过期策略。

    • Redis key的过期时间和永久有效分别怎么设置?


    EXPIRE和PERSIST命令

    • 缓存异常

    1. 缓存雪崩

    缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

    解决方案

    • 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
    • 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
    • 给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。
    1. 缓存穿透

    缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

    解决方案

    • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
    • 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
    • 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

    相关文章

      网友评论

          本文标题:reids 使用总结

          本文链接:https://www.haomeiwen.com/subject/joheeltx.html