• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Redis和Spring Cache使用简介

武飞扬头像
wanghowie
帮助1

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( 删除值)。
  • 列表(List):Redis 列表可执行的操作和Java里面的列表操作非常相似,常用操作如下:
    • LPUSH命令和RPUSH命令分别用于将元素推入列表的左端(left end)和右端(right end);
    • LPOP命令和RPOP命令分别用于从列表的左端和右端弹出元素;
    • LINDEX命令用于获取列表在给定位置上的一个元素;
    • LRANGE命令用于获取列表在给定范围上的所有元素。
  • 集合(Set):与列表类似,但是通过散列表保证存储的每个元素不一样。与Java的Set类似,存储元素无序,可以通过SADD添加元素,SREM移除元素,SISMEMBER检查元素是否在集合内;
  • 散列(HSet):Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户同样可以对散列存储的数字值执行自增操作或者自减操作。
  • 有序集合:有序集合和散列一样,都用于存储键值对:有序集合的键被称为成员(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 = { //更新缓存可以通过id,message进行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. 读多写多,直接去数据库查询就行

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgjfchf
系列文章
更多 icon
同类精品
更多 icon
继续加载