Radis的封装方法

一、什么是Redis

Redis是一个开源的基于内存的键值对数据库,它的主要特征和作用包括:

1、基于内存,读写速度极快,可以处理大量读写请求。

2、支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,具有丰富的数据表示能力。 3、支持主从复制,提供数据冗余和故障恢复能力。

4、支持持久化,可以将内存数据保存到磁盘中。

5、支持事务,可以一次执行多个命令。

6、丰富的功能,可用于缓存、消息队列等场景。

主要应用场景包括:

1、缓存常见的使用场景,比如缓存查询结果、热点数据等,大大降低数据库负载。

2、处理大量的读写请求,比如访问统计、消息队列等。

3、排行榜、计数器等功能的实现。

4、pub/sub消息订阅。

5、QUE计划任务

6、分布式锁等。

综上,Redis是一个性能极高的内存数据库,支持丰富数据结构,提供持久化、事务等功能,非常适合缓存、消息队列等场景,被广泛应用于各种大型系统中。它的高性能、丰富功能使其成为非关系型数据库的重要选择之一。

二.Redis的封装方法

@Component
public class RedisUtil {

    /**
     * 如果使用 @Autowired 注解完成自动装配 那么
     * RedisTemplate要么不指定泛型,要么泛型 为<Stirng,String> 或者<Object,Object>
     * 如果你使用其他类型的 比如RedisTemplate<String,Object>
     * 那么请使用 @Resource 注解
     * */
    @Resource
    private RedisTemplate<String,Object> redisTemplate;

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 缓存value
     *
     * @param key -
     * @param value -
     * @param time -
     * @return -
     */
    public boolean cacheValue(String key, Object value, long time) {
        try {
            ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
            valueOperations.set(key, value);
            if (time > 0) {
                // 如果有设置超时时间的话
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Throwable e) {
            logger.error("缓存[" + key + "]失败, value[" + value + "] " + e.getMessage());
        }
        return false;
    }

    /**
     * 缓存value,没有设置超时时间
     *
     * @param key -
     * @param value -
     * @return -
     */
    public boolean cacheValue(String key, Object value) {
        return cacheValue(key, value, -1);
    }

    /**
     * 缓存value
     * @param hkey
     * @param key
     * @param value
     * @return
     */
    public boolean cacheHashValue(String hkey,String key , Object value) {
        redisTemplate.opsForHash().put(hkey, key, value);
        return true;
    }


    /**
     * Cursor是用于对元素集合(例如键或哈希中的成员)进行迭代操作的机制。
     * Cursor主要用于像SCAN这样的命令,允许以增量方式遍历大量数据集,而不会阻塞服务器。
     * @param hkey
     * @return
     */
    public Cursor<Map.Entry<Object, Object>> getHashValue(String hkey){
        return redisTemplate.opsForHash().scan(hkey, ScanOptions.NONE);
    }

    /**
     * 移除
     * @param hkey
     * @param key
     * @return
     */
    public boolean removeHashKey(String hkey,String key){
        try {
            redisTemplate.opsForHash().delete(hkey, key);
            return true;
        } catch (Throwable e) {
            logger.error("移除缓存时失败hkey里的key[" + hkey +key+ "]", "err[" + e.getMessage() + "]");
        }

        return false;
    }


    /**
     * Set缓存数据
     * @param key
     * @param value
     * @return
     */
    public Long cacheSetValue(String key,Object value ){
//        如果 value 成员已经是集合 key 的成员,那么 add 方法不会添加这个成员,返回值为 0。
//        如果 value 成员不是集合 key 的成员,并成功添加到集合中,返回值为 1。
        return redisTemplate.opsForSet().add(key, value);
    }

    /**
     * 获取Set里的值
     * @param key
     * @return
     */
    public Set<Object> getSetValue(String key){
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * 移除key里的某个值
     * @param key
     * @param value
     * @return
     */
    public boolean removeSetValue(String key,Object value){
        redisTemplate.opsForSet().remove(key, value);
        return true;
    }
    /**
     * 移除key
     * @param key
     * @param
     * @return
     */
    public boolean removeSetKey(String key){
        redisTemplate.delete(key);
        return true;
    }

    /**
     * sIsMember命令 根据value从一个set中查询,是否存在
     *
     * @param key   键
     * @param value 值
     * @return true 存在 false不存在
     */
    public boolean sIsMember(String key, Object value) {
        try {
            return redisTemplate.opsForSet().isMember(key, value);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * sInter命令 获取key1与key2的交集
     *
     * @param key1 键
     * @param key2 键
     * @return 交集
     */
    public Set<Object> sinter(String key1, String key2) {
        try {
            return redisTemplate.opsForSet().intersect(key1, key2);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }







    /**
     * 判断缓存是否存在
     *
     * @param key
     * @return
     */
    public boolean containsKey(String key) {
        try {
            return redisTemplate.hasKey(key);
        } catch (Throwable e) {
            logger.error("判断缓存是否存在时失败key[" + key + "]", "err[" + e.getMessage() + "]");
        }
        return false;
    }

    /**
     * 根据key,获取缓存
     *
     * @param key -
     * @return -
     */
    public Object getValue(String key) {
        try {
            ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
            return valueOperations.get(key);
        } catch (Throwable e) {
            logger.error("获取缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
        }
        return null;
    }

    /**
     * 移除缓存
     *
     * @param key -
     * @return -
     */
    public boolean removeValue(String key) {
        try {
            redisTemplate.delete(key);
            return true;
        } catch (Throwable e) {
            logger.error("移除缓存时失败key[" + key + "]", "err[" + e.getMessage() + "]");
        }
        return false;
    }

    /**
     * 根据前缀移除所有以传入前缀开头的key-value
     *
     * @param pattern -
     * @return -
     */
    public boolean removeKeys(String pattern) {
        try {
            Set<String> keySet = redisTemplate.keys(pattern + "*");
            redisTemplate.delete(keySet);
            return true;
        } catch (Throwable e) {
            logger.error("移除key[" + pattern + "]前缀的缓存时失败", "err[" + e.getMessage() + "]");
        }
        return false;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值