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 ...
随机推荐
- android 开发 修改系统背景(状态栏颜色、导航栏颜色、标题栏颜色等等)
1.打开values下的styles.xml 发现有以下代码: <resources> <!-- Base application theme. --> <style n ...
- javafx链接实现
方式一: Desktop.getDesktop().browse(new URI(manualUrl)); 在linux环境bug 方式二: 转载自:https://stackoverflow.com ...
- 《算法》第五章部分程序 part 2
▶ 书中第五章部分程序,包括在加上自己补充的代码,字符串高位优先排序(计数 + 插排),(原地排序),(三路快排,与前面的三路归并排序相同) ● 计数 + 插排 package package01; ...
- C++构造函数和析构函数执行顺序
四种情况:1. 创建一个类指针时,调用其构造函数:删除当前指针时,自动调用其析构函数.2. 创建子类对象指针时,首先调用其父类的构造函数,然后调用子类的构造函数:删除当前指针时先调用子类的析构函数,然 ...
- leetcode1018
根据题目的hint,使用单层循环计算: class Solution(object): def prefixesDivBy5(self, A: 'List[int]') -> 'List[boo ...
- QtCreator中F1帮助不能使用的解决方法
环境:ubuntu11.04 在Qt中按F1跳转帮助是一个很方便的东东,点击左边的Help图标也是一样的功能.我今天遇到的问题是F1跳转出错,找不到文档: “No documentation avai ...
- 机器学习进阶-阈值与平滑-图像阈值 1. cv2.threshold(进行阈值计算) 2. 参数type cv2.THRESH_BINARY(表示进行二值化阈值计算)
1. ret, dst = cv2.thresh(src, thresh, maxval, type) 参数说明, src表示输入的图片, thresh表示阈值, maxval表示最大值, type表 ...
- 【JEECG技术文档】表单配置-树形表单
表单配置支持树型表单了,具体效果如下图: 配置说明: 1.是否树:选择是. 2.树形表单父Id:表的自关联外键. 3.树形表单列表:显示树形图标的列,如上图中为[组织机构名称]. 4.默认值:最外层数 ...
- 尚硅谷springboot学习20-web开发简介
使用SpringBoot 1).创建SpringBoot应用,添加我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 3).自己编写业 ...
- 尚硅谷redis学习5-初识redis.conf
redis.conf是redis的配置文件,在解压后的redis安装文件夹下 单位 1 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 2 对大小写不敏感 包含 ...