首页后端开发其他后端知识Java里RedisUtils工具类有哪些使用方式

Java里RedisUtils工具类有哪些使用方式

时间2024-03-25 00:12:03发布访客分类其他后端知识浏览1321
导读:这篇文章主要为大家详细介绍了Java里RedisUtils工具类有哪些使用方式的内容,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望对大家学习或工作能有帮助,接下来就跟随小编一起来学习吧。 前言 本文将提供一...
这篇文章主要为大家详细介绍了Java里RedisUtils工具类有哪些使用方式的内容,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望对大家学习或工作能有帮助,接下来就跟随小编一起来学习吧。

前言

本文将提供一个redis的工具类,可以用在Spring boot以及Spring Cloud项目中,本工具类主要整合了将Redis作为NoSql DB使用时的常用方法,以StringRedisTemplate实例为基础,封装了读取、写入、批量写入多个Redis hash等方法,降低了Redis学习成本,使业务代码更加高效、简洁、优雅。

一.pom.xml引入所需依赖

本依赖主要用于使用HashMultimap,该hashmap是java中的HashMap增强版,可以允许键值对中的key重复,此种特性可以用于Redis批量更新hash。后文详细讲述。

dependency>
    
    groupId>
    com.google.guava/groupId>
    
    artifactId>
    guava/artifactId>
    
    version>
    30.0-jre/version>
    
/dependency>
    

二.RedisUtils工具类

直接上源码,CV工程师必备,新建个Class,将其命名为RedisUtils ,后将首行包名修改下即可使用。

package com.xxx.utils;
    

import com.google.common.collect.HashMultimap;
    
import org.springframework.dao.DataAccessException;
    
import org.springframework.data.redis.connection.RedisConnection;
    
import org.springframework.data.redis.core.*;
    

import java.util.*;
    
import java.util.concurrent.TimeUnit;


/**
* @description: Redis工具类(String类型)
* @author: 大脑补丁
* @create: 2022-06-23 16:02
*/
public class RedisUtils {
    

 private StringRedisTemplate redisTemplate;


 public RedisUtils(StringRedisTemplate redisTemplate) {
    
  this.redisTemplate = redisTemplate;

 }


 /**
  * 写入缓存
  *
  * @param key  redis键
  * @param value redis值
  * @return 是否成功
  */
 public boolean set(final String key, String value) {
    
  boolean result = false;

  try {
    
   ValueOperationsString, String>
     operations = redisTemplate.opsForValue();
    
   operations.set(key, value);
    
   result = true;

  }
 catch (Exception e) {
    
   e.printStackTrace();

  }
    
  return result;

 }


 /**
  * 写入缓存设置时效时间
  *
  * @param key  redis键
  * @param value redis值
  * @return 是否成功
  */
 public boolean set(final String key, String value, Long expireTime) {
    
  boolean result = false;

  try {
    
   ValueOperationsString, String>
     operations = redisTemplate.opsForValue();
    
   operations.set(key, value);
    
   redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
    
   result = true;

  }
 catch (Exception e) {
    
   e.printStackTrace();

  }
    
  return result;

 }


 /**
  * 批量删除对应的键值对
  *
  * @param keys Redis键名数组
  */
 public void removeByKeys(final String... keys) {

  for (String key : keys) {
    
   remove(key);

  }

 }


 /**
  * 批量删除Redis key
  *
  * @param pattern 键名包含字符串(如:myKey*)
  */
 public void removePattern(final String pattern) {
    
  SetString>
     keys = redisTemplate.keys(pattern);
    
  if (keys != null &
    &
     keys.size() >
     0)
   redisTemplate.delete(keys);

 }


 /**
  * 删除key,也删除对应的value
  *
  * @param key Redis键名
  */
 public void remove(final String key) {

  if (exists(key)) {
    
   redisTemplate.delete(key);

  }

 }


 /**
  * 判断缓存中是否有对应的value
  *
  * @param key Redis键名
  * @return 是否存在
  */
 public Boolean exists(final String key) {
    
  return redisTemplate.hasKey(key);

 }


 /**
  * 读取缓存
  *
  * @param key Redis键名
  * @return 是否存在
  */
 public String get(final String key) {
    
  String result = null;
    
  ValueOperationsString, String>
     operations = redisTemplate.opsForValue();
    
  result = operations.get(key);
    
  return result;

 }


 /**
  * 哈希 添加
  *
  * @param key   Redis键
  * @param hashKey 哈希键
  * @param value  哈希值
  */
 public void hmSet(String key, String hashKey, String value) {
    
  HashOperationsString, String, String>
     hash = redisTemplate.opsForHash();
    
  hash.put(key, hashKey, value);

 }


 /**
  * 哈希获取数据
  *
  * @param key   Redis键
  * @param hashKey 哈希键
  * @return 哈希值
  */
 public String hmGet(String key, String hashKey) {
    
  HashOperationsString, String, String>
     hash = redisTemplate.opsForHash();
    
  return hash.get(key, hashKey);

 }


 /**
  * 判断hash是否存在键
  *
  * @param key   Redis键
  * @param hashKey 哈希键
  * @return 是否存在
  */
 public boolean hmHasKey(String key, String hashKey) {
    
  HashOperationsString, String, String>
     hash = redisTemplate.opsForHash();
    
  return hash.hasKey(key, hashKey);

 }


 /**
  * 删除hash中一条或多条数据
  *
  * @param key   Redis键
  * @param hashKeys 哈希键名数组
  * @return 删除数量
  */
 public long hmRemove(String key, String... hashKeys) {
    
  HashOperationsString, String, String>
     hash = redisTemplate.opsForHash();
    
  return hash.delete(key, hashKeys);

 }
    

 /**
  * 获取所有哈希键值对
  *
  * @param key Redis键名
  * @return 哈希Map
  */
 public MapString, String>
 hashMapGet(String key) {
    
  HashOperationsString, String, String>
     hash = redisTemplate.opsForHash();
    
  return hash.entries(key);

 }
    

 /**
  * 保存Map到哈希
  *
  * @param key Redis键名
  * @param map 哈希Map
  */
 public void hashMapSet(String key, MapString, String>
 map) {
    
  HashOperationsString, String, String>
     hash = redisTemplate.opsForHash();
    
  hash.putAll(key, map);

 }


 /**
  * 列表-追加值
  *
  * @param key  Redis键名
  * @param value 列表值
  */
 public void lPush(String key, String value) {
    
  ListOperationsString, String>
     list = redisTemplate.opsForList();
    
  list.rightPush(key, value);

 }
    

 /**
  * 列表-获取指定范围数据
  *
  * @param key  Redis键名
  * @param start 开始行号
  * @param end  结束行号
  * @return 列表
  */
 public ListString>
 lRange(String key, long start, long end) {
    
  ListOperationsString, String>
     list = redisTemplate.opsForList();
    
  return list.range(key, start, end);

 }


 /**
  * 集合添加
  *
  * @param key  Redis键名
  * @param value 值
  */
 public void add(String key, String value) {
    
  SetOperationsString, String>
     set = redisTemplate.opsForSet();
    
  set.add(key, value);

 }
    

 /**
  * 集合获取
  *
  * @param key Redis键名
  * @return 集合
  */
 public SetString>
 setMembers(String key) {
    
  SetOperationsString, String>
     set = redisTemplate.opsForSet();
    
  return set.members(key);

 }


 /**
  * 有序集合添加
  *
  * @param key  Redis键名
  * @param value 值
  * @param score 排序号
  */
 public void zAdd(String key, String value, double score) {
    
  ZSetOperationsString, String>
     zSet = redisTemplate.opsForZSet();
    
  zSet.add(key, value, score);

 }
    

 /**
  * 有序集合-获取指定范围
  *
  * @param key    Redis键
  * @param startScore 开始序号
  * @param endScore  结束序号
  * @return 集合
  */
 public SetString>
 rangeByScore(String key, double startScore, double endScore) {
    
  ZSetOperationsString, String>
     zset = redisTemplate.opsForZSet();
    
  return zset.rangeByScore(key, startScore, endScore);

 }
    

 /**
  * 模糊查询Redis键名
  *
  * @param pattern 键名包含字符串(如:myKey*)
  * @return 集合
  */
 public SetString>
 keys(String pattern) {
    
  return redisTemplate.keys(pattern);

 }
    

 /**
  * 获取多个hashMap
  *
  * @param keySet
  * @return ListMap  String, String>
    >
     hashMap列表
  */
 public List hashMapList(CollectionString>
 keySet) {
    
  return redisTemplate.executePipelined(new SessionCallbackString>
() {
    
   @Override
   public K, V>
     String execute(RedisOperationsK, V>
 operations) throws DataAccessException {
    
    HashOperations hashOperations = operations.opsForHash();

    for (String key : keySet) {
    
     hashOperations.entries(key);

    }
    
    return null;

   }

  }
    );

 }
    

 /**
  * 保存多个哈希表(HashMap)(Redis键名可重复)
  *
  * @param batchMap MapRedis键名,Map键,值>
    >
    
  */
 public void batchHashMapSet(HashMultimapString, MapString, String>
    >
 batchMap) {
    
  // 设置5秒超时时间
  redisTemplate.expire("max", 25, TimeUnit.SECONDS);
    
  redisTemplate.executePipelined(new RedisCallbackListMapString, String>
    >
    >
() {
    

   @Override
   public ListMapString, String>
    >
 doInRedis(RedisConnection connection) throws DataAccessException {
    
    IteratorMap.EntryString, MapString, String>
    >
    >
     iterator = batchMap.entries().iterator();

    while (iterator.hasNext()) {
    
     Map.EntryString, MapString, String>
    >
     hash = iterator.next();
    
     // 哈希名,即表名
     byte[] hashName = redisTemplate.getStringSerializer().serialize(hash.getKey());
    
     MapString, String>
     hashValues = hash.getValue();
    
     IteratorMap.EntryString, String>
    >
     it = hashValues.entrySet().iterator();
    
     // 将元素序列化后缓存,即表的多条哈希记录
     Mapbyte[], byte[]>
     hashes = new HashMapbyte[], byte[]>
    ();

     while (it.hasNext()) {
    
      // hash中一条key-value记录
      Map.EntryString, String>
     entry = it.next();
    
      byte[] key = redisTemplate.getStringSerializer().serialize(entry.getKey());
    
      byte[] value = redisTemplate.getStringSerializer().serialize(entry.getValue());
    
      hashes.put(key, value);

     }
    
     // 批量保存
     connection.hMSet(hashName, hashes);

    }
    
    return null;

   }

  }
    );

 }
    

 /**
  * 保存多个哈希表(HashMap)(Redis键名不可以重复)
  *
  * @param dataMap MapRedis键名,Map哈希键,哈希值>
    >
    
  */
 public void batchHashMapSet(MapString, MapString, String>
    >
 dataMap) {
    
  // 设置5秒超时时间
  redisTemplate.expire("max", 25, TimeUnit.SECONDS);
    
  redisTemplate.executePipelined(new RedisCallbackListMapString, String>
    >
    >
() {
    

   @Override
   public ListMapString, String>
    >
 doInRedis(RedisConnection connection) throws DataAccessException {
    
    IteratorMap.EntryString, MapString, String>
    >
    >
     iterator = dataMap.entrySet().iterator();

    while (iterator.hasNext()) {
    
     Map.EntryString, MapString, String>
    >
     hash = iterator.next();
    
     // 哈希名,即表名
     byte[] hashName = redisTemplate.getStringSerializer().serialize(hash.getKey());
    
     MapString, String>
     hashValues = hash.getValue();
    
     IteratorMap.EntryString, String>
    >
     it = hashValues.entrySet().iterator();
    
     // 将元素序列化后缓存,即表的多条哈希记录
     Mapbyte[], byte[]>
     hashes = new HashMapbyte[], byte[]>
    ();

     while (it.hasNext()) {
    
      // hash中一条key-value记录
      Map.EntryString, String>
     entry = it.next();
    
      byte[] key = redisTemplate.getStringSerializer().serialize(entry.getKey());
    
      byte[] value = redisTemplate.getStringSerializer().serialize(entry.getValue());
    
      hashes.put(key, value);

     }
    
     // 批量保存
     connection.hMSet(hashName, hashes);

    }
    
    return null;

   }

  }
    );

 }
    

 /**
  * 保存多个哈希表(HashMap)列表(哈希map的Redis键名不能重复)
  *
  * @param list MapRedis键名,Map哈希键,哈希值>
    >
    
  * @see RedisUtils*.batchHashMapSet()*
  */
 public void batchHashMapListSet(ListMapString, MapString, String>
    >
    >
 list) {
    
  // 设置5秒超时时间
  redisTemplate.expire("max", 25, TimeUnit.SECONDS);
    
  redisTemplate.executePipelined(new RedisCallbackListMapString, String>
    >
    >
() {
    

   @Override
   public ListMapString, String>
    >
 doInRedis(RedisConnection connection) throws DataAccessException {
    
    for (MapString, MapString, String>
    >
 dataMap : list) {
    
     IteratorMap.EntryString, MapString, String>
    >
    >
     iterator = dataMap.entrySet().iterator();

     while (iterator.hasNext()) {
    
      Map.EntryString, MapString, String>
    >
     hash = iterator.next();
    
      // 哈希名,即表名
      byte[] hashName = redisTemplate.getStringSerializer().serialize(hash.getKey());
    
      MapString, String>
     hashValues = hash.getValue();
    
      IteratorMap.EntryString, String>
    >
     it = hashValues.entrySet().iterator();
    
      // 将元素序列化后缓存,即表的多条哈希记录
      Mapbyte[], byte[]>
     hashes = new HashMapbyte[], byte[]>
    ();

      while (it.hasNext()) {
    
       // hash中一条key-value记录
       Map.EntryString, String>
     entry = it.next();
    
       byte[] key = redisTemplate.getStringSerializer().serialize(entry.getKey());
    
       byte[] value = redisTemplate.getStringSerializer().serialize(entry.getValue());
    
       hashes.put(key, value);

      }
    
      // 批量保存
      connection.hMSet(hashName, hashes);

     }

    }
    
    return null;

   }

  }
    );

 }


}
    

三.如何使用工具类

// 1.注入StringRedisTemplate
@Autowired
private StringRedisTemplate stringRedisTemplate

// 2.new一个工具类对象
RedisUtils redisUtils = new RedisUtils(stringRedisTemplate);
    

// 3.开心的调用工具类任意方法
MapString, String>
     map = redisUtils.hashMapGet(redisKey);
    

四.工具类中批量更新Redis Hash详解

工具类中batchHashMapSet()重载的方法有两个,特别的是,其中一个方法是支持key值重复的,也就说可以同时更新或写入Redis 键名相同的两个hash,后写入的hash会把先写入的数据覆盖,适合一些实时往Redis同步数据的业务场景。

使用方法:

HashMultimapString, MapString, String>
    >
     batchMap = HashMultimap.create();
    
redisUtils.batchHashMapSet(batchMap);
    

总结

本文提供了支持RedisUtils工具类,可以满足大多数场景把Redis作为NoSQL DB来使用的操作。



现在大家对于Java里RedisUtils工具类有哪些使用方式的内容应该都清楚了吧,希望大家阅读完这篇文章能有所收获。最后,想要了解更多Java里RedisUtils工具类有哪些使用方式的知识,欢迎关注网络,网络将为大家推送更多相关知识的文章。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Java里RedisUtils工具类有哪些使用方式
本文地址: https://pptw.com/jishu/652411.html
PHP遍历数组的方法有什么,怎么实现 基于Golang制作一个四则运算计算器怎样做

游客 回复需填写必要信息