springboot之使⽤redistemplate优雅地操作redis
概述
本⽂内容主要
关于spring-redis
关于redis的key设计
redis的基本数据结构
介绍redis与springboot的整合
sringboot中的redistemplate的使⽤
之前看了很多博客,⼤都都只是粗略的介绍,这⾥想要记录的全⾯⼀些,也算是⼀个学习的过程
⾸发于我的个⼈博客:
关于spring-redis
spring-data-redis针对jedis提供了如下功能:
1. 连接池⾃动管理,提供了⼀个⾼度封装的“RedisTemplate”类
2. 针对jedis客户端中⼤量api进⾏了归类封装,将同⼀类型操作封装为operation接⼝
ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作
3. 提供了对key的“bound”(绑定)便捷化操作API,可以通过bound封装指定的key,然后进⾏⼀系列的操作⽽⽆须“显式”的再次指定Key,即BoundKeyOperations:
BoundValueOperations
BoundSetOperations
BoundListOperations
BoundSetOperations
BoundHashOperations
4. 将事务操作封装,有容器控制。
5. 针对数据的“序列化/反序列化”,提供了多种可选择策略(RedisSerializer)
JdkSerializationRedisSerializer:POJO对象的存取场景,使⽤JDK本⾝序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进⾏序列化操作,最终red StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“Bytes(charset JacksonJsonRedisSerializer:jackson-json⼯具提供了javabean与json之间的转换能⼒,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转OxmSerializer:提供了将javabean与xml之间的转换能⼒,⽬前可⽤的三⽅⽀持包括jaxb,apache-xmlbeans;redis存储的数据将是xml⼯具。不过使⽤此策略,编程如果你的数据需要被第三⽅⼯具解析,那么数据应该使⽤StringRedisSerializer⽽不是JdkSerializationRedisSerializer。
关于key的设计
key的存活时间:
⽆论什么时候,只要有可能就利⽤key超时的优势。⼀个很好的例⼦就是储存⼀些诸如临时认证key之类的东西。当你去查⼀个授权key时
——以OAUTH为例——通常会得到⼀个超时时间。
这样在设置key的时候,设成同样的超时时间,Redis就会⾃动为你清除。
关系型数据库的redis
1: 把表名转换为key前缀 如, tag:
2: 第2段放置⽤于区分区key的字段--对应mysql中的主键的列名,如userid
3: 第3段放置主键值,如2,, a , b ,c
4: 第4段,写要存储的列名
例:user:userid:9:username
Redis的数据类型
String字符串
string是redis最基本的类型,⼀个key对应⼀个value。
string类型是⼆进制安全的。意思是redis的string可以包含任何数据。⽐如jpg图⽚或者序列化的对象 。
string类型是Redis最基本的数据类型,⼀个键最⼤能存储512MB。
链表
redis列表是简单的字符串列表,排序为插⼊的顺序。列表的最⼤长度为2^32-1。
redis的列表是使⽤链表实现的,这意味着,即使列表中有上百万个元素,增加⼀个元素到列表的头部或尾部的操作都是在常量的时间完成。
可以⽤列表获取最新的内容(像帖⼦,微博等),⽤ltrim很容易就会获取最新的内容,并移除旧的内容。
⽤列表可以实现⽣产者消费者模式,⽣产者调⽤lpush添加项到列表中,消费者调⽤rpop从列表中提取,如果没有元素,则轮询去获取,或者使⽤brpop等待⽣产者添加项到列表中。
集合
redis集合是⽆序的字符串集合,集合中的值是唯⼀的,⽆序的。可以对集合执⾏很多操作,例如,测试元素是否存在,对多个集合执⾏交集、并集和差集等等。
我们通常可以⽤集合存储⼀些⽆关顺序的,表达对象间关系的数据,例如⽤户的⾓⾊,可以⽤sismember很容易就判断⽤户是否拥有某个⾓⾊。
在⼀些⽤到随机值的场合是⾮常适合的,可以⽤ srandmember/spop 获取/弹出⼀个随机元素。
同时,使⽤@EnableCaching开启声明式缓存⽀持,这样就可以使⽤基于注解的缓存技术。注解缓存是⼀个对缓存使⽤的抽象,通过在代码中添加下⾯的⼀些注解,达到缓存的效果。
ZSet 有序集合
有序集合由唯⼀的,不重复的字符串元素组成。有序集合中的每个元素都关联了⼀个浮点值,称为分数。可以把有序看成hash和集合的混合体,分数即为hash的key。
有序集合中的元素是按序存储的,不是请求时才排序的。
Hash-哈希
redis的哈希值是字符串字段和字符串之间的映射,是表⽰对象的完美数据类型。
哈希中的字段数量没有限制,所以可以在你的应⽤程序以不同的⽅式来使⽤哈希。
springboot 与redis的整合
pom⽂件
依赖如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- spring boot 配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>        </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>        </dependency>
</dependencies>
application.properties
# Redis数据库索引(默认为0)
# Redis服务器地址
# Redis服务器连接端⼝
# Redis服务器连接密码(默认为空)
# 连接池最⼤连接数(使⽤负值表⽰没有限制)
# 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)dis.pool.max-wait=-1
# 连接池中的最⼤空闲连接
# 连接池中的最⼩空闲连接
# 连接超时时间(毫秒)
redisTemplate的配置
新建⼀个redisConfig类,进⾏相关bean的配置:
fig;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import t.annotation.Bean;
import t.annotation.Configuration;
import org.dis.cache.RedisCacheManager;
import org.tion.RedisConnectionFactory;
import org.*;
import org.dis.serializer.Jackson2JsonRedisSerializer;
import org.dis.serializer.StringRedisSerializer;
/**
* @author janti
* reids 相关bean的配置
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
/**
* 选择redis作为默认缓存⼯具
* @param redisTemplate
* @return
*/
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
return rcm;
}
/**
* retemplate相关配置
* @param factory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
/
/ 配置连接⼯⼚
template.setConnectionFactory(factory);
//使⽤Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使⽤JDK的序列化⽅式)        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输⼊的类型,类必须是⾮final修饰的,final修饰的类,⽐如String,Integer等会跑出异常
jacksonSeial.setObjectMapper(om);
// 值采⽤json序列化
template.setValueSerializer(jacksonSeial);
//使⽤StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
// 设置hash key 和value序列化模式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jacksonSeial);
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
/**
* 对hash类型的数据操作
*
* @param redisTemplate
* @return
*/
@Bean
public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {        return redisTemplate.opsForHash();
}
/**
* 对redis字符串类型数据操作
*
* @param redisTemplate
* @return
*/
@Bean
public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForValue();
}
/**
* 对链表类型的数据操作
*
* @param redisTemplate
* @return
*/
@Bean
public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForList();
}
/**
* 对⽆序集合类型的数据操作
*
* @param redisTemplate
* @return
*/
@Bean
public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForSet();
}
/**
* 对有序集合类型的数据操作
*
* @param redisTemplateredis支持的五种数据类型
* @return
*/
@Bean
public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForZSet();
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。