文章目录
- Springboot整合reids
- 一、springboot依赖及配置
- 1、在项目的pom.xml文件中添加依赖:
- 2、配置redis数据库的连接信息:yml文件的配置
- 二、 操作redis数据库
- 1、RedisTemplate及其相关方法
- spring-data-redis针对Redis提供了如下功能:
- RedisTemplate中定义了对Redis5种数据结构的操作
- 2、RedisTemplate操作Redis数据库实例
- 1>String类型:
- 2> List类型:
- 3> Hash类型:
- 4> Set类型:无序
- 5> Zset类型:有序
- 3、RedisTemplate序列化配置
Springboot整合reids
一、springboot依赖及配置
1、在项目的pom.xml文件中添加依赖:
<!-- redis依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置redis数据库的连接信息:yml文件的配置
spring:
redis:
host: 192.168.74.129 #服务器地址
port: 6379 #服务器端口号
database: 0 #数据库索引
jedis:
pool:
max-active: 50 #连接池最大连接数(使用负值表示没有限制)
max-wait: 2000s #连接池最大阻塞等等待时间(使用负值表示没有限制)
max-idle: 20 #连接池最大空闲连接
min-idle: 2 #连接池最小空闲连接
timeout: 5000s #连接超时时间(毫秒)
二、 操作redis数据库
我们可以通过RedisTemplate和StringRedisTemplate来对redis数据库进行操作。
- RedisTemplate:可以操作所有类型数据,默认序列化使用的jdkSerializeable,在数据库中的数据以字节数组显示(需要自定义序列化)。
- StringRedisTemplate:使用的是String的序列化策略,只能操作字符串,在数据库中正常可读显示。
1、RedisTemplate及其相关方法
Spring封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的Redis原生的api。RedisTemplate位于spring-data-redis包下。RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。
注意 : RedisTemplate是一个key和value都是泛型的模板类,一般情况下key为String类型,如:RedisTemplate<String,Object>。此外,如果没特殊情况,切勿定义成RedisTemplate<Object, Object>,否则根据里氏替换原则,使用的时候会造成类型错误 。
如果泛型不是<Object, Object>,要用@Resource注解注入,不能使用@Autowired
spring-data-redis针对Redis提供了如下功能:
1> 连接池自动管理,提供了一个高度封装的“RedisTemplate”类
2> 针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口
- ValueOperations:简单K-V操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:针对list类型的数据操作
RedisTemplate中定义了对Redis5种数据结构的操作
- opsForxxx: 获取一个operator,但是没有指定操作的对象(key),可以在一个连接(事务)内操作多个key以及对应的value。
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
- boundXXXOps: 获取了一个指定操作对象(key)的operator,在一个连接(事务)内只能操作这个key对应的value。
redistempalate.boundValueOps //操作字符串
redistempalate.boundSetOps //操作set
redistempalate.boundListOps //操作list
redistempalate.boundHashOps //操作hash
redistempalate.boundZSetOps //操作有序set
注意: 关于计数的API(increment)有一个bug,需要各位使用中注意,通过increment计数以后,通过get方式获取计数值的时候可能会抛出EOF异常(和本地的jdk以及redis的编译版本有关),可以考虑使用boundValueOps(key).get(0,-1)获取计数值。
2、RedisTemplate操作Redis数据库实例
- 设置key的过期时间:
redisTemplate.expire("hero", 200, TimeUnit.SECONDS);
- 模糊查询key:* 匹配所有
Set<String> keys = redisTemplate.keys("*");
- 随机获取一个key:
String s = redisTemplate.randomKey();
- 查询key是否存在:
Boolean name = redisTemplate.hasKey("name");
1>String类型:
public class TestValue {
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Test
public void setValue(){
//存值,针对值类型,ops相当于options
redisTemplate.boundValueOps("name").set("itcast");
}
@Test
public void getValue(){
String str = (String) redisTemplate.boundValueOps("name").get();
System.out.println(str);
}
@Test
public void deleteValue(){
redisTemplate.delete("name");
}
}
2> List类型:
list类型分为两种,一种是左压栈,一种是右压栈
- 右压栈:
/**
* 右压栈:后添加的对象排在后边,相当于队列,相当于先进先出
*/
@Test
public void testSetValue1(){
redisTemplate.boundListOps("namelist1").rightPush("刘备");
redisTemplate.boundListOps("namelist1").rightPush("关羽");
redisTemplate.boundListOps("namelist1").rightPush("张飞");
}
/**
* 显示右压栈集合,range 表示查询的索引,从第几个查到第几个,查询所有(0,-1)。
*/
@Test
public void testGetValue1(){
List list = redisTemplate.boundListOps("namelist1").range(0, -1);
System.out.println(list);
}
运行结果:[刘备, 关羽, 张飞],元素可以重复
- 左压栈:
/**
* 左压栈:后添加的对象排在前边,相当于栈,先进后出
*/
@Test
public void testSetValue2(){
redisTemplate.boundListOps("namelist2").leftPush("刘备");
redisTemplate.boundListOps("namelist2").leftPush("关羽");
redisTemplate.boundListOps("namelist2").leftPush("张飞");
}
/**
* 显示左压栈集合
*/
@Test
public void testGetValue2(){
List list = redisTemplate.boundListOps("namelist2").range(0, -1);
System.out.println(list);
}
运行结果:[张飞, 关羽, 刘备]
- 根据索引查询元素
/**
* 查询集合某个元素
*/
@Test
public void testSearchByIndex(){
String s = (String) redisTemplate.boundListOps("namelist1").index(1);
System.out.println(s);
}
运行结果:返回索引为1的元素
- 移除某个元素的值
/**
* 移除集合某个元素,其中remove中第一个参数是移除的个数
*/
@Test
public void testRemoveByIndex(){
redisTemplate.boundListOps("namelist1").remove(1, "关羽");
}
这里表示移除一个“关羽”。
3> Hash类型:
public class TestHash {
@Resource
private RedisTemplate<String, Object> redisTemplate;
// 存值
@Test
public void testSetValue() {
redisTemplate.boundHashOps("namehash").put("a", "唐僧");
redisTemplate.boundHashOps("namehash").put("b", "悟空");
redisTemplate.boundHashOps("namehash").put("c", "八戒");
redisTemplate.boundHashOps("namehash").put("d", "沙僧");
}
//获取所有的key
@Test
public void testGetKeys() {
Set s = redisTemplate.boundHashOps("namehash").keys();
System.out.println(s);
}
// 获取所有的value
@Test
public void testGetValues() {
List values = redisTemplate.boundHashOps("namehash").values();
System.out.println(values);
}
// 根据key获取值
@Test
public void testGetValueByKey() {
Object object = redisTemplate.boundHashOps("namehash").get("b");
System.out.println(object);
}
//根据key移除值
@Test
public void testRemoveValueByKey() {
redisTemplate.boundHashOps("namehash").delete("c");
}
}
4> Set类型:无序
public class TestSet {
@Resource
private RedisTemplate<String, Object> redisTemplate;
/**
* 存入值
*/
@Test
public void setValue(){
redisTemplate.boundSetOps("nameset").add("曹操");
redisTemplate.boundSetOps("nameset").add("刘备");
redisTemplate.boundSetOps("nameset").add("孙权");
}
/**
* 提取值
*/
@Test
public void getValue(){
Set members = redisTemplate.boundSetOps("nameset").members();
System.out.println(members);
}
/**
* 删除集合中的某一个值
*/
@Test
public void deleteValue(){
redisTemplate.boundSetOps("nameset").remove("孙权");
}
/**
* 删除整个集合
*/
@Test
public void deleteAllValue(){
redisTemplate.delete("nameset");
}
}
输出结果:[孙权, 刘备, 曹操],此外,set类型的元素也不可重复。当set没有值的时候,会返回一个[]。
5> Zset类型:有序
public class TestZset {
@Resource
private RedisTemplate<String, Object> redisTemplate;
/**
* 存值,存排序分数
*/
@Test
public void set() {
redisTemplate.boundZSetOps("hero").add("关羽", 2);
redisTemplate.boundZSetOps("hero").add("张飞", 3);
redisTemplate.boundZSetOps("hero").add("诸葛亮", 1);
redisTemplate.boundZSetOps("hero").add("赵云", 4);
}
/**
* 取值
*/
@Test
public void get() {
Set<Object> hero = redisTemplate.boundZSetOps("hero").range(0, -1);
System.out.println(hero);
}
/**
* 删除集合中的一个值
*/
public void del() {
redisTemplate.boundZSetOps("hero").remove("关羽");
}
}
输出结果:[诸葛亮, 关羽, 张飞, 赵云],按输入的分数排序,值越小越靠前。
3、RedisTemplate序列化配置
通过配置redisTemplate的序列化策略,让数据在数据库中正常可读显示:
@Configuration
public class RedisCongfig {
/**
* redisTemplate 默认序列化使用的jdkSerializeable, 存储二进制字节码, 所以自定义序列化类
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用GenericJackson2JsonRedisSerialize 替换默认序列化
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}