Spring-data-redis redis
什么是spring-data-redis
spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis也都属于redis的java客户端,他们之间是无法兼容的,如果你在一个项目中使用了jedis,然后后来决定弃用掉改用jdbc-redis就比较麻烦了,spring-data-redis提供了redis的java客户端的抽象,在开发中可以忽略掉切换具体的客户端所带来的影响,而且他本身就属于spring的一部分,比起单纯的使用jedis,更加稳定.管理起来更加自动化.(当然jedis的缺点不止以上).
spring-data-redis的特性
1.自动管理连接池,提供了一个高度封装的RedisTemplate类
2.针对jedis客户端的大量api进行了归类封装,把同一类型的操作封装成了Operation接口.支持redis中的五种数据类型的操作.
3.针对数据的"序列化与反序列化",提供了多种可以选择的策略(RedisSerializer)
JdkSerializationRedisSerializer:当需要存储java对象时使用.
StringRedisSerializer:当需要存储string类型的字符串时使用.
JacksonJsonRedisSerializer:将对象序列化成json的格式存储在redis中,需要jackson-json工具的支持,(目前我还没使用过,不了解)
Operations
redisTemplate有两个方法经常用到,一个是opsForXXX一个是boundXXXOps,XXX是value的类型,前者获取到一个Opercation,但是没有指定操作的key,可以在一个连接(事务)内操作多个key以及对应的value;后者会获取到一个指定了key的operation,在一个连接内只操作这个key对应的value.
存储
Redis的配置
package springmvc.rootconfig;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
@Configuration
@EnableCaching
public class CachingConfig {
/**
* 连接Redis
*
* @return
*/
@Bean
public JedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
// host地址
jedisConnectionFactory.setHostName("10.10.13.12");
// 端口号
jedisConnectionFactory.setPort(6379);
jedisConnectionFactory.afterPropertiesSet();
return jedisConnectionFactory;
}
/**
* RedisTemplate配置
*
* @param redisCF
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(
RedisConnectionFactory redisCF) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(redisCF);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
Redis连接工厂
- JedisConnectionFactory
- JredisConnectionFactory
- LettuceConnectionFactory
- SrpConnectionFactory
建议自行测试选用合适自己的连接工厂
如果使用的是localhost和默认端口,则这两项的配置可以省略
RedisTemplate
- RedisTemplate
- StringRedisTemplate
RedisTemplate能够让我们持久化各种类型的key和value,并不仅限于字节数组
StringRedisTemplate扩展了RedisTemplate,只能使用String类型
StringRedisTemplate有一个接受RedisConnectionFactory的构造器,因此没有必要在构建后在调用setConnectionFactory()
使用RedisTemplateAPI
方法 | 子API接口 | 描述 |
---|---|---|
opsForValue() | ValueOperations | 描述具有简单值的条目 |
opsForList() | ListOperations | 操作具有list值的条目 |
opsForSet() | SetOperations | 操作具有set值的条目 |
opsForZSet() | ZSetOperations | 操作具有ZSet值(排序的set)的条目 |
opsForHash() | HashOperations | 操作具有hash值的条目 |
boundValueOps(K) | BoundValueOperations | 以绑定指定key的方式,操作具有简单值的条目 |
boundListOps(K) | BoundListOperations | 以绑定指定key的方式,操作具有list的条目 |
boundSetOps(K) | BoundSetOperations | 以绑定指定key的方式,操作具有set的条目 |
boundZSet(K) | BoundZSetOperations | 以绑定指定key的方式,操作具有ZSet(排序的set)的条目 |
boundHashOps(K) | BoundHashOperations | 以绑定指定key的方式,操作具有hash值的条目 |
操作
package springmvc.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import springmvc.bean.Order;
import springmvc.orders.db.OrderRepository;
@Controller
public class HomeController {
@Autowired
RedisTemplate<String, Object> redisTemplate;
@RequestMapping(value = { "/", "index" }, method = RequestMethod.GET)
public String index() {
redisTemplate.opsForValue().set("gege", 11);
System.out.print(redisTemplate.opsForValue().get("gege"));
return "index";
}
}
//创建List条目,key是cart
BoundListOperations<String, Object>cart=redisTemplate.boundListOps("cart");
//删除最后的一条数据
cart.rightPop();
//在最后,添加一条数据
cart.rightPush("我笑了");
Key和Value序列化
如果要使用到JavaBean,需要其实现Serializable接口,将其序列化
或者使用Spring Data Redis提供的序列化器
- GenericToStringSerializer:使用Spring转换服务进行序列化
- JacksonJsonRedisSerializer:使用Jackson1,将对象序列化为JSON
- Jackson2JsonRedisSerializer:使用Jackson2,将对象序列化为JSON
- JdkSerializationRedisSerializer:使用Java序列化
- OxmSerializer:使用Spring O/X映射的编排器和解排器实现序列化,用于XML序列化
- StringRedisSerializer:序列化String类型的key和value
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Order>(Order.class));
缓存
配置
在配置文件中追加如下代码
/**
* 缓存管理器
* @param redisTemplate
* @return
*/
@Bean
public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
RedisCacheManager cacheManager =new RedisCacheManager(redisTemplate);
//设置过期时间
cacheManager.setDefaultExpiration(10);
return cacheManager;
}
使用注解进行缓存数据
注解 | 描述 |
---|---|
@Cacheable | 表明Spring在调用方法之前,首先应该在缓存中查找方法的返回值,如果这个值能够找到,就会返回缓存的值。否则,这个方法就会被调用,返回值会放到缓存之中 |
@CachePut | 表名Spring应该将方法的返回值放到缓存中。在方法的调用前并不会检查缓存,方法始终都会被调用 |
@CacheEvict | 表明Spring应该在缓存中清除一个或多个条目 |
@Caching | 这是一个分组的注解,能够同时应用多个其他的缓存注解 |
@Cacheable与@CachePut的一些共有属性
属性 | 类型 | 描述 |
---|---|---|
value | String[] | 要使用的缓存名称 |
condition | String | SpEL表达式,如果得到的值是false的话,不会将缓存应用到方法调用上 |
key | String | SpEL表达式,用来计算自定义的缓存key |
unless | String | SpEL表达式,如果得到的值是true的话,返回值不会放到缓存之中 |
package springmvc.orders.db;
import java.util.List;
import org.springframework.cache.annotation.Cacheable;
import springmvc.bean.Order;
public interface OrderOperations {
@Cacheable("spittle")
List<Order> findOrdersByType(String t);
}
缓存切面会拦截调用并在缓存中查找之前以名spittle存储的返回值。缓存的key是传递到findOrdersByType()方法中的t参数。如果按照这个key能够找到值的话,就会返回找到的值,方法就不会被调用。如果没有找到值的话,那么就会调用这个方法
当在接口方法添加注解后,被注解的方法,在所有的实现继承中都会有相同的缓存规则
@CacheEvict
@CacheEvict("spittle")
void remove(String Id);
@CacheEvict能够应用在返回值为void的方法上, 而@Cacheable和@CachePut需要非void的返回值,他将会作为放在缓存中的条目
属性 | 类型 | 描述 |
---|---|---|
value | String[] | 要使用的缓存名称 |
key | String | SpEL表达式,用来计算自定义的缓存key |
condition | String | SpEL表达式,如果得到的值是false的话,缓存不会应用到方法调用上 |
allEntries | boolean | 如果为true的话,特定缓存的所有条目都会被移除 |
beforeInvocation | boolean | 如果为true的话,在方法调用之前移除条目,如果为false的话,在方法成功调用之后在移除条目 |
Spring-data-redis redis的更多相关文章
- Spring Data操作Redis详解
Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis ...
- Spring Data操作Redis时,发现key值出现 \xac\xed\x00\x05t\x00\tb
原文链接:http://blog.csdn.net/yunhaibin/article/details/9001198 最近在研究redis,以及spring data对redis的支持发现了一个奇怪 ...
- Spring Data 教程 - Redis
1. Redis简介 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- Spring Boot使用Redis进行消息的发布订阅
今天来学习如何利用Spring Data对Redis的支持来实现消息的发布订阅机制.发布订阅是一种典型的异步通信模型,可以让消息的发布者和订阅者充分解耦.在我们的例子中,我们将使用StringRedi ...
- spring data redis RedisTemplate操作redis相关用法
http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...
- spring mvc Spring Data Redis RedisTemplate [转]
http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...
- Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解
一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...
- Spring Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- Spring data redis的一个bug
起因 前两天上线了一个新功能,导致线上业务的缓存总是无法更新,报错也是非常奇怪,redis.clients.jedis.exceptions.JedisConnectionException: Unk ...
- Spring Data Redis—Pub/Sub(附Web项目源码) (转)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
随机推荐
- 运行vbs脚本
VBS是基于Visual Basic的脚本语言. VBS的全称是:Microsoft Visual Basic Script Edition.(微软公司可视化BASIC脚本版). 其语言类似Visua ...
- 关于js中的时间——计算时间差等
获取当前(系统)时间: var NowDate= new Date(); // 获取当前日期时间 // 输出为: Wed May 03 2017 14:52:08 GMT+0800 (中国标准时间) ...
- 大小端,memcpy和构造函数
问题:memcpy一段内存到std::bitset里,bitset里的内存数据和被拷贝的内存数据对应不上 代码如下: #include <iostream> #include <bi ...
- HANA私有云解决方案
在移动互联网时代,不支持在云上的部署一定会落伍的,HANA作为SAP力推的技术,对云的支持也做的很不错,今天我们就来探讨一下HANA私有云解决方案,至于公有云或者混合云,思路也是大同小异了. ...
- Getting started with C# and GDAL
Getting started with C# and GDAL http://vipassanaandenvironmentalinformatics.blogspot.jp/2013/03/get ...
- 1. 怎么设置可以使得虚拟机里面既可以访问主机也可以访问局域网而且是静态ip
方法1: Bridged方式(桥接): (1). 虚拟机网络适配器设置为桥接 (2). 主机设置静态ip (3). 虚拟机也设置静态ip且和宿主机在同一网段 Bridged方式: 在图1中Networ ...
- Flex下打开新窗口链接
<s:Button label="关闭推送" click="ExternalInterface.call('window.open','http://127.0.0 ...
- Linux sed 流编辑器
sed是stream editor的简称,也就是流编辑器.盗用一张图片解释原理 命令格式: SYNPPSIS: sed [OPTION]… {script-only-if-no-other-scrip ...
- react-native-picker 实现省市区 时间日期组件
github示例以及详细参数:https://github.com/beefe/react-native-picker 先 安装 link npm install react-native-picke ...
- bootsrap Collapse用法
collapse用处还是挺多的. 使用方法先看看bootstrap官方文档:https://v3.bootcss.com/javascript/#collapse You can use a link ...