SpringBoot整合redis

SpringBoot整合Redis

1、SpringBoot为操作redis准备了两个可以使用的工具类:

StringRedisTemplate和RedisTemplate:
(1)StringRedisTemplate是RedisTemplate的子类
(2)StringRedisTemplate泛型以及value都是String类型的。而RedisTemplate的key以及value的泛型是object类型的。

引入依赖:

 <dependency>           	
 	 <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
1.1、使用StringRedisTemplate工具类
(1)application.properties中配置:StringRedisTemplate类中的方法名以及用法与redis中基本相同,使用可参考:http://redisdoc.com/
#redis所在的IP地址
spring.redis.host=192.168.31.166
#redis的端口号
spring.redis.port=6379
#最大连接数
spring.redis.jedis.pool.max-active=20
#最大空闲数
spring.redis.jedis.pool.max-idle=8
#最小空闲数
spring.redis.jedis.pool.min-idle=0
#最大等待时间
spring.redis.jedis.pool.max-wait=20000
(2)编写测试类进行测试:

@SpringBootTest
class SpringbootRedis01ApplicationTests {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
    * 对key的操作
    **/
    @Test
    void contextLoads() {

        System.out.println(stringRedisTemplate.keys("*"));

        stringRedisTemplate.expire("k1",12, TimeUnit.SECONDS);
        System.out.println(stringRedisTemplate.getExpire("k1"));

        stringRedisTemplate.delete("k10");
        System.out.println(stringRedisTemplate.keys("*"));

    }

    /**
     * String类型的
     * */
    @Test
    public void Test(){
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();

        ops.set("k1","nihao");
        ops.set("k2","15");

        HashMap<String, String> map = new HashMap<>();
        map.put("k3","1215");
        map.put("k4","yangkeke");
        ops.multiSet(map);

        ops.set("k6","v6",15,TimeUnit.SECONDS);
        System.out.println("k6的存活时间"+stringRedisTemplate.keys("*"));
        System.out.println("k6的存活时间"+stringRedisTemplate.getExpire("k6"));


        System.out.println(ops.setIfAbsent("k1", "kkofjajj"));
        System.out.println(ops.get("k1"));
        ops.decrement("k2");
        System.out.println(ops.get("k2"));
        ops.increment("k3");
        ArrayList<String> strings = new ArrayList<>();
        strings.add("k3");
        strings.add("k4");
        System.out.println(ops.multiGet(strings));

    }

    /**
     * 哈希
     * */
    @Test
    public void Test2(){
        HashOperations<String, Object, Object> ops = stringRedisTemplate.opsForHash();
        ops.put("h1","name","shulz");
        ops.put("h1","age","18");
        ops.put("h1","address","diqiu");

//        System.out.println(ops.get("h1", "name"));
//        System.out.println(ops.putIfAbsent("h1", "name", "pp"));
//        System.out.println(ops.get("h1", "name"));

        HashMap<String, Object> map = new HashMap<>();
        map.put("name","liudehua");
        map.put("age","19");
        map.put("address","beijin");

        ops.putAll("h2",map);

        ArrayList<Object> strings = new ArrayList<>();
        strings.add("name");
        strings.add("age");
        strings.add("address");
        System.out.println(ops.multiGet("h2", strings));

    }


    /**
     *
     * set集合
     * */
    @Test
    public void Test3(){
        SetOperations<String, String> ops = stringRedisTemplate.opsForSet();
//        System.out.println(stringRedisTemplate.keys("*"));
//        System.out.println(ops.add("k99", "v1","v2","v3","v2"));
//        System.out.println(stringRedisTemplate.keys("*"));

        System.out.println(ops.members("k99"));
        ops.add("k98","v1","va","v2");//创建key并填充数据,不可重复
        ops.add("k97","v1","pp","kjf");

        ArrayList<String> strings = new ArrayList<>();
        strings.add("k99");
        strings.add("k98");
        strings.add("k97");
        System.out.println(ops.intersect(strings));//求多个key中的交集

        System.out.println("k99:"+ops.members("k99"));//获取对应key中的全部元素
        System.out.println(ops.pop("k99"));//获取并删除对应key中的一个随机元素
        System.out.println("k99:"+ops.members("k99"));
    }


    /**
     * 列表
     * */
    @Test
    public void Test4(){
        ListOperations<String, String> ops = stringRedisTemplate.opsForList();
        System.out.println(stringRedisTemplate.keys("*"));
        ops.leftPush("k00","kk");
        System.out.println(ops.range("k00", 0, -1));

        ops.leftPushAll("k11","p1","p2","p3");
        System.out.println(ops.range("k11", 0, -1));
        System.out.println(ops.leftPop("k11"));
        System.out.println(ops.range("k11", 0, -1));
    }
}

1.2、使用RedisTemplate工具类
(1)为了方便使用RedisTemplate,一般会自行配置其键值编码格式:自定义创建RedisConfig类配置设置。。此配置文件中包含有后面用到的注解方式需要的Bean(第二个Bean).
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    //比如验证码,,使用RedisTemplate使用的配置
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
        //key序列化方式
        template.setKeySerializer(redisSerializer);
        //value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    //使用注解方式使用redis时的配置
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解决乱码的问题),过期时间600秒即10分钟
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600)) //缓存过期10分钟 ---- 根据业务需求而定。
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}
(2)Server中使用(省略其余业务,简单举例)
@Service
public class DeptServiceImpl2 implements DeptService {

    @Resource
    private DeptDao deptDao;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public Dept getDeptById(Integer deptId) {
    	//获取字符串模式
        ValueOperations ops = redisTemplate.opsForValue();
        //获取redis中键为findById::XXX的value
        Object o = ops.get("findById::" + deptId);
        if (o!=null){
            return (Dept) o;
        }
        //如果为空,则代表数据库中不存在,将数据库中查询出的数据放入redis缓存
        Dept dept = deptDao.selectById(deptId);
        ops.set("findById::" + deptId,dept);
        return dept;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值