• Redis


    Redis 有哪些类型

    在 Redis 中有五种数据类型

    • String:字符串
    • Hash:字典
    • List:列表
    • Set:集合
    • Sorted Set:有序集合

    Redis 内部结构

    Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value。

    • type :代表一个 value 对象具体是何种数据类型。
    • encoding :是不同数据类型在 redis 内部的存储方式,比如:type=string 代表 value 存储的是一个普通字符串,那么对应的 encoding 可以是 raw 或者是 int,如果是 int 则代表实际 redis 内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:"123" "456"这样的字符串。
    • vm 字段:只有打开了 Redis 的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的。 Redis 使用 redisObject 来表示所有的 key/value 数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了给 Redis 不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用。

     Redis 使用场景

    • 缓存
    • 会话缓存
    • 时效性
    • 访问频率
    • 计数器
    • 社交列表
    • 记录用户判定信息
    • 交集、并集和差集
    • 热门列表与排行榜
    • 最新动态
    • 消息队列

    Redis 持久化机制

    Redis 有两种持久化机制:

    RDB

    RDB 持久化方式会在一个特定的间隔保存那个时间点的一个数据快照

    AOF

    AOF 持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。写操作命令记录的格式跟 Redis 协议一致,以追加的方式进行保存

    Redis 的持久化是可以禁用的,就是说你可以让数据的生命周期只存在于服务器的运行时间里。两种方式的持久化是可以同时存在的,但是当 Redis 重启时,AOF 文件会被优先用于重建数据。

     

    Redis 集群方案与实现

    • 客户端分片
    • 基于代理的分片
    • 路由查询
    • 客户端分片
    • 由客户端决定 key 写入或者读取的节点
    • 包括 Jedis 在内的一些客户端,实现了客户端分片机制

    路由查询

    将请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上执行。

    开源方案

    Sentinel

    为什么Redis是单线程的

    因为 CPU 不是 Redis 的瓶颈。Redis 的瓶颈最有可能是机器内存或者网络带宽。(以上主要来自官方 FAQ)既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。

    缓存崩溃

    • 碰到这种情况,一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
    • 加锁排队只是为了减轻数据库的压力,并没有提高系统吞吐量。假设在高并发下,缓存重建期间 key 是锁着的,这时过来 1000 个请求 999 个都在阻塞的。同样会导致用户等待超时,这是个治标不治本的方法

    缓存降级

    页面降级

    在大促或者某些特殊情况下,某些页面占用了一些稀缺服务资源,在紧急情况下可以对其整个降级,以达到丢卒保帅;

    页面片段降级

    比如商品详情页中的商家部分因为数据错误了,此时需要对其进行降级;

    页面异步请求降级

    比如商品详情页上有推荐信息/配送至等异步加载的请求,如果这些信息响应慢或者后端服务有问题,可以进行降级;

    服务功能降级

    比如渲染商品详情页时需要调用一些不太重要的服务:相关分类、热销榜等,而这些服务在异常情况下直接不获取,即降级即可;

    读降级

    比如多级缓存模式,如果后端服务有问题,可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景;

    写降级

    比如秒杀抢购,我们可以只进行Cache的更新,然后异步同步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。

    爬虫降级

    在大促活动时,可以将爬虫流量导向静态页或者返回空数据,从而保护后端稀缺资源。

    自动开关降级

    自动降级是根据系统负载、资源使用情况、SLA等指标进行降级。

    超时降级

    当访问的数据库/http服务/远程调用响应慢或者长时间响应慢,且该服务不是核心服务的话可以在超时后自动降级;比如商品详情页上有推荐内容/评价,但是推荐内容/评价暂时不展示对用户购物流程不会产生很大的影响;对于这种服务是可以超时降级的。如果是调用别人的远程服务,和对方定义一个服务响应最大时间,如果超时了则自动降级。

    使用缓存的合理性问题

    • 热点数据,缓存才有价值
    • 频繁修改的数据,看情况考虑使用缓存
    • 数据不一致性
    • 缓存更新机制
    • 缓存可用性
    • 缓存服务降级
    • 缓存预热
    • 缓存穿透
    忘了他,我撸代码养你
  • 相关阅读:
    Oracle 函数
    ecplise 修改编码
    mysql json 使用 类型 查询 函数
    java 子类强转父类 父类强转子类
    java UUID
    Java Number & Math 类
    java String类
    apache StringUtils 工具类
    apache ArrayUtils 工具类
    java Properties
  • 原文地址:https://www.cnblogs.com/theworld/p/12051034.html
Copyright © 2020-2023  润新知