热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:SpringCacheForRedis

篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCacheForRedis相关的知识,希望对你有一定的参考价值。一、概

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Spring Cache For Redis相关的知识,希望对你有一定的参考价值。




一、概述

缓存(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 声明的缓存









----


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.datagroupId>
<artifactId>spring-data-redisartifactId>
<version>1.8.7.RELEASEversion>
dependency>
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>2.9.0version>
dependency>


View Code

 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 配置的方式:



@Configuration
@EnableCaching
@ComponentScan(basePackageClasses
= {RedisCacheService.class, CacheDao.class})
public class Config {
/*Redis 连接工厂*/
@Bean(name
= "redisConnectionFactory")
public JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory
= new JedisConnectionFactory();
jedisConnectionFactory.setHostName(
"127.0.0.1");
jedisConnectionFactory.setPort(
6379);
jedisConnectionFactory.setPassword(
"foobared");
jedisConnectionFactory.afterPropertiesSet();
return jedisConnectionFactory;
}
/*RedisTemplate */
@Bean(name
= "redisTemplate")
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate
redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.afterPropertiesSet();
redisTemplate.setKeySerializer(
new StringRedisSerializer());
redisTemplate.setValueSerializer(
new JdkSerializationRedisSerializer());
redisTemplate.setHashKeySerializer(
new StringRedisSerializer());
return redisTemplate;
}
/*Redis 缓存管理器*/
@Bean(name
= "cacheManager")
public CacheManager cacheManager(RedisTemplate redisTemplate) {
return new RedisCacheManager(redisTemplate);
}
}


基于Java配置类



<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.hostName}"/>
<property name="port" value="${redis.port}"/>
<property name="password" value="${redis.password}"/>
bean>

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="redisConnectionFactory"/>
bean>

<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
<constructor-arg ref="redisTemplate"/>
bean>


基于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



推荐阅读
author-avatar
天使的泪无人知晓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有