# HOS-Redis

# 概述

在HOS平台中HOS-Redis组件提供了两个操作redis的工具类:RedisTenantUtil与RedisUtil。

  • RedisTenantUtil工具类支持多租户功能,根据多租户开关自动将租户id拼接到key中
  • RedisUtil工具类中无其他特殊处理,缓存key由开发者自定义

RedisUtil工具类提供了对常用数据类型(string,hash、list、set、sort set)的操作方法,如果想用redis来快速实现缓存的相关功能,可以参考HOSCache组件

如果想用redis实现分布式锁,可以参考Redisson分布式锁功能

# 配置

# 导入maven依赖

<dependency>
    <groupId>com.mediway.hos</groupId>
    <artifactId>hos-framework-redis-starter</artifactId>
</dependency>

# 配置文件

spring:
  redis:
    password: xxxxx #密码
    database: 0
    timeout: 5000 #连接超时时间(毫秒)
    #host: 127.0.0.1  #redis地址,单机模式下使用
    #port: 6379       #redis使用的接口,单机模式下使用
    #连接池相关配置,一般直接采用默认值,可以不写
    pool:
      max-activ: 8 #最大连接数(使用负值表示没有限制)
      max-wait: -1 #连接池最大阻塞等待时间(使用负值表示没有限制)
      max-idle: 8 #连接池中的最大空闲连接
      min-idle: 0 #连接池中的最小空闲连接
    #集群模式下的redis的ip和接口配置
    cluster:
      nodes: 192.16.18.196:7001,192.16.18.196:7002,192.16.18.196:7003,192.16.18.196:7004,192.16.18.196:7005,192.16.18.196:7006

# 功能介绍

两个工具类提供的方法完全一样,区别只是key的处理策略不同,具体方法如下:


// ***************************** normal *****************************
    /**
 * 对 redis 中指定键对应的数据设置失效时间
 *
 * @param key  键
 * @param time 时间(秒),time要大于0
 * @return
 */
public static boolean expire(String key, long time);

/**
 * 从 redis 中根据指定的 key 获取已设置的过期时间
 *
 * @param key 键,不能为null
 * @return 时间(秒),返回0代表为永久有效
 */
public static long getExpire(String key);

/**
 * 判断 redis 中是否存在指定的 key
 *
 * @param key 键,不能为null
 * @return true表示存在,false表示不存在
 */
public static boolean exists(String key);

/**
 * 从 redis 中移除指定 key 对应的数据
 *
 * @param keys 可以传一个值或多个
 */
public static long remove(String... keys);

/**
 * 从 redis 中根据表达式获取 key
 *
 * @param pattern
 * @return
 */
public static Set<String> getKeys(String pattern)

// ============================ String =============================

/**
 * 从 redis 中获取指定 key 对应的 string 数据
 *
 * @param key 键,不能为null
 * @return key 对应的字符串数据
 */
public static <T> T get(String key);

/**
 * 判断 redis 中指定 key 的数据对应偏移位置的 bit 位是否为 1
 *
 * @param key    键,不能为null
 * @param offset 偏移位置
 * @return true表示存在,false表示不存在
 */
public static boolean getBit(String key, long offset);

/**
 * 将指定的 key, value 放到 redis 中
 *
 * @param key   键,不能为null
 * @param value 值,不能为null
 * @return true表示成功,false表示失败
 */
public static <T> boolean set(String key, T value);

/**
 * 将指定的 key, value 放到 redis 中,并设置过期时间
 *
 * @param key   键,不能为null
 * @param value 值,不能为null
 * @param time  时间(秒),time要大于0,如果time小于等于0,将设置无限期
 * @return true表示成功,false表示失败
 */
public static <T> boolean set(String key, T value, long time);

/**
 * 将 redis 中指定 key 对应数据的偏移位置的 bit 位设置为 0/1
 *
 * @param key    键,不能为null
 * @param offset 偏移位置
 * @param flag   true表示设置为1,false表示设置为0
 * @return true表示成功,false表示失败
 */
public static boolean setBit(String key, long offset, boolean flag);

/**
 * 对 redis 中指定 key 的数据递增,并返回递增后的值
 *
 * @param key   键,不能为null
 * @param delta 要增加几(大于0)
 * @return
 */
public static long incr(String key, long delta);

/**
 * 对 redis 中指定 key 的数据递减,并返回递减后的值
 *
 * @param key   键,不能为null
 * @param delta 要减少几(大于0)
 * @return
 */
public static long decr(String key, long delta);


/**
 * 判断 redis 中指定 key 对应的 hash 表中是否有 hashKey
 *
 * @param key     键,不能为null
 * @param hashKey hash表中的键,不能为null
 * @return true表示存在,false表示不存在
 */
public static boolean hexists(String key, String hashKey)

/**
 * 从 redis 中获取指定 key 对应的 hash 表中的指定 hashKey 所对应的值
 *
 * @param key     键,不能为null
 * @param hashKey hash表中的键,不能为null
 * @return 值
 */
public static <T> T hget(String key, String hashKey)

/**
 * 向 redis 中指定 key 对应的 hash 表(如果 hash 表不存在则自动创建)中放入 hashKey,value 数据
 *
 * @param key     键,不能为null
 * @param hashKey hash表中的键,不能为null
 * @param value   值,不能为null
 * @return true表示成功,false表示失败
 */
public static <T> boolean hset(String key, String hashKey, T value);

/**
 * 向 redis 中指定 key 对应的 hash 表(如果 hash 表不存在则自动创建)中放入 hashKey,value 数据,并设置过期时间
 *
 * @param key     键,不能为null
 * @param hashKey hash表中的键,不能为null
 * @param value   值,不能为null
 * @param time    过期时间(秒),注意:如果已存在的hash表有时间,这里将会替换原有的时间
 * @return true表示成功,false表示失败
 */
public static <T> boolean hset(String key, String hashKey, T value, long time);

/**
 * 删除 redis 中指定 key 对应的 hash 表中等于 hashKeys 的数据
 *
 * @param key      键,不能为null
 * @param hashKeys hash表中的键,可以使多个,不能为null
 */
public static <T> void hdel(String key, T... hashKeys);

/**
 * 从 redis 中获取指定 key 对应的 hash 表,并返回相应的 map 对象
 *
 * @param key 键,不能为null
 * @return map对象,包含所有的键值对
 */
public static Map<?, ?> hmget(String key);

/**
 * 向 redis 中放入指定 key,并设置对应的数据类型为 map
 *
 * @param key 键,不能为null
 * @param map 多个键值对应的map,不能为null
 * @return true表示成功,false表示失败
 */
public static boolean hmset(String key, Map<String, ?> map);

/**
 * 向 redis 中放入指定 key,并设置对应的数据类型为 map 以及过期时间
 *
 * @param key  键,不能为null
 * @param map  对应多个键值,不能为null
 * @param time 时间(秒),time要大于0,如果time小于等于0,将设置无限期
 * @return true表示成功,false表示失败
 */
public static boolean hmset(String key, Map<String, ?> map, long time);

/**
 * 对 redis 中指定 key 对应的 hash 表(如果 hash 表不存在则自动创建)递增,并返回新增后的值
 *
 * @param key   键,不能为null
 * @param item  项,不能为null
 * @param delta 要增加几(大于0)
 * @return 新增后的值
 */
public static double hincr(String key, String item, double delta);

/**
 * 对 redis 中指定 key 对应的 hash 表(如果 hash 表不存在则自动创建)递增,并返回新增后的值
 *
 * @param key   键,不能为null
 * @param item  项,不能为null
 * @param delta 要减少几(大于0)
 * @return
 */
public static double hdecr(String key, String item, double delta);

/**
 * 从 redis 中移除指定 key 对应 hash 表中键为 values 的数据
 *
 * @param key    键,不能为null
 * @param values 值,不能为null
 * @return 移除的个数
 */
public static <T> long hremove(String key, T... values);

// ============================set=============================

/**
 * 判断 redis 中是否存在指定 key 对应的 set 对象
 *
 * @param key   键,不能为null
 * @param value 值,不能为null
 * @return true表示存在,false表示不存在
 */
public static <T> boolean sexists(String key, T value);

/**
 * 从 redis 中根据指定 key 对应的值,并返回 set 对象
 *
 * @param key 键,不能为null
 * @return
 */
public static Set<?> sget(String key);

/**
 * 向 redis 中放入指定 key 和数据,并设置其数据类型为 set
 *
 * @param key    键,不能为null
 * @param values 值,不能为null
 * @return 成功个数
 */
public static <T> long sset(String key, T... values);

/**
 * 向 redis 中放入指定 key 和数据,并设置其数据类型为 set 以及过期时间
 *
 * @param key    键,不能为null
 * @param time   过期时间(秒),注意:如果已存在的hash表有时间,这里将会替换原有的时间
 * @param values 值,不能为null
 * @return 成功个数
 */
public static <T> long sset(String key, long time, T... values)

/**
 * 获取 redis 中指定 key 对应 set 的大小
 *
 * @param key 键,不能为null
 * @return
 */
public static long ssize(String key);

/**
 * 从 redis 中移除指定 key 对应 set 中键为 values 的数据
 *
 * @param key    键,不能为null
 * @param values 值,不能为null
 * @return 移除的个数
 */
public static <T> long sremove(String key, T... values);

// =============================== list =================================


/**
 * 从 redis 中获取指定 key 对应 list 的大小
 *
 * @param key 键,不能为null
 * @return
 */
public static long lsize(String key);

/**
 * 从 redis 中获取指定 key 对应 list 中 index 位置的值
 *
 * @param key   键,不能为null
 * @param index 当index>=0时,0为表头,1为第二个元素,依次类推;当index<0时,-1为表尾,-2为倒数第二个元素,依次类推
 * @return
 */
public static <T> T lindex(String key, long index);

/**
 * 从 redis 中获取指定 key 对应 list 指定范围的值(start~end设置为0~-1将返回所有值)
 *
 * @param key   键,不能为null
 * @param start 起始位置,0表示起始位置
 * @param end   结束位置,-1表示结束位置
 * @return
 */
public static List<?> lget(String key, long start, long end);

/**
 * 向 redis 中放入指定 key,并设置数组类型为 list,将 value 加入到 list 尾部
 *
 * @param key   键,不能为null
 * @param value 值,不能为null
 * @return
 */
public static <T> boolean lset(String key, T value);

/**
 * 向 redis 中放入指定 key,并设置数组类型为 list,将 value 加入到 list 尾部,同时设置过期时间
 *
 * @param key   键,不能为null
 * @param value 值,不能为null
 * @param time  时间(秒),time要大于0,如果time小于等于0,将设置无限期
 * @return
 */
public static <T> boolean lset(String key, T value, long time);

/**
 * 向 redis 中放入指定 key,并设置数组类型为 list,并以 value 填入 list
 *
 * @param key   键,不能为null
 * @param value 值,不能为null
 * @return
 */
public static boolean lset(String key, List value);

/**
 * 向 redis 中放入指定 key,并设置数组类型为 list,并以 value 填入 list,同时设置过期时间
 *
 * @param key   键,不能为null
 * @param value 值,不能为null
 * @param time  时间(秒),time要大于0,如果time小于等于0,将设置无限期
 * @return
 */
public static boolean lset(String key, List value, long time);

/**
 * 将 redis 中指定 key 对应的 list 数据中指定 index 位置的数据更新为 value
 *
 * @param key   键,不能为null
 * @param index 索引
 * @param value 值,不能为null
 * @return
 */
public static <T> boolean lupdate(String key, long index, T value);

/**
 * 从 redis 中指定 key 对应的 list 中移除 n 个值为 value 的数据
 *
 * @param key   键,不能为null
 * @param count 移除多少个
 * @param value 值,不能为null
 * @return 移除的个数
 */
public static <T> long lremove(String key, long count, T value) ;



//Zset 根据 socre 排序   不重复 每个元素附加一个 socre  double类型的属性(double 可以重复)

/**
 * 添加 ZSet 元素
 * @param key
 * @param value
 * @param score
 */
public boolean zSetAdd(String key,Object value,double score);

/**
 * 批量添加 Zset 
 *
 *         Set<TypedTuple<Object>> tuples = new HashSet<>();
 *         TypedTuple<Object> objectTypedTuple1 = new DefaultTypedTuple<Object>("zset-5",9.6);
 *         tuples.add(objectTypedTuple1);
 * @param key
 * @param tuples
 * @return
 */
public Long zSetBatchAdd(String key,Set<ZSetOperations.TypedTuple<Object>> tuples);

/**
 * Zset 删除一个或多个元素
 * @param key
 * @param values
 * @return
 */
public Long zSetRemove(String key,Object ...values)