zoukankan      html  css  js  c++  java
  • springboot中使用RedisTemplate实现redis数据缓存

    SpringBoot 整合 Redis 数据库实现数据缓存的本质是整合 Redis 数据库,通过对需要“缓存”的数据存入 Redis 数据库中,下次使用时先从 Redis 中获取,Redis 中没有再从数据库中获取,这样就实现了 Redis 做数据缓存。   按照惯例,下面一步一步的实现 Springboot 整合 Redis 来存储数据,读取数据。

    1. 项目添加依赖首页第一步还是在项目添加 Redis 的环境, Jedis。
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
    	<groupId>redis.clients</groupId>
    	<artifactId>jedis</artifactId>
    </dependency>

        2. 添加redis的参数

    spring: 
    ### Redis Configuration
      redis: 
        pool: 
          max-idle: 10
          min-idle: 5
          max-total: 20
        hostName: 127.0.0.1
        port: 6379

      3.编写一个 RedisConfig 注册到 Spring 容器

    package com.config;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    import redis.clients.jedis.JedisPoolConfig;
    
    /**
     * 描述:Redis 配置类
     */
    @Configuration
    public class RedisConfig {
    	/**
    	 * 1.创建 JedisPoolConfig 对象。在该对象中完成一些连接池的配置
    	 */
    	@Bean
    	@ConfigurationProperties(prefix="spring.redis.pool")
    	public JedisPoolConfig jedisPoolConfig() {
    		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    		
    		return jedisPoolConfig;
    	}
    
    	/**
    	 * 2.创建 JedisConnectionFactory:配置 redis 连接信息
    	 */
    	@Bean
    	@ConfigurationProperties(prefix="spring.redis")
    	public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
    		
    		JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
    		
    		return jedisConnectionFactory;
    	}
    
    	/**
    	 * 3.创建 RedisTemplate:用于执行 Redis 操作的方法
    	 */
    	@Bean
    	public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
    		
    		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    		
    		// 关联
    		redisTemplate.setConnectionFactory(jedisConnectionFactory);
    		// 为 key 设置序列化器
    		redisTemplate.setKeySerializer(new StringRedisSerializer());
    		// 为 value 设置序列化器
    		redisTemplate.setValueSerializer(new StringRedisSerializer());
    		
    		return redisTemplate;
    	}
    }

    4.使用redisTemplate

    package com.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.bean.Users;
    
    /**
    * @Description 整合 Redis 测试Controller
    * @version V1.0
    */
    @RestController
    public class RedisController {
    	
    	@Autowired
    	private RedisTemplate<String, Object> redisTemplate;
    	
    	@RequestMapping("/redishandle")
    	public String redishandle() {
    		
    		//添加字符串
    		redisTemplate.opsForValue().set("author", "欧阳");
    		
    		//获取字符串
    		String value = (String)redisTemplate.opsForValue().get("author");
    		System.out.println("author = " + value);
    		
    		//添加对象
    		//重新设置序列化器
    		redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
    		redisTemplate.opsForValue().set("users", new Users("1" , "张三"));
    		
    		//获取对象
    		//重新设置序列化器
    		redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
    		Users user = (Users)redisTemplate.opsForValue().get("users");
    		System.out.println(user);
    		
    		//以json格式存储对象
    		//重新设置序列化器
    		redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Users.class));
    		redisTemplate.opsForValue().set("usersJson", new Users("2" , "李四"));
    		
    		//以json格式获取对象
    		//重新设置序列化器
    		redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Users.class));
    		user = (Users)redisTemplate.opsForValue().get("usersJson");
    		System.out.println(user);
    		
    		return "home";
    	}
    }

    5.项目实战中redisTemplate的使用

    /**
     * 
     */
    package com.shiwen.lujing.service.impl;
    
    import java.util.List;
    import java.util.concurrent.TimeUnit;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Service;
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.shiwen.lujing.dao.mapper.WellAreaDao;
    import com.shiwen.lujing.service.WellAreaService;
    import com.shiwen.lujing.util.RedisConstants;
    
    /**
     * @author zhangkai
     *
     */
    @Service
    public class WellAreaServiceImpl implements WellAreaService {
    
    	@Autowired
    	private WellAreaDao wellAreaDao;
    
    	@Autowired
    	private RedisTemplate<String, String> stringRedisTemplate;
    
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see com.shiwen.lujing.service.WellAreaService#getAll()
    	 */
    	@Override
    	public String getAll() throws JsonProcessingException {
    		//redis中key是字符串
    		ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
    		//通过key获取redis中的数据
    		String wellArea = opsForValue.get(RedisConstants.REDIS_KEY_WELL_AREA);
    		//如果没有去查数据库
    		if (wellArea == null) {
    			List<String> wellAreaList = wellAreaDao.getAll();
    			wellArea = new ObjectMapper().writeValueAsString(wellAreaList);
    			//将查出来的数据存储在redis中
    			opsForValue.set(RedisConstants.REDIS_KEY_WELL_AREA, wellArea, RedisConstants.REDIS_TIMEOUT_1, TimeUnit.DAYS);
                // set(K key, V value, long timeout, TimeUnit unit)
                //timeout:过期时间;  unit:时间单位  
                //使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
                //redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结
                //果,十秒之后返回为null 
    		}
    		return wellArea;
    	}
    
    }
    

    6.redis中使用的key

    package com.shiwen.lujing.util;
    
    /**
     * redis 相关常量
     * 
     *
     */
    public interface RedisConstants {
    
    	/**
    	 * 井首字
    	 */
    	String REDIS_KEY_JING_SHOU_ZI = "JING-SHOU-ZI";
    
    	/**
    	 * 井区块
    	 */
    	String REDIS_KEY_WELL_AREA = "WELL-AREA";
    
    	/**
    	 * 
    	 */
    	long REDIS_TIMEOUT_1 = 1L;
    
    }
    小蘑菇
  • 相关阅读:
    luogu P3657 (NOIP2017) 跳房子(二分+DP+单调队列)
    BZOJ 3331 (Tarjan缩点+树上差分)
    Libre OJ 2255 (线段树优化建图+Tarjan缩点+DP)
    LibreOJ 6177 题解(状压DP)
    BZOJ 1179 (Tarjan缩点+DP)
    BZOJ 4919 (树上LIS+启发式合并)
    BZOJ 1100 &&luogu 3454(计算几何+KMP)
    HDU 3228 题解(最小生成树)(Kruskal)(内有详细注释)
    Codeforces 1058C(思维+最大公因数)
    周记 2015.05.30
  • 原文地址:https://www.cnblogs.com/wang66a/p/12069306.html
Copyright © 2011-2022 走看看