美文网首页秒杀系统
2018-12-08 通用缓存key封装

2018-12-08 通用缓存key封装

作者: 培根好吃 | 来源:发表于2018-12-08 01:34 被阅读0次

1.通用缓存key封装

利用模板模式 接口-> 抽象类->实现类

service层

package com.ryan.miaosha.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


import com.ryan.miaosha.dao.User;
import com.ryan.miaosha.domain.CodeMsg;
import com.ryan.miaosha.domain.Result;
import com.ryan.miaosha.redis.RedisService;
import com.ryan.miaosha.redis.UserKey;
import com.ryan.miaosha.service.UserService;

//1.   rest api  json数据      2.   页面 

@Controller
@RequestMapping("/demo")
public class DemoController {

    @Autowired
    UserService userService;
    @Autowired
    RedisService redisService;
    
    //请求成功
        @RequestMapping("/redis/get")
        @ResponseBody
        Result<User> getRedis() {
            User user1 = redisService.get(UserKey.getById, ""+1,User.class);    
            return Result.success(user1);
        }   
    //请求成功
            @RequestMapping("/redis/set")
            @ResponseBody
            Result<Boolean> setRedis() {
                User user=new User();
                user.setId(1);
                user.setName("ryan");
            redisService.set(UserKey.getById, ""+1, user);                  
                return Result.success(true);
            }
        
    @RequestMapping("/")
    @ResponseBody
    String home() {
        return "hello springboot!";
    }
    //请求成功
    @RequestMapping("/dao")
    @ResponseBody
    Result<User> selectById() {
        User idUser = userService.getById(1);
        return Result.success(idUser);
    }
    //请求异常
    @RequestMapping("/helloError")
    @ResponseBody
    Result<String> helloError() {
        return Result.error(CodeMsg.SERVER_ERROR);
    }
    
    @RequestMapping("/thymeleaf")
    String thymeleaf(Model model) {
        model.addAttribute("name","ryan");
        return "ryan";
    }
    
}


redis层

package com.ryan.miaosha.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

@Service
public class RedisService {
    @Autowired
    JedisPool jedisPool;

  //从redis中获取数据 ,将json数据转变为对象
        public <T> T get(KeyPrefix keyPrefix,String key, Class<T> clazz) {
         Jedis jedis = null;
         try {
             jedis = jedisPool.getResource();
             String realKey=keyPrefix.getPrefix()+key;
             String string = jedis.get(realKey);
             T t=stringToBean(string,clazz);
             return t;
        } finally {
            returnToPool(jedis);}
}
          


    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);
            }
        
    }

//redis存入数据 ,将对象转变为json数据,再存入redis中
            public <T> Boolean set(KeyPrefix keyPrefix,String key, T value) {
                    Jedis jedis = null;
         try {
             jedis = jedisPool.getResource();
             String str=beanToString(value);
             if(str==null||str.length()<=0) {
                 return false;
                }
             String realKey=keyPrefix.getPrefix()+key;
             int expireTime = keyPrefix.expireTime();
             if(expireTime<=0) {
                 jedis.set(realKey, str);
             }else {
                jedis.setex(key, expireTime, str);
            }
             
             return true;

                } finally {
                    returnToPool(jedis);
                    
                }}
    
    
    @SuppressWarnings("unchecked")
    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);
            }
    }
    
    private void returnToPool(Jedis jedis) {
        if(jedis!=null)
     jedis.close(); //将jedis返回连接池 
        
    }


//判断一个key是否存在
    public <T> Boolean exists(KeyPrefix keyPrefix,String key) {
            Jedis jedis = null;
         try {
             jedis = jedisPool.getResource();           
             String realKey=keyPrefix.getPrefix()+key;
             return  jedis.exists(realKey);             
                } finally {
                    returnToPool(jedis);
                    
    }
 }
    //  自增
    public <T> Long incr(KeyPrefix keyPrefix,String key) {
            Jedis jedis = null;
         try {
             jedis = jedisPool.getResource();           
             String realKey=keyPrefix.getPrefix()+key;
             return  jedis.incr(realKey);               
                } finally {
                    returnToPool(jedis);
                    
    }
 }
    //    自减
    public <T> Long decr(KeyPrefix keyPrefix,String key) {
            Jedis jedis = null;
         try {
             jedis = jedisPool.getResource();           
             String realKey=keyPrefix.getPrefix()+key;
             return  jedis.decr(realKey);               
                } finally {
                    returnToPool(jedis);
                    
    }
 }

    
}

前缀 KeyPrefix层


public interface KeyPrefix {
    public int expireTime();//过期时间  秒
    public String getPrefix();
}


public abstract class BasePrefix  implements KeyPrefix{
    private int expiredTime;
    private String prefix;
    
    public BasePrefix(String prefix) {
        this(0, prefix);
        // TODO Auto-generated constructor stub
    }   
    public BasePrefix(int expiredTime, String prefix) {
        super();
        this.expiredTime = expiredTime;
        this.prefix = prefix;
    }
    public int expiredTime() { //默认0代表永不过期
        return expiredTime;     
    }
     public String getPrefix() {
         String ClassName = getClass().getSimpleName();
         return ClassName+":"+prefix;        
     }
}

public class UserKey extends BasePrefix{

    private UserKey(String prefix) {
        super( prefix);
        // TODO Auto-generated constructor stub
    }

    @Override
    public int expireTime() {
        // TODO Auto-generated method stub
        return 0;
    }
  public static UserKey getById=new UserKey("id");
  public static UserKey getByName=new UserKey("name");
}

相关文章

  • 2018-12-08 通用缓存key封装

    1.通用缓存key封装 利用模板模式 接口-> 抽象类->实现类 service层 redis层 前缀 Key...

  • 接口限流防刷

    思路:将访问次数放入缓存,key为URI+User ID 将这个通用方法,使用拦截器改造。 1.将目标方法加上注解...

  • redis血崩,击穿和穿透

    缓存穿透:比如说,一个用户的基本信息(缓存key为uid)或订单的信息(缓存key为order_id),缓存或数据...

  • Redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案

    一、什么是缓存穿透,缓存击穿,缓存雪崩 缓存穿透:(即查询不到)key对应的数据在数据源并不存在,每次针对此key...

  • redis 中的命令

    一、redis中的通用命令 通用命令(DDL)keys 命令del key:删除某个keyexists key:查...

  • 缓存雪崩和缓存穿透

    缓存穿透 原理 缓存穿透是查询一个在缓存中不存在的key。出于容错考虑,如果数据库查不到,则缓存不会保存这个key...

  • glide缓存

    分为内存缓存以及硬盘缓存,内存缓存又分为lruresourchcache和弱引用缓存。缓存的key,参数很多,通过...

  • 缓存相关

    1.缓存穿透 一般缓存是key-value结构,查询是使用key查询value,缓存中查不到,则需要去db中取值;...

  • laravel框架学习-缓存,事件

    缓存配置:app/config/cache.php 缓存:增加缓存项: Cache::put( 'key', 'v...

  • uni-app方法封装

    请求数据方法封装 文件上传封装 通用方法

网友评论

    本文标题:2018-12-08 通用缓存key封装

    本文链接:https://www.haomeiwen.com/subject/cuufhqtx.html