Redis 使用大全---java

package com.cac.cc.common;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.caac.emergency.dto.system.PageDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Repository
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RedisClient {
    private final StringRedisTemplate stringRedisTemplate;


    public <T> boolean set(String key, T value) {

        try {

            //任意类型转换成String
            String val = beanToString(value);

            if (val == null || val.length() <= 0) {
                return false;
            }

            stringRedisTemplate.opsForValue().set(key, val);
            return true;
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return false;
        }
    }

    public <T> boolean delete(String key) {

        try {
            stringRedisTemplate.delete(key);
            return true;
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return false;
        }
    }

    public <T> Long getLock(String key, long time, TimeUnit type) {

        try {
            Long res = stringRedisTemplate.opsForValue().increment(key);
            stringRedisTemplate.expire(key, time, type);
            return res;
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return Long.valueOf(0);
        }
    }

    public <T> boolean set(String key, T value, long time, TimeUnit type) {

        try {

            //任意类型转换成String
            String val = beanToString(value);

            if (val == null || val.length() <= 0) {
                return false;
            }

            stringRedisTemplate.opsForValue().set(key, val, time, type);
            return true;
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return false;
        }
    }

    public <T> T get(String key, Class<T> clazz) {
        try {
            String value = stringRedisTemplate.opsForValue().get(key);

            return stringToBean(value, clazz);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    public <T> List<T> getList(String key, Class<T> clazz) {
        try {
            String value = stringRedisTemplate.opsForValue().get(key);
            return stringToList(value, clazz);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    /**
     * key计数
     *
     * @param key
     * @return
     */
    public synchronized Integer setCount(String key) {
        try {
            Integer count = this.get(key, Integer.class);
            if (count == null) {
                count = 1;
            } else {
                count++;
            }
            this.set(key, count);
            return count;
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    /**
     * 添加指定元素到有序集合中
     *
     * @param key
     * @param score
     * @param value
     * @return
     */
    public boolean sortSetAdd(String key, double score, String value) {
        try {
            return stringRedisTemplate.opsForZSet().add(key, value, score);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return false;
        }
    }

    /**
     * 有序集合中对指定成员的分数加上增量 increment
     *
     * @param key
     * @param value
     * @param i
     * @return
     */
    public double sortSetZincrby(String key, String value, double i) {
        try {
            //返回新增元素后的分数
            return stringRedisTemplate.opsForZSet().incrementScore(key, value, i);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return -1;
        }
    }

    /**
     * 有序集合中对指定成员的分数加上增量 increment
     *
     * @param key
     * @param value
     * @return
     */
    public double delMember(String key, String value) {
        try {
            return stringRedisTemplate.opsForZSet().remove(key, value);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return -1;
        }
    }

    /**
     * 获得有序集合指定范围元素 (从大到小)
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set sortSetRange(String key, int start, int end) {
        try {
            return stringRedisTemplate.opsForZSet().reverseRange(key, start, end);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    /**
     * 获得有序集合大小
     *
     * @param key
     * @return
     */
    public Long count(String key) {
        try {
            return stringRedisTemplate.opsForZSet().size(key);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    /**
     * 获得指定元素的分数
     *
     * @param key
     * @param value
     * @param key
     * @return
     */
    public Double getScope(String key, String value) {
        try {
            return stringRedisTemplate.opsForZSet().score(key, value);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    /******************************** set操作 **************/

    /**
     * 是否为Set成员
     *
     * @param key
     * @param value
     * @return
     */
    public Boolean isMember(String key, String value) {
        try {
            return stringRedisTemplate.opsForSet().isMember(key, value);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    /**
     * 新增成员
     *
     * @param key
     * @param value
     * @return
     */
    public void addMember(String key, String value) {
        try {
            stringRedisTemplate.opsForSet().add(key, value);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
        }
    }

    /**
     * 删除成员
     *
     * @param key
     * @param value
     * @return
     */
    public Long removeMember(String key, String value) {
        try {
            return stringRedisTemplate.opsForSet().remove(key, value);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    /**
     * 获取所有成员
     *
     * @param key
     * @return
     */
    public Set getMembers(String key) {
        try {
            //获取成员
            return stringRedisTemplate.opsForSet().members(key);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    /**
     * 获取所有成员数
     *
     * @param key
     * @return
     */
    public Long getMemberSize(String key) {
        try {
            //获取成员
            return stringRedisTemplate.opsForSet().size(key);
        } catch (Exception e) {
            log.error("系统错误:" + e.getMessage(), e);
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    private <T> T stringToBean(String value, Class<T> clazz) {
        if (value == null || value.length() <= 0 || clazz == null || "null".equals(value)) {
            return null;
        }

        if (clazz == int.class || clazz == Integer.class) {
            return (T) Integer.valueOf(value);
        } else if (clazz == long.class || clazz == Long.class) {
            return (T) Long.valueOf(value);
        } else if (clazz == String.class) {
            return (T) value;
        } else {
            return JSON.toJavaObject(JSON.parseObject(value), clazz);
        }
    }

    private <T> List<T> stringToList(String value, Class<T> clazz) {
        if (value == null || value.length() <= 0 || clazz == null || "null".equals(value)) {
            return null;
        }
        return JSON.parseArray(value, clazz);

    }

    /**
     * @param value
     * @return String
     */
    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 == long.class || clazz == Long.class) {
            return "" + value;
        } else if (clazz == String.class) {
            return (String) value;
        } else {
            return JSON.toJSONString(value);
        }
    }

    /**
     * 获得指定 key的所有key
     * 可以是 key* ,*key ,*key* 进行模糊匹配
     *
     * @param key
     * @return
     */
    public Set<String> getKeys(String key) {
        return stringRedisTemplate.keys(key);
    }

    /**
     * 删除指定key的所有 key的值
     * 可以是 key*  , *key,*key* 进行模糊匹配
     *
     * @param key
     */
    public void deleteKeys(String key) {
        Set<String> keys = stringRedisTemplate.keys(key);
        stringRedisTemplate.delete(keys);
    }

    public synchronized void setContIncrement(String key){
        setContIncrement(key,1);
    }

    /**
     * 获取计数器数值
     * @param key key
     * @return int
     */
    public int getContIncrement(String key){
        try {
            Boolean redisKey = stringRedisTemplate.hasKey(key);
            if (redisKey) {
//                log.info("获取计数器:"+key);
                return Integer.parseInt((String) stringRedisTemplate.opsForValue().get(key));
            }else{
                return 0;
            }
        }catch (Exception e){
            log.error("获取计数器系统错误:" + e.getMessage(), e);
            return 0;
        }
    }
    /**
     * 设置计数器
     * @param key key
     * @param step step
     * @return void
     */
    public synchronized void setContIncrement(String key,int step){
        try{
            Boolean redisKey = stringRedisTemplate.hasKey(key);
            if (redisKey) {
//                log.info("设置计数器"+key);
                // 对value进行加1操作
                stringRedisTemplate.opsForValue().increment(key,step);
            } else{
//                log.info("创建计数器"+key);
                // 如果没有key值,对他进行添加到redis中
                stringRedisTemplate.opsForValue().set(key,step+"");
            }
        }catch (Exception e){
            log.error("自增计数器系统错误:" + e.getMessage(), e);
        }
    }

    public <T> boolean setPage(String key, PageDto<T> page,int time,TimeUnit timeUnit){
        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("totalPage", page.getTotalPage());
            jsonObject.put("currentPage", page.getCurrentPage());
            jsonObject.put("total", page.getTotal());
            jsonObject.put("list", JSONObject.toJSONString(page.getList()));

            stringRedisTemplate.opsForValue().set(key, jsonObject.toJSONString(), time, timeUnit);
            return true;
        }catch (Exception e){
            log.error("设置PageDto 缓存异常:"+e.getMessage(),e);
            return false;
        }
    }

    public <T> PageDto<T> getPage(String key,Class<T> clazz){
        String json = stringRedisTemplate.opsForValue().get(key);
        if(json == null || json.isEmpty()){
            return null;
        }
        JSONObject jsonObject = JSONObject.parseObject(json);
        PageDto<T> pageDto = PageDto.<T>builder()
                .currentPage(jsonObject.getLongValue("currentPage"))
                .totalPage(jsonObject.getLongValue("totalPage"))
                .total(jsonObject.getLongValue("total"))
                .list(stringToList(jsonObject.getString("list"),clazz)).build();
        return pageDto;
    }
}




// 应用代码


 /**
     * 忘记密码验证邮件
     *
     * @return
     */
    @PostMapping("/website/search/sendEmail")
    @Operation(summary = "忘记密码验证邮件")
    @Log("发送邮件")
    public ResultDto<String> sendEmail(String receiveAdress,String imgCode ,String uuid ) throws NoSuchAlgorithmException {
        //判断用户是否存在
        if (StringUtils.isEmpty(receiveAdress) || userService.getByEmail(receiveAdress) == null) {
            return ResultDtoUtil.toError("邮箱不合法", "");
        }
        // 图形验证码校验
        String codeRedis = redisClient.get("base_code_" + uuid, String.class);
        if (!imgCode.equals(codeRedis)) {
            return ResultDtoUtil.toError("图形验证码错误", "");
        }

        //防攻击
        if (redisClient.get("pwdCode_" + receiveAdress, String.class) != null) {
            return ResultDtoUtil.toError("验证码发送失败,请60s后再试!", "");
        } else {
            redisClient.set("pwdCode_" + receiveAdress, "1", 59, TimeUnit.SECONDS);
        }

        //生成随机6位验证码
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

        String code = (int) ((random.nextDouble() * 9 + 1) * 100000) + "";
        //发送
        emailCilent.sentCode(sendAdress, receiveAdress, code);
        //存到redis中
        redisClient.set("pwdCode_email_" + receiveAdress, code, 600000, TimeUnit.MILLISECONDS);
        return ResultDtoUtil.toSuccess("验证码发送成功", "");
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值