Redis-1.1>>>>>>整合到Springboot

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值