[转帖]Redis学习五(Spring Cache For Redis).

redis,学习,spring,cache,for · 浏览次数 : 0

小编点评

**概述** Spring Data Redis 是一个开源项目,它提供一套 API 方便地与 Redis 数据库进行交互的 Spring 数据框架。它提供了多个模板实现,可以根据不同的需求选择合适的模板。 **主要功能** * 缓存管理器:用于管理缓存中的数据条目。 * 序列化器:用于将对象序列化为字符串。 * Redis 连接工厂:用于创建 Redis 连接。 * 缓存缓存:包含多个模板,可以用于缓存不同的数据类型。 * API:提供一些便捷的方法和 API 来与 Redis 进行交互。 **主要配置属性** * `spring.data.redis.host`:redis服务器的地址。 * `spring.data.redis.port`:redis服务器的端口。 * `spring.data.redis.password`:redis服务器的密码。 * `spring.data.redis.poolSize`:连接到 Redis 的线程数量。 * `spring.data.redis.keySerializer`:用于序列化 keys 的序列化器。 * `spring.data.redis.valueSerializer`:用于序列化 values 的序列化器。 **使用示例** ```java @Autowired private RedisTemplate redisTemplate; // 设置连接属性 redisTemplate.setConnectionFactory(new JedisConnectionFactory()); // 获取值 String value = redisTemplate.opsForValue().get("key"); ``` **优点** * 简化了与 Redis 的交互。 * 提供了多种模板,可以根据不同的需求选择合适的模板。 * 提供了便捷的 API。 **注意** * Spring Data Redis 需要 Redis 服务器运行才能正常工作。 * 必须在配置 Spring Boot 应用中设置 Redis 地址、端口和密码。

正文

https://www.cnblogs.com/jmcui/p/8410560.html

一、概述

缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的。

常用的缓存数据库:

Redis   使用内存存储(in-memory)的非关系数据库,字符串、列表、集合、散列表、有序集合,每种数据类型都有自己的专属命令。另外还有批量操作(bulk operation)和不完全(partial)的事务支持 、发布与订阅、主从复制(master/slave replication)、持久化、脚本(存储过程,stored procedure)。 效率比ehcache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。
memcached   使用内存存储的键值缓存,键值之间的映射、创建命令、读取命令、更新命令、删除命令以及其他几个命令。为提升性能而设的多线程服务器。memcache在客户端中实现分布式缓存,通过分布式算法指定目标数据的节点。

ehcache    纯java实现,缓存在内存中,可持久化到硬盘,效率高于memcache;但是缓存共享麻烦,集群分布式应用不方便。如果是单个应用或者对缓存访问要求很高的应用,用ehcache。ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。

二、Spring Cache

    Spring 缓存的实现是通过创建一个切面(aspect)并触发Spring缓存注解的切点(pointcut)。根据所使用的注解以及缓存的状态,这个切面会从缓存中获取数据,将数据添加到缓存之中或者从缓存中移除某个值。Spring 能都与多个流行的缓存实现进行集成,实现步骤如下:

1、启用对缓存的支持

  • Java 配置 注解驱动缓存

----@EnableCaching

  • XML 声明的缓存

----<cache:annotation-driven>

2、缓存管理器

缓存管理器是 Spring 缓存抽象的核心,它能够与多个流行的缓存实现进行集成。Spring3.1 配置了五个缓存管理器实现:

  • SimpleCacheManager
  • NoOpCacheManager
  • ConcurrentMapCacheManager(它的缓存存储是基于内存的,所以它的生命周期是与应用关联的,对于生产级别的大型企业级应用程序,这可能并不是理想的选择)
  • CompositeCacheManager(系统同时使用多个缓存管理器集成)
  • EhCacheCacheManager

除了核心的Spring框架,Spring Data又提供了两个缓存管理器:

  • RedisCacheManager
  • GemfireCacheManager

3、为方法添加注解以支持缓存

Spring 提供的四个注解来声明缓存规则:

@Cacheable会条件性地触发对方法的调用,这取决于缓存中是不是已经有了所需要的值。
@CachePut采用了一种更为直接的流程。带有@CachePut注解的方法始终都会被调用,而且它的返回值也会放到缓存中。

3.1 @Cacheable 和 @CachePut 一些共有的属性:

 value:value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。主要作用是给 cache 取个名称!个人觉得,主要是为了在Spring 容器中可以更好的管理缓存对象。

 condition:调用方法前:如果SPEL表达式的值为false的话,将不会去走缓存。

                    调用方法后:如果SPEL表达式的值为false的话,将不会将返回值放在缓存中。。

unless:调用方法前:不进行判断。

              调用方法后:如果SPEL表达式的值是true的话,将不会将返回值放在缓存中。

key:指定的key的值就是我们要保存到缓存数据库中的key的值,但是这个key的指定有自己的一套方式,如下:

另外,需要说明的是 #result 不能用在@Cacheable 上是因为 #result 表示的是 方法调用的返回值。但是@Cacheable 可能不走方法,可能不会有返回值。所以就不太适用了。但是!但是!#result 可以用在@Cacheable的 unless 属性上,因为 unless 是在方法返回的时候再判断的,所以一定会有返回值!

3.2 @CacheEvict 的一些属性,指定了哪些缓存数目应该被移除: 

@CacheEvict 主要用在要移除一个数据条目的时候,同时移除这个数据条目在缓存中的 key 和 value。

3.3 @Cacheing

@Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关注解,其中拥有属性:cacheable、put、evict。

@Caching(cacheable=@Cacheable("users"),evict={@CacheEvict("cache2"),@CacheEvict(value="cache3",allEntries=true)})

三、Spring Data Redis

 Spring Data Redis包含了多个模板实现,用来完成Redis数据库的数据存取功能。

1、添加依赖

复制代码
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>1.8.7.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>
复制代码

 2、Redis连接工厂

为了创建Spring Data Redis的模板,我们首先需要有一个Redis连接工厂。Spring Data Redis提供了四个连接工厂供我们选择(这些连接工厂在适用上都是相同的):

  • JedisConnectionFactory
  • JredisConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory

3、RedisTemplate 和 StringRedisTemplate       

与其他的Spring Data项目类似,Spring Data Redis以模板的形式提供了较高等级的数据访问方案。Spring Data Redis提供了两个模板:

  • RedisTemplate
  • StringRedisTemplate

RedisTemplate 支持 Object类型 的key 和 Object类型 的value。而StringRedisTemplate则采用更简单粗暴的方式,只支持 String类型 的key 和String类型 的value。 

4、缓存管理器

上面提到,缓存管理器是Spring Cache 的核心。Spring Data Redis 有着自己的缓存管理器 RedisCacheManager,下面给出两种Spring Data Redis 配置的方式:

 基于Java配置类
 基于applicationContext.xml

5、key 和 value 的序列化器

当某个条目保存到Redis key-value存储的时候,key和value都会使用Redis的序列化器(serializer)进行序列化。Spring Data Redis提供了多个这样的序列化器,包括:

  • GenericToStringSerializer:使用Spring转换服务进行序列化;
  • JacksonJsonRedisSerializer:使用Jackson 1,将对象序列化为JSON;
  • Jackson2JsonRedisSerializer:使用Jackson 2,将对象序列化为JSON;
  • JdkSerializationRedisSerializer:使用Java序列化;
  • OxmSerializer:使用Spring O/X映射的编排器和解排器(marshaler和unmarshaler)实现序列化用于XML序列化;
  • StringRedisSerializer:序列化String类型的key和value。

RedisTemplate会使用JdkSerializationRedisSerializer,这意味着key和value都会通过Java进行序列化。StringRedisTemplate默认会使用StringRedisSerializer。

RedisTemplate 的 key 和 value 经过序列化存储可能会让你觉得奇怪,类似如下:

这是正常的,因为使用的是 java 的序列化,如果想要看起来比较舒服的,可以用 StringRedisSerializer 序列成字符串的样子。

6、API 

Spring Data Redis 提供了一套API 友好的操作Redis,如下:

对 Redis 的操作就不就不细讲了,具体的可以看我学习这方面内容时做的相关的练习,也包括前面内容的一些补充。写的还算详细吧!https://github.com/JMCuixy/SpringDataRedis

与[转帖]Redis学习五(Spring Cache For Redis).相似的内容:

[转帖]Redis学习五(Spring Cache For Redis).

https://www.cnblogs.com/jmcui/p/8410560.html 一、概述 缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的。 常用的缓存数据库: Redis 使用内存存储(in-memory)的非关系数据库,字符串、列表、集合、散列

[转帖]Redis学习二(数据操作).

阅读目录 key 操作 string 操作 list 操作 set 操作 zset 操作 hash 操作 HyperLogLog 操作 回到顶部 key 操作 删除 key:del key 批量删除key:redis-cli -a(密码)keys “QXJ_*”| xargs redis-cli -

[转帖]Redis学习笔记--Redis数据过期策略详解

本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存session,又或者只存放日行情股票数据)那么就会出现一下几个问题了 Redis会自己回收清理不用的数据吗?

[转帖]【Redis学习06】分布式锁及其优化

文章目录 前言1. 什么是分布式锁2. 分布式锁的实现2.1 基于Redis的分布式锁实现方法2.2 基于redis实现分布式锁的初级版本2.3 改进分布式锁2.4 基于Lua脚本改善分布式锁 前言 上一篇博客我们讲到秒杀问题的一人一单在单机模式下使用synchronized添加悲观锁能解决并发问题

[转帖]【Redis学习06】分布式锁及其优化

文章目录 前言1. 什么是分布式锁2. 分布式锁的实现2.1 基于Redis的分布式锁实现方法2.2 基于redis实现分布式锁的初级版本2.3 改进分布式锁2.4 基于Lua脚本改善分布式锁 前言 上一篇博客我们讲到秒杀问题的一人一单在单机模式下使用synchronized添加悲观锁能解决并发问题

[转帖]【Redis学习06】分布式锁及其优化

文章目录 前言1. 什么是分布式锁2. 分布式锁的实现2.1 基于Redis的分布式锁实现方法2.2 基于redis实现分布式锁的初级版本2.3 改进分布式锁2.4 基于Lua脚本改善分布式锁 前言 上一篇博客我们讲到秒杀问题的一人一单在单机模式下使用synchronized添加悲观锁能解决并发问题

[转帖]Redis学习六(Redis 阻塞的原因及其排查方向).

https://www.cnblogs.com/jmcui/p/13926397.html 一、慢查询 因为 Redis 是单线程的,大量的慢查询可能会导致 redis-server 阻塞,可以通过 slowlog get n 获取慢日志,查看详情情况。 回到顶部 二、bigkey 大对象 bigk

[转帖]Redis学习三(进阶功能).

https://www.cnblogs.com/jmcui/p/11707970.html 阅读目录 一、排序 二、事务 三、流水线(pipeline) 四、发布订阅 回到顶部 一、排序 redis 支持对 list,set 和 zset 元素的排序,排序的时间复杂度是 O(N+M*log(M))。

[转帖]Redis学习四(运维指南).

阅读目录 一、上线规划 二、常见运维操作 三、测试方法 回到顶部 一、上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性。 redis 的运行机器 CPU 不求核数多,但求主频高,Cache大,因为 redis

[转帖]Redis进阶实践之四Redis的基本数据类型

一、引言 今天正式开始了Redis的学习,如果要想学好Redis,必须先学好Redis的数据类型。Redis为什么会比以前的Memchaed等内存缓存软件使用的更频繁,适用范围更广呢?就是因为Redis使用起来更方便,之所以方便,是因为Redis支持的数据类型比以前的Memchaed缓存支持数据类型