zoukankan      html  css  js  c++  java
  • 高并发秒杀——SpringBoot集成redis

    shop--13.升级--Redis缓存技术

    集成Redis

    1.添加Jedis依赖

    2.添加Fastjson依赖

    1.安装redis  http://www.runoob.com/redis/redis-install.html

    1.引入redis依赖

    <!--redis客户端:jedis-->
    		<dependency>
    			<groupId>redis.clients</groupId>
    			<artifactId>jedis</artifactId>
    			<version>2.9.0</version>
    		</dependency>
    
    		<dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>fastjson</artifactId>
    			<version>1.1.41</version>
    		</dependency>
    
    		<!--配置springBootConfiguration, 可以使用@ConfigurationProperties(prefix = "redis")-->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-configuration-processor</artifactId>
    			<optional>true</optional>
    		</dependency>
    

      

    2.在application.properties加入redis配置文件

    redis.host=127.0.0.1
    redis.port=6379
    redis.timeout=3
    redis.pool.MaxTotal=10
    redis.database=0
    redis.pool.maxActive=100
    redis.pool.maxIdle=20
    redis.pool.maxWait=3
    redis.pool.testOnBorrow=true

    3. 定义redis的类,引入redis配置

    @Component
    @ConfigurationProperties(prefix = "redis")
    public class RedisConfig {
        private String host;
        private int port;
        private int timeout;
        private int poolMaxTotal;
        private int poolMaxIdle;
        private int poolMaxWait;
    
        public String getHost() {
            return host;
        }
    
        public void setHost(String host) {
            this.host = host;
        }
    
        public int getPort() {
            return port;
        }
    
        public void setPort(int port) {
            this.port = port;
        }
    
        public int getTimeout() {
            return timeout;
        }
    
        public void setTimeout(int timeout) {
            this.timeout = timeout;
        }
    
        public int getPoolMaxTotal() {
            return poolMaxTotal;
        }
    
        public void setPoolMaxTotal(int poolMaxTotal) {
            this.poolMaxTotal = poolMaxTotal;
        }
    
        public int getPoolMaxIdle() {
            return poolMaxIdle;
        }
    
        public void setPoolMaxIdle(int poolMaxIdle) {
            this.poolMaxIdle = poolMaxIdle;
        }
    
        public int getPoolMaxWait() {
            return poolMaxWait;
        }
    
        public void setPoolMaxWait(int poolMaxWait) {
            this.poolMaxWait = poolMaxWait;
        }
    }
    

      

    4.RedisPoolFactory类

    @Service
    public class RedisPoolFactory {
    
        @Autowired
        RedisConfig redisConfig;
    
        @Bean
        public JedisPool JedisPoolFactory(){
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxIdle(redisConfig.getPoolMaxIdle());
            jedisPoolConfig.setMaxTotal(redisConfig.getPoolMaxTotal());
            jedisPoolConfig.setMaxWaitMillis(redisConfig.getPoolMaxWait() * 1000);
    
            JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisConfig.getHost(),
                    redisConfig.getPort(), redisConfig.getTimeout() * 1000);
            return jedisPool;
        }
    }
    

      

    5.编写RedisService类

    @Service
    public class RedisRervice {
    
        @Autowired
        JedisPool jedisPool;
    
    
        /**
         * h获取单个对象
         * @param prefix
         * @param key
         * @param clazz
         * @param <T>
         * @return
         */
        public <T> T get(KeyPrefix prefix, String key, Class<T> clazz){
            Jedis jedis = null;
            try{
                jedis = jedisPool.getResource();
                //生成真正的key
                String realKey = prefix.getKeyPrefix() + key;
                String str = jedis.get(realKey);
                T t = stringToBean(str, clazz);
                return t;
            }finally {
                jedis.close();
            }
    
    
        }
    
        /**
         * 设置缓存值
         * @param prefix
         * @param key
         * @param value
         * @param <T>
         * @return
         */
        public <T> boolean set(KeyPrefix prefix, String key, T value){
            Jedis jedis = null;
            try{
                jedis = jedisPool.getResource();
                String str = beanToString(value);
                if(str == null || str.length() <= 0){
                    return false;
                }
                //生成真正的key
                String realKey = prefix.getKeyPrefix() + key;
                int second = prefix.expireSeconds();
                if(second <= 0){
                    jedis.set(realKey, str);
                }else{
                    jedis.setex(realKey, second, str);
                }
    
                jedis.set(realKey, str);
                return true;
            } finally {
                jedis.close();
            }
    
        }
    
        private <T> String beanToString(T value) {
            if(value == null){
                return null;
            }
            Class<?> clazz = value.getClass();
            if(clazz == int.class || clazz == Integer.class){
                return "" + value;
            }else if(clazz == String.class){
                return (String) value;
            } else if(clazz == long.class || clazz == Long.class){
                return "" + value;
            }else{
                return JSON.toJSONString(value);
            }
    
        }
    
        private <T> T stringToBean(String str, Class<T> clazz) {
            if (str == null || str.length() <= 0 || clazz == null) {
                return null;
            }
    
            if (clazz == int.class || clazz == Integer.class) {
                return (T) Integer.valueOf(str);
            } else if (clazz == String.class) {
                return (T) str;
            } else if (clazz == long.class || clazz == Long.class) {
                return (T) Long.valueOf(str);
            } else {
                return JSON.toJavaObject(JSON.parseObject(str), clazz);
            }
        }
    
    
        /**
         * 判断是否存在
         * @param prefix
         * @param key
         * @param <T>
         * @return
         */
        public <T> boolean exits(KeyPrefix prefix, String key){
            Jedis jedis = null;
            try{
                jedis = jedisPool.getResource();
    
                String realKey = prefix.getKeyPrefix() + key;
                return jedis.exists(realKey);
            } finally {
                jedis.close();
            }
    
    
        }
    
    
        /**
         * 增加值
         * @param prefix
         * @param key
         * @param <T>
         * @return
         */
        public <T> Long incr(KeyPrefix prefix, String key){
            Jedis jedis = null;
            try{
                jedis = jedisPool.getResource();
                String realKey = prefix.getKeyPrefix() + key;
                return jedis.incr(realKey);
            } finally {
                jedis.close();
            }
    
        }
    
        /**
         * 减少值
         * @param prefix
         * @param key
         * @param <T>
         * @return
         */
        public <T> Long decr(KeyPrefix prefix, String key){
            Jedis jedis = null;
            try{
                jedis = jedisPool.getResource();
                String realKey = prefix.getKeyPrefix() + key;
                return jedis.decr(realKey);
            } finally {
                jedis.close();
            }
    
        }
    }
    

      

      

    6.controller中测试

    @Autowired
        RedisService redisService;
    
        @RequestMapping(value = "/redis/set", method = RequestMethod.GET)
        @ResponseBody
        public boolean redisSet(){
            boolean value = redisService.set("key2", "redis");
            return value;
        }
    
    
        @RequestMapping(value = "/redis/get", method = RequestMethod.GET)
        @ResponseBody
        public Object redisGet(){
            String l = redisService.get("key2", String.class);
            return l;
        }
    

      

     使用一个前缀来区分key

    public interface KeyPrefix {
        int expireSeconds();
        String getKeyPrefix();
    }
    

      

    KeyPrefix

    public abstract class BasePrefix implements KeyPrefix {
    
        private int expireSeconds;
        private String keyPrefix;
    
        public BasePrefix(String keyPrefix) {
            this(0, keyPrefix);
        }
    
        public BasePrefix(int expireSeconds, String keyPrefix) {
            this.expireSeconds = expireSeconds;
            this.keyPrefix = keyPrefix;
        }
    
        //默认 0 代表永不过期
        @Override
        public int expireSeconds() {
            return expireSeconds;
        }
    
    
        //不同的类对应不同的prefix
        @Override
        public String getKeyPrefix() {
            String className = getClass().getSimpleName();
            return className + ": " + keyPrefix;
        }
    }
    

      

  • 相关阅读:
    所谓的飞扬档案管理软件
    通过实例学习Virtools脚本语言VSL 解析字符串
    SQLite FAQ中文版
    通过实例学习Virtools脚本语言VSL 将物体排列于圆周上
    通过实例学习Virtools脚本语言VSL 解二次方程
    out 和 ref
    ASP.NET MVC深度接触:ASP.NET MVC请求生命周期
    ICSharpCode.SharpZipLib 压缩
    aspnet_regiis.exe 详解
    ASP.NET 配置文件 configSource 的用法
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/9204721.html
Copyright © 2011-2022 走看看