Redis结合springboot及redis常⽤命令
概述
本⽂内容主要
关于spring-redis
关于redis的key设计
redis的基本数据结构
介绍redis与springboot的整合
sringboot中的redistemplate的使⽤
redis常⽤命令:
转载:
关于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进⾏序列化操作,最终redis-server中将存储字节序列。是⽬前最常⽤的序列化策略。
StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“Bytes(charset)”的直接封装。是最轻量级和⾼效的策略。
JacksonJsonRedisSerializer:jackson-json⼯具提供了javabean与json之间的转换能⼒,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson⼯具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl⼯具⽀持】
OxmSerializer:提供了将javabean与xml之间的转换能⼒,⽬前可⽤的三⽅⽀持包括jaxb,apache-xmlbeans;redis存储的数据将
是xml⼯具。不过使⽤此策略,编程将会有些难度,⽽且效率最低;不建议使⽤。【需要spring-oxm模块的⽀持】
如果你的数据需要被第三⽅⼯具解析,那么数据应该使⽤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>
<span class="hljs-tag"><<span class="hljs-name">dependencies</span>></span>
<span class="hljs-comment"><!-- spring boot 配置 --></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hlj s-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hlj s-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-thymeleaf<span class="hljs-tag"></<span class ="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hlj s-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-test<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">scope</span>></span>test<span class="hljs-tag"></<span class="hljs-name">scope</span> ></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hlj s-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-data-redis<span class="hljs-tag"></<span class ="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
js获取json的key和value<span class="hljs-tag"></<span class="hljs-name">dependencies</span>></span>
application.properties
# Redis数据库索引(默认为0)
# Redis服务器地址
# Redis服务器连接端⼝
# Redis服务器连接密码(默认为空)
# 连接池最⼤连接数(使⽤负值表⽰没有限制)
# 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)
# 连接池中的最⼤空闲连接
# 连接池中的最⼩空闲连接
# 连接超时时间(毫秒)
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<<span class="hljs-built_in">String</span>, <span class="hljs-built_in">Object</span>> template = <span class="hljs-keyword">ne w</span> RedisTemplate<>();
<span class="hljs-comment">// 配置连接⼯⼚</span>
template.setConnectionFactory(<span class="hljs-keyword">factory</span>);
<span class="hljs-comment">//使⽤Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使⽤JDK的序列化⽅式)</span>
Jackson2JsonRedisSerializer jacksonSeial = <span class="hljs-keyword">new</span> Jackson2JsonRedisSerializer(<span class="hljs-built_in">Objec t</span>.<span class="hljs-keyword">class</span>);
ObjectMapper om = <span class="hljs-keyword">new</span> ObjectMapper();
<span class="hljs-comment">// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public</span>
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
<span class="hljs-comment">// 指定序列化输⼊的类型,类必须是⾮final修饰的,final修饰的类,⽐如String,Integer等会跑出异常</span>
jacksonSeial.setObjectMapper(om);
<span class="hljs-comment">// 值采⽤json序列化</span>
template.setValueSerializer(jacksonSeial);
<span class="hljs-comment">//使⽤StringRedisSerializer来序列化和反序列化redis的key值</span>
template.setKeySerializer(<span class="hljs-keyword">new</span> StringRedisSerializer());
<span class="hljs-comment">// 设置hash key 和value序列化模式</span>
template.setHashKeySerializer(<span class="hljs-keyword">new</span> StringRedisSerializer());
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
<span class="hljs-keyword">return</span> 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();
}
/**
* 对链表类型的数据操作
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论