Redis与Spring Cache使用简介

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    Redis与Spring Cache使用简介

    Redis基本介绍

    Redis简介

    高性能键值缓存服务器memcached也经常被拿来与Redis进行比较

    • 这两者都可用于存储键值映射性能也相差无几但是Redis能够自动以两种不同的方式将数据写入硬盘并且Redis除了能存储普通的字符串键之外还可以存储其他4种数据结构而memcached只能存储普通的字符串键。
    • 这些不同之处使得Redis可以用于解决更为广泛的问题并且既可以用作主数据库primary database使用又可以作为其他存储系统的辅助数据库auxiliary database使用。

    Redis拥有两种不同形式的持久化方法它们都可以用小而紧凑的格式将存储在内存中的数据写入硬盘

    • 第一 种持久化方法为时间点转储point-in-time dump转储操作既可以在“ 指定时间段内有指定数量的写操作执行”这一条件被满足时执行又可以通过调用两条转储到硬盘dump-to-disk命令中的任何一条来执行
    • 第二种持久化方法将所有修改了数据库的命令都写入一个只追加append-only文件里面用户可以根据 数据的重要程度将只追加写入设置为从不同步sync、每秒同步一次或者每写入一个命令就同步一次。

    Redis数据结构

    • 字符串String与Java的字符串相似常用操作 GET 获取值、 SET 设置值 和 DEL 删除值。
    • 列表ListRedis 列表可执行的操作和Java里面的列表操作非常相似,常用操作如下
      • LPUSH命令和RPUSH命令分别用于将元素推入列表的左端left end和右端right end
      • LPOP命令和RPOP命令分别用于从列表的左端和右端弹出元素
      • LINDEX命令用于获取列表在给定位置上的一个元素
      • LRANGE命令用于获取列表在给定范围上的所有元素。
    • 集合Set与列表类似但是通过散列表保证存储的每个元素不一样。与Java的Set类似存储元素无序可以通过SADD添加元素SREM移除元素SISMEMBER检查元素是否在集合内
    • 散列HSetRedis的散列可以存储多个键值对之间的映射。和字符串一样散列存储的值既可以是字符串又可以是数字值并且用户同样可以对散列存储的数字值执行自增操作或者自减操作。
    • 有序集合有序集合和散列一样都用于存储键值对有序集合的键被称为成员member每个成员都是独各不相同而有序集合的值则被称为分值 score分值必须为浮点数。 有序集合是Redis里面唯一一个既可以根据成员访问元素这一点和散列一样又可以根据分值以及分值的排列顺序来访问元素的结构。

    数据安全与性能保障

    1. 持久化方法
      1. 快照(snapshotting)将某一时刻的所有数据写入硬盘
        1. 客户端通过向Redis发送BGSAVE命令来创建一个快照此时Redis会调fork来创建一个子进程然后子进程负责将快照写入硬盘而父进程则继续处理命令请求。Windows不支持BGSAVE命令。
        2. 客户端通过向Redis发送SAVE命令来创建一个快照与BGSAVE相比当接到SAVE命令后Redis服务器在创建完快照前不在响应任何命令。
        3. Redis配置文件配置save选项当条件满足时Redis自动出发BGSAVE命令。
        4. 当Redis通过SHUTDOWN命令关闭服务器请求时或者收到标准TERM信号时会执行SAVE命令SAVE执行完毕后关闭服务器。
        5. 当从Redis服务器连接主Redis服务器并向起发送SYNC命令来开始一次复制操作时主服务器目前没有执行BGSAVE操作或者主服务器并非刚刚执行完BGSAVE操作时那么主服务器会执行BGSAVE命令。
      2. 只追加文件(append-only-file,AOP)执行写命令时将被执行的写命令复制到硬盘
        1. AOF通过设置appendonly=yes来设置。
        2. AOF可能通过设置appendsync配置选项AOF对文件的同步频率有三个选项always每个写命令都要同步写入硬盘严重降低Redis速度、everysec每秒执行一次同步显示地将多个写命令同步到硬盘、no操作系統决定何时同步
      3. 快照方法适应于丢失部分数据不会对系统造成影响的应用否则考虑使用AOF。AOF文件大小是一个问题当文件过大时要重写或者压缩AOF文件。
    2. Redis主从设置提高性能
      1. 从服务必须有的一个slaveof属性指定主服务器。对于一个正在运行的Redis服务器用户可以通过发送SLAVEOF no one命令让服务器终止复制操作不再接受主服务器的数据更新也可以通过发送SLAVEOF host port命令让服务器开始复制一个新的主服务器。
      2. Redis不支持主主复制。
      3. 从服务器连接主服务器后从服务器之前的数据会丢失。
      4. 主从链从服务可以有自己的从服务器但是当M服务器的从服务器X有从服务器Y时当X执行解析M服务器的快照时X将断开与Y的连接导致Y需要重新连接并重新同步
    3. Redis事务

    参考书

    Redis 实战 黄健宏译

    Spring Cache

    Spring Cache利用了AOP实现了基于注解的缓存功能并且进行了合理的抽象业务代码不用关心底层是使用了什么缓存框架只需要简单地加一个注解就能实现缓存功能了而且Spring Cache也提供了很多默认的配置。在用例中RedisConfig.java对CacheManager配置进行了自定义。

    Redis配置

    通常情况下可以直接使用Spring Redis的默认配置但是默认配置有一些缺陷比如RedisTemplate序列化策略是JDK的序列化策略。这就导致当我们通过redis客户端查看缓存数据的时候键和值都被序列化不利于维护但不影响使用。
    在应用中多数情况下我们缓存的数据是对象目前对对象的处理往往都是通过json去序列化数据所以通常在使用redis的时候我们都会自定义一些配置方便使用。

    RedisConfig.java类提供了配置的模板可以参照这个来配置RedisTemplate。
    使用redis时首先需要部署redis服务器在默认情况下yml文件可以不配置相关属性但是当应用与redis服务器不在同一台机器上时需要配置配置demo如下

    spring:
        redis:
            host: 192.168.7.74
            port: 7397
            password: redis_007196_7413@JJMatch
    

    常用的Spring缓存注解

    Spring对Cache有统一的管理并且提供了一些缓存注解常用的用如下四个

    1. @Cacheable缓存存在则使用缓存不存在则执行方法并将结果塞入缓存
    @Cacheable(value = "DemoById",key = "#id")
    
    1. @CachePut更新缓存当缓存存在时更新当不存在的时候将结果塞入缓存
    @CachePut(value = "DemoById",key = "#id")
    
    1. @CacheEvict失效缓存
    @CacheEvict(value = "DemoById",key = "#id")
    
    1. @Caching前三个注解的综合体
      1. key默认自动生成缓存的名字SimpleKey
      2. 缓存的value的值。默认使用jdk序列化机制将序列化后的数据存到redis
      3. 默认ttl时间 -1
      4. 举例
    @Caching(
             cacheable = {
               @Cacheable(value = "DemoById", key = "#id")
             },
             put = { //更新缓存可以通过idmessage进行key值查找。
               @CachePut(value = "DemoById", key = "#result.id"),
               @CachePut(value = "DemoById", key = "#result.message")
             },
             evict = {
               @CacheEvict(value = "DemoById", key = "#result.id")
             }
          )`
    

    当然也可以不用这些注解直接在注入RedisTemplate来操作缓存。

    Spring Cache 的不足

    1. 读模式
      1. 缓存穿透查询一个null数据开启缓存空数据配置spring.cache.redis.cache-null-values=true
      2. 缓存击穿大量并发进来查询一个正好过期的数据解决加锁
      3. 缓存雪崩大量的key同时过期解决加过期时间spring.cache.redis.time-to-live=3600000
    2. 写模式缓存与数据库一致
      1. 读写加锁
      2. 引入Canal感知到MySQL的更新去更新数据库
        Alibaba Canal主要用途是基于 MySQL 数据库增量日志解析提供增量数据订阅和消费主要包括如下业务 数据库镜像 、数据库实时备份 、索引构建和实时维护(拆分异构索引、倒排索引等)、业务 cache 刷新 、带业务逻辑的增量数据处理
      3. 读多写多直接去数据库查询就行
  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    标签: Springredis