diff --git a/ProtoStuffSerializerUtil.java b/ProtoStuffSerializerUtil.java new file mode 100644 index 0000000..910089d --- /dev/null +++ b/ProtoStuffSerializerUtil.java @@ -0,0 +1,119 @@ +package com.sirius.redisdemo.redis; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import com.dyuproject.protostuff.LinkedBuffer; +import com.dyuproject.protostuff.ProtostuffIOUtil; +import com.dyuproject.protostuff.Schema; +import com.dyuproject.protostuff.runtime.RuntimeSchema; +/** + * ProtoStuffSerializerUtil + * + * @author Sirius + * @date 2019-1-8 + */ +public class ProtoStuffSerializerUtil { + /** + * 序列化对象 + * @param obj + * @return + */ + public static byte[] serialize(T obj) { + if (obj == null) { + throw new RuntimeException("序列化对象(" + obj + ")!"); + } + @SuppressWarnings("unchecked") + Schema schema = (Schema) RuntimeSchema.getSchema(obj.getClass()); + LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024); + byte[] protostuff = null; + try { + protostuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer); + } catch (Exception e) { + throw new RuntimeException("序列化(" + obj.getClass() + ")对象(" + obj + ")发生异常!", e); + } finally { + buffer.clear(); + } + return protostuff; + } + + /** + * 反序列化对象 + * @param paramArrayOfByte + * @param targetClass + * @return + */ + public static T deserialize(byte[] paramArrayOfByte, Class targetClass) { + if (paramArrayOfByte == null || paramArrayOfByte.length == 0) { + throw new RuntimeException("反序列化对象发生异常,byte序列为空!"); + } + T instance = null; + try { + instance = targetClass.newInstance(); + } catch (InstantiationException e1) { + throw new RuntimeException("反序列化过程中依据类型创建对象失败!", e1); + } catch(IllegalAccessException e2){ + throw new RuntimeException("反序列化过程中依据类型创建对象失败!", e2); + } + Schema schema = RuntimeSchema.getSchema(targetClass); + ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema); + return instance; + } + + /** + * 序列化列表 + * @param objList + * @return + */ + public static byte[] serializeList(List objList) { + if (objList == null || objList.isEmpty()) { + throw new RuntimeException("序列化对象列表(" + objList + ")参数异常!"); + } + @SuppressWarnings("unchecked") + Schema schema = (Schema) RuntimeSchema.getSchema(objList.get(0).getClass()); + LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024); + byte[] protostuff = null; + ByteArrayOutputStream bos = null; + try { + bos = new ByteArrayOutputStream(); + ProtostuffIOUtil.writeListTo(bos, objList, schema, buffer); + protostuff = bos.toByteArray(); + } catch (Exception e) { + throw new RuntimeException("序列化对象列表(" + objList + ")发生异常!", e); + } finally { + buffer.clear(); + try { + if (bos != null) { + bos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return protostuff; + } + + /** + * 反序列化列表 + * @param paramArrayOfByte + * @param targetClass + * @return + */ + public static List deserializeList(byte[] paramArrayOfByte, Class targetClass) { + if (paramArrayOfByte == null || paramArrayOfByte.length == 0) { + throw new RuntimeException("反序列化对象发生异常,byte序列为空!"); + } + + Schema schema = RuntimeSchema.getSchema(targetClass); + List result = null; + try { + result = ProtostuffIOUtil.parseListFrom(new ByteArrayInputStream(paramArrayOfByte), schema); + } catch (IOException e) { + throw new RuntimeException("反序列化对象列表发生异常!", e); + } + return result; + } + +} diff --git a/README.md b/README.md index 6b6a9d4..bc740b8 100644 --- a/README.md +++ b/README.md @@ -1,354 +1,291 @@ # RedisUtil -#### 当前版本:1.1 -    增加更全的方法,对以前的部分方法进行了规范命名,请放心替换成新版本。 -   - -[Redis知识补充](#知识补充)
-[Redis与Spring集成](#三redis与spring的集成)
-[查看RedisUtil源代码](https://github.com/whvcse/RedisUtil/blob/master/RedisUtil.java) - ## 介绍 -最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作,力求符合Redis的原生操作! -
-分为六个部分:[keys命令操作](#一keys相关命令)、[String数据操作](#二string数据类型操作)、[Hash数据操作](#三hash相关的操作)、[List数据操作](#四list相关的操作)、[Set数据操作](#五set相关的操作)、[zSet数据操作](#六zset数据类型操作)。  -  + 最全的Java操作Redis的工具类,封装了对Redis五种基本类型的各种操作,力求符合Redis的原生操作,使用StringRedisTemplate实现! + +**快速导航:**
+[key命令操作](#一keys相关命令) | +[String数据操作](#二string数据类型操作) | +[Hash数据操作](#三hash相关的操作) | +[List数据操作](#四list相关的操作) | +[Set数据操作](#五set相关的操作) | +[zSet数据操作](#六zset数据类型操作) + +**相关知识:**
+[Redis基础知识补充](#知识补充) | +[Spring集成Redis](#三redis与spring的集成) | +[在SpringBoot中使用](#四SpringBoot中如何使用) + + +## 解惑 + 很多人提出疑问“为什么没有操作Object的方法?”,请看这里介绍[redistemplate和stringredistemplate](#二redistemplate和stringredistemplate)。 + ## 用法 ### 一、keys相关命令 -| 序号 | 方法 | 描述 | -|:----:|---------------------------------------------------------|-----------------------------------------------| -| 1 | void delete(String key) | key 存在时删除 key | -| 2 | void delete(Collection keys) | 批量删除key | -| 3 | byte[] dump(String key) | 序列化给定 key ,并返回被序列化的值 | -| 4 | Boolean hasKey(String key) | 检查给定 key 是否存在 | -| 5 | Boolean expire(String key, long timeout, TimeUnit unit) | 设置过期时间 | -| 6 | Boolean expireAt(String key, Date date) | 设置过期时间 | -| 7 | Set keys(String pattern) | 查找所有符合给定模式( pattern)的 key | -| 8 | Boolean move(String key, int dbIndex) | 将当前数据库的 key 移动到给定的数据库 db 当中 | -| 9 | Boolean persist(String key) | 移除 key 的过期时间,key 将持久保持 | -| 10 | Long getExpire(String key, TimeUnit unit) | 返回 key 的剩余的过期时间 | -| 11 | Long getExpire(String key) | 返回 key 的剩余的过期时间 | -| 12 | String randomKey() | 从当前数据库中随机返回一个 key | -| 13 | void rename(String oldKey, String newKey) | 修改 key 的名称 | -| 14 | Boolean renameIfAbsent(String oldKey, String newKey) | 仅当 newkey 不存在时,将 oldKey 改名为 newkey | -| 15 | DataType type(String key) | 返回 key 所储存的值的类型 | - ------ +| NO | 方法 | 描述 | +|:----:|---------------------------------------------------------|-----------------------------------------| +| 1 | void delete(String key) | key存在时删除key | +| 2 | void delete(Collection keys) | 批量删除key | +| 3 | byte[] dump(String key) | 序列化key,返回被序列化的值 | +| 4 | Boolean hasKey(String key) | 检查key是否存在 | +| 5 | Boolean expire(String key, long timeout, TimeUnit unit) | 设置过期时间 | +| 6 | Boolean expireAt(String key, Date date) | 设置过期时间 | +| 7 | Set keys(String pattern) | 查找所有符合给定模式(pattern)的key | +| 8 | Boolean move(String key, int dbIndex) | 将当前数据库的key移动到给定的数据库db当中 | +| 9 | Boolean persist(String key) | 移除key的过期时间,key将持久保持 | +| 10 | Long getExpire(String key, TimeUnit unit) | 返回key的剩余的过期时间 | +| 11 | Long getExpire(String key) | 返回key的剩余的过期时间 | +| 12 | String randomKey() | 从当前数据库中随机返回一个key | +| 13 | void rename(String oldKey, String newKey) | 修改key的名称 | +| 14 | Boolean renameIfAbsent(String oldKey, String newKey) | 仅当newkey不存在时,将oldKey改名为 newkey | +| 15 | DataType type(String key) | 返回key所储存的值的类型 | + +> **TimeUnit是时间单位,可选值有:**
+>  天:TimeUnit.DAYS、小时:TimeUnit.HOURS、分钟:TimeUnit.MINUTES、秒:TimeUnit.SECONDS、毫秒:TimeUnit.MILLISECONDS。 + +
### 二、String数据类型操作 -| 序号 | 方法 | 描述 | -|:----:|-------------------------------------------------------------------|------------------------------------------| -| 1 | String get(String key) | 获取指定 key 的值 | -| 2 | String getRange(String key, long start, long end) | 返回 key 中字符串值的子字符 | -| 3 | String getAndSet(String key, String value) | 将给定 key 的值设为 value ,并返回key
的旧值(old value)| -| 4 | Boolean getBit(String key, long offset) | 对 key 所储存的字符串值,获取指定偏移
量上的位(bit) | -| 5 | List multiGet(Collection keys) | 批量获取 | -| | | | -| 6 | void set(String key, String value) | 设置指定 key 的值 | -| 7 | boolean setBit(String key, long offset, boolean value) | 设置ASCII码, 字符串'a'的ASCII码是97, 转
为二进制是'01100001', 此方法是将
二进制第offset位值变为value | -| 8 | void setEx(String key, String value, long timeout, TimeUnit unit) | 将值 value 关联到 key ,并将 key 的过期
时间设为 timeout,unit:时间单位,
天:TimeUnit.DAYS 小时:TimeUnit.HOURS
分钟:TimeUnit.MINUTES,
秒:TimeUnit.SECONDS
毫秒:TimeUnit.MILLISECONDS | -| 9 | boolean setIfAbsent(String key, String value) | 只有在 key 不存在时设置 key 的值 | -| 10 | void setRange(String key, String value, long offset) | 用 value 参数覆写给定 key 所储存的字符串
值,从偏移量 offset 开始 | -| 11 | void multiSet(Map maps) | 批量添加 | -| 12 | boolean multiSetIfAbsent(Map maps) | 同时设置一个或多个 key-value 对,当且仅
当所有给定 key 都不存在 | -| | | | -| 13 | Integer append(String key, String value) | 追加到末尾 | -| 14 | Long incrBy(String key, long increment) | 增加(自增长), 负数则为自减 | -| 15 | Double incrByFloat(String key, double increment) | 增加(自增长), 负数则为自减 | -| 16 | Long size(String key) | 获取字符串的长度 | - ------- +| NO | 方法 | 描述 | +|:----:|-------------------------------------------------------------------|-------------------------------------| +| 1 | String get(String key) | 获取指定key的值 | +| 2 | String getRange(String key, long start, long end) | 返回key中字符串值的子字符 | +| 3 | String getAndSet(String key, String value) | 将key的值设为value,并返回key旧值 | +| 4 | Boolean getBit(String key, long offset) | 对key所储存的值,获取指定位置上的bit | +| 5 | List multiGet(Collection keys) | 批量获取 | +| | **添加相关** | | +| 6 | void set(String key, String value) | 设置指定key的值 | +| 7 | boolean setBit(String key, long offset, boolean value) | 设置指定位置上的ASCII码 | +| 8 | void setEx(String key,String value,long timeout,TimeUnit unit) | 将值value关联到key,并设置key过期时间 | +| 9 | boolean setIfAbsent(String key, String value) | 只有在 key 不存在时设置 key 的值 | +| 10 | void setRange(String key, String value, long offset) | 用value覆写key的值,从偏移量offset开始 | +| 11 | void multiSet(Map maps) | 批量添加 | +| 12 | boolean multiSetIfAbsent(Map maps) | 批量添加,仅当所有key都不存在 | +| | **其他方法** | | +| 13 | Integer append(String key, String value) | 追加到末尾 | +| 14 | Long incrBy(String key, long increment) | 增加(自增长), 负数则为自减 | +| 15 | Double incrByFloat(String key, double increment) | 增加(自增长), 负数则为自减 | +| 16 | Long size(String key) | 获取字符串的长度 | + +> **关于上面xxBit方法的使用:**
+>  例如字符'a'的ASCII码是97,转为二进制是'01100001',setBit方法就是把第offset位置上变成0或者1,true是1,false是0。 + +
### 三、Hash相关的操作 -| 序号 | 方法 | 描述 | -|:----:|----------------------------------------------------------------|-----------------------------------------------------| -| 1 | Object hGet(String key, String field) | 获取存储在哈希表中指定字段的值 | -| 2 | Map hGetAll(String key) | 获取所有给定字段的值 | -| 3 | List hMultiGet(String key, Collection fields) | 获取所有给定字段的值 | -| | | | -| 4 | void hPut(String key, String hashKey, String value) | 添加字段 | -| 5 | void hPutAll(String key, Map maps) | 添加多个字段 | -| 6 | Boolean hPutIfAbsent(String key, String hashKey, String value) | 仅当hashKey不存在时才设置 | -| | | | -| 7 | Long hDelete(String key, Object... fields) | 删除一个或多个哈希表字段 | -| 8 | boolean hExists(String key, String field) | 查看哈希表 key 中,指定的字段是
否存在 | -| 9 | Long hIncrBy(String key, Object field, long increment) | 为哈希表 key 中的指定字段的整数
值加上增量 increment | -| 10 | Double hIncrByFloat(String key, Object field, double delta) | 为哈希表 key 中的指定字段的整数
值加上增量 increment | -| 11 | Set hKeys(String key) | 获取所有哈希表中的字段 | -| 12 | Long hSize(String key) | 获取哈希表中字段的数量 | -| 13 | List hValues(String key) | 获取哈希表中所有值 | -| 14 | Cursor hScan(String key, ScanOptions options) | 迭代哈希表中的键值对 | - ---- +| NO | 方法 | 描述 | +|:----:|----------------------------------------------------------------|---------------------------------------| +| 1 | Object hGet(String key, String field) | 获取存储在哈希表中指定字段的值 | +| 2 | Map hGetAll(String key) | 获取所有给定字段的值 | +| 3 | List hMultiGet(String key, Collection fields) | 获取所有给定字段的值 | +| | **添加相关** | | +| 4 | void hPut(String key, String hashKey, String value) | 添加字段 | +| 5 | void hPutAll(String key, Map maps) | 添加多个字段 | +| 6 | Boolean hPutIfAbsent(String key,String hashKey,String value) | 仅当hashKey不存在时才设置 | +| | **其他方法** | | +| 7 | Long hDelete(String key, Object... fields) | 删除一个或多个哈希表字段 | +| 8 | boolean hExists(String key, String field) | 查看哈希表key中指定的字段是否存在 | +| 9 | Long hIncrBy(String key, Object field, long increment) | 为哈希表key中指定字段的值增加increment | +| 10 | Double hIncrByFloat(String key, Object field, double delta) | 为哈希表key中指定字段的值增加increment | +| 11 | Set hKeys(String key) | 获取所有哈希表中的字段 | +| 12 | Long hSize(String key) | 获取哈希表中字段的数量 | +| 13 | List hValues(String key) | 获取哈希表中所有值 | +| 14 | Cursor hScan(String key, ScanOptions options) | 迭代哈希表中的键值对 | +| | **引入序列化依赖** | com.dyuproject.protostuff protostuff-core 1.0.8 com.dyuproject.protostuff protostuff-runtime 1.0.8 | +| 15 | getListCache(final String key, Class targetClass) | 获取缓存中的List,targetClass是序列化的类 | +| 16 | putListCacheWithExpireTime(String key, List objList, final long expireTime) | 把List放到缓存,expireTime是过期策略 | + + + +
### 四、List相关的操作 -| 序号 | 方法 | 描述 | -|:----:|----------------------------------------------------------|-------------------------------------| -| 1 | String lIndex(String key, long index) | 通过索引获取列表中的元素 | -| 2 | List lRange(String key, long start, long end) | 获取列表指定范围内的元素 | -| | | | -| 3 | Long lLeftPush(String key, String value) | 存储在list头部 | -| 4 | Long lLeftPushAll(String key, String... value) | 存储在list头部 | -| 5 | Long lLeftPushAll(String key, Collection value) | 存储在list头部 | -| 6 | Long lLeftPushIfPresent(String key, String value) | 当list存在的时候才加入 | -| 7 | lLeftPush(String key, String pivot, String value) | 如果pivot存在,再pivot前面添加 | -| | | | -| 8 | Long lRightPush(String key, String value) | 存储在list尾部 | -| 9 | Long lRightPushAll(String key, String... value) | 存储在list尾部 | -| 10 | Long lRightPushAll(String key, Collection value) | 存储在list尾部 | -| 11 | Long lRightPushIfPresent(String key, String value) | 当list存在的时候才加入 | -| 12 | lRightPush(String key, String pivot, String value) | 在pivot元素的右边添加值 | -| | | | -| 13 | void lSet(String key, long index, String value) | 通过索引设置列表元素的值 | -| | | | -| 14 | String lLeftPop(String key) | 移出并获取列表的第一个元素 | -| 15 | String lBLeftPop(String key, long timeout, TimeUnit unit) | 移出并获取列表的第一个元素, 如果列
表没有元素会阻塞列表直到等待超时或
发现可弹出元素为止 | -| | | | -| 16 | String lRightPop(String key) | 移除并获取列表最后一个元素 | -| 17 | String lBRightPop(String key, long timeout, TimeUnit unit) | 移出并获取列表的最后一个元素, 如
果列表没有元素会阻塞列表直到等待超时
或发现可弹出元素为止 | -| 18 | String lRightPopAndLeftPush(String sourceKey, String destinationKey) | 移除列表的最后一个元素,
并将该元素添加到另一个列表并返回 | -| 19 | String lBRightPopAndLeftPush(String sourceKey, String destinationKey,,long timeout, TimeUnit unit) | 从列表中弹出一个值,将弹出的元素插入到
另外一个列表中并返回它; 如果列表没
有元素会阻塞列表直到等待超时或发现可弹出
元素为止 | -| | | | -| 20 | Long lRemove(String key, long index, String value) | 删除集合中值等于value得元素 | -| 21 | void lTrim(String key, long start, long end) | 裁剪list | -| 22 | Long lLen(String key) | 获取列表长度 | - ------ +| NO | 方法 | 描述 | +|:----:|----------------------------------------------------------|---------------------------------------------| +| 1 | String lIndex(String key, long index) | 通过索引获取列表中的元素 | +| 2 | List lRange(String key, long start, long end) | 获取列表指定范围内的元素 | +| | **添加相关** | | +| 3 | Long lLeftPush(String key, String value) | 存储在list头部 | +| 4 | Long lLeftPushAll(String key, String... value) | 存储在list头部 | +| 5 | Long lLeftPushAll(String key, Collection value) | 存储在list头部 | +| 6 | Long lLeftPushIfPresent(String key, String value) | 当list存在的时候才加入 | +| 7 | lLeftPush(String key, String pivot, String value) | 如果pivot存在,再pivot前面添加 | +| | | | +| 8 | Long lRightPush(String key, String value) | 存储在list尾部 | +| 9 | Long lRightPushAll(String key, String... value) | 存储在list尾部 | +| 10 | Long lRightPushAll(String key, Collection value) | 存储在list尾部 | +| 11 | Long lRightPushIfPresent(String key, String value) | 当list存在的时候才加入 | +| 12 | lRightPush(String key, String pivot, String value) | 在pivot元素的右边添加值 | +| | | | +| 13 | void lSet(String key, long index, String value) | 通过索引设置列表元素的值 | +| | **删除相关** | | +| 14 | String lLeftPop(String key) | 移出并获取列表的第一个元素 | +| 15 | String lBLeftPop(String key,long timeout,TimeUnit unit) | 移出并获取第一个元素,没有则阻塞直到超时或有为止 | +| | | | +| 16 | String lRightPop(String key) | 移除并获取列表最后一个元素 | +| 17 | String lBRightPop(String key,long timeout,TimeUnit unit) | 移出并获取最后个元素,没有则阻塞直到超时或有为止 | +| 18 | String lRightPopAndLeftPush(String sKey,String dKey) | 移除最后一个元素并加到另一个列表并返回 | +| 19 | String lBRightPopAndLeftPush(sKey,dKey,timeout,unit) | 移除最后个元素并加到另个列表并返回,阻塞超时或有 | +| | | | +| 20 | Long lRemove(String key, long index, String value) | 删除集合中值等于value得元素 | +| 21 | void lTrim(String key, long start, long end) | 裁剪list | +| | **其他方法** | | +| 22 | Long lLen(String key) | 获取列表长度 | + +
### 五、Set相关的操作 -#### 1.添加操作: -```java -//添加 -Long sAdd(String key, String... values); - -``` - -#### 2.获取操作: -```java -//获取集合所有元素 -Set sMembers(String key); - -//获取集合大小 -Long sSize(String key); - -//判断集合是否包含value -Boolean sIsMember(String key, Object value); - -//随机获取集合中的一个元素 -String sRandomMember(String key); - -//随机获取集合count个元素 -List sRandomMembers(String key, long count); - -//随机获取集合中count个元素并且去除重复的 -Set sDistinctRandomMembers(String key, long count); - -//使用迭代器获取元素 -Cursor sScan(String key, ScanOptions options); - -//------------------------------------------------------------------------------------- - -//获取两个集合的交集 -Set sIntersect(String key, String otherKey); - -//获取key集合与多个集合的交集 -Set sIntersect(String key, Collection otherKeys); - -//key集合与destKey集合的交集存储到destKey集合中 -Long sIntersectAndStore(String key, String otherKey, String destKey); - -//key集合与多个集合的交集存储到destKey集合中 -Long sIntersectAndStore(String key, Collection otherKeys, String destKey) - -//-------------------------------------------------------------------------------------- - -//获取两个集合的并集 -Set sUnion(String key, String otherKeys); - -//获取key集合与多个集合的并集 -Set sUnion(String key, Collection otherKeys); - -//key集合与otherKey集合的并集存储到destKey中 -Long sUnionAndStore(String key, String otherKey, String destKey); - -//key集合与多个集合的并集存储到destKey中 -Long sUnionAndStore(String key, Collection otherKeys, String destKey); - -//------------------------------------------------------------------------------------- - -//获取两个集合的差集 -Set sDifference(String key, String otherKey); - -//获取key集合与多个集合的差集 -Set sDifference(String key, Collection otherKeys); - -//key集合与otherKey集合的差集存储到destKey中 -Long sDifference(String key, String otherKey, String destKey); - -//key集合与多个集合的差集存储到destKey中 -Long sDifference(String key, Collection otherKeys, String destKey); - - -``` - -#### 3.修改操作: -```java -//移除 -Long sRemove(String key, Object... values); - -//随机移除一个元素 -String sPop(String key); -//将key集合中value元素移到destKey集合中 -Boolean sMove(String key, String value, String destKey); - -``` +| NO | 方法 | 描述 | +|:----:|--------------------------------------------------------------------------|-------------------------------| +| 1 | Set sMembers(String key) | 获取集合所有元素 | +| 2 | Long sSize(String key) | 获取集合大小 | +| 3 | Boolean sIsMember(String key, Object value) | 判断集合是否包含value | +| 4 | String sRandomMember(String key) | 随机获取集合中的一个元素 | +| 5 | List sRandomMembers(String key, long count) | 随机获取集合count个元素 | +| 6 | Set sDistinctRandomMembers(String key, long count) | 随机获取count个元素并去除重复的 | +| 7 | Cursor sScan(String key, ScanOptions options) | 使用迭代器获取元素 | +| | | | +| 8 | Set sIntersect(String key, String otherKey) | 获取两个集合的交集 | +| 9 | Set sIntersect(String key, Collection otherKeys) | 获取key集合与多个集合的交集 | +| 10 | Long sIntersectAndStore(String key, String oKey, String dKey) | key集合与oKey的交集存储到dKey中 | +| 11 | Long sIntersectAndStore(String key,Collection oKeys,String dKey) | key与多个集合的交集存储到dKey中 | +| | | | +| 12 | Set sUnion(String key, String otherKeys) | 获取两个集合的并集 | +| 13 | Set sUnion(String key, Collection otherKeys) | 获取key集合与多个集合的并集 | +| 14 | Long sUnionAndStore(String key, String otherKey, String destKey) | key集合与oKey的并集存储到dKey中 | +| 15 | Long sUnionAndStore(String key,Collection oKeys,String dKey) | key与多个集合的并集存储到dKey中 | +| | | | +| 16 | Set sDifference(String key, String otherKey) | 获取两个集合的差集 | +| 17 | Set sDifference(String key, Collection otherKeys) | 获取key集合与多个集合的差集 | +| 18 | Long sDifference(String key, String otherKey, String destKey) | key与oKey集合的差集存储到dKey中 | +| 19 | Long sDifference(String key,Collection otherKeys,String dKey) | key与多个集合的差集存储到dKey中 | +| | **添加相关** | | +| 20 | Long sAdd(String key, String... values) | 添加 | +| | **删除相关** | | +| 21 | Long sRemove(String key, Object... values) | 移除 | +| 22 | String sPop(String key) | 随机移除一个元素 | +| 23 | Boolean sMove(String key, String value, String destKey) | 将key集合中value移到destKey中 | + +
### 六、zset数据类型操作 -#### 1.添加操作: -```java -//添加元素,有序集合是按照元素的score值由小到大排列 -Boolean zAdd(String key, String value, double score); - -//批量添加 -Long zAdd(String key, Set> values); -//TypedTuple使用 -TypedTuple objectTypedTuple1 = new DefaultTypedTuple(value, score); - -``` - -#### 2.获取操作: -```java -//获取集合的元素, 从小到大排序, start开始位置, end结束位置 -Set zRange(String key, long start, long end); - -//获取集合元素, 并且把score值也获取 -Set> zRangeWithScores(String key, long start, long end); - -//根据Score值查询集合元素的值, 从小到大排序 -Set zRangeByScore(String key, double min, double max); - -//根据Score值查询集合元素, 从小到大排序 -Set> zRangeByScoreWithScores(String key, double min, double max); - -//根据Score值查询集合元素, 从小到大排序 -Set> zRangeByScoreWithScores(String key, double min, double max, long start, long end); - -//---------------------------------------------------------------------------------- - -//获取集合的元素, 从大到小排序 -Set zReverseRange(String key, long start, long end); - -//获取集合的元素, 从大到小排序, 并返回score值 -Set> zReverseRangeWithScores(String key, long start, long end); - -//根据Score值查询集合元素, 从大到小排序 -Set zReverseRangeByScore(String key, double min, double max); -//根据Score值查询集合元素, 从大到小排序 -Set> zReverseRangeByScoreWithScores(String key, double min, double max); +| NO | 方法 | 描述 | +|:----:|----------------------------------------------------------------------------|----------------------------------| +| 1 | Set zRange(String key, long start, long end) | 获取元素,小到大排序,s开始e结束位置 | +| 2 | Set> zRangeWithScores(String key, long start, long end) | 获取集合元素, 并且把score值也获取 | +| 3 | Set zRangeByScore(String key, double min, double max) | 根据score范围查询元素,从小到大排序 | +| 4 | Set> zRangeByScoreWithScores(key,double min,double max) | 根据score范围查询元素,并返回score | +| 5 | Set zRangeByScoreWithScores(key,double min,max,long start,end) | 根据score查询元素,s开始e结束位置 | +| | | | +| 6 | Set zReverseRange(String key, long start, long end) | 获取集合元素, 从大到小排序 | +| 7 | Set> zReverseRangeWithScores(key, long start, long end) | 获取元素,从大到小排序,并返回score | +| 8 | Set zReverseRangeByScore(String key, double min, double max) | 根据score范围查询元素,从大到小排序 | +| 9 | Set zReverseRangeByScoreWithScores(key,double min,double max) | 根据score查询,大到小排序返回score | +| 10 | Set zReverseRangeByScore(key, double min, max, long start, end) | 根据score查询,大到小,s开始e结束 | +| | | | +| 11 | Long zRank(String key, Object value) | 返回元素在集合的排名,score由小到大 | +| 12 | Long zReverseRank(String key, Object value) | 返回元素在集合的排名,score由大到小 | +| 13 | Long zCount(String key, double min, double max) | 根据score值范围获取集合元素的数量 | +| 14 | Long zSize(String key) | 获取集合大小 | +| 15 | Long zZCard(String key) | 获取集合大小 | +| 16 | Double zScore(String key, Object value) | 获取集合中value元素的score值 | +| | | | +| 17 | Long zUnionAndStore(String key, String otherKey, String destKey) | 获取key和oKey的并集并存储在dKey中 | +| 18 | Long zUnionAndStore(String key,Collection otherKeys,String dKey) | 获取key和多个集合并集并存在dKey中 | +| | | | +| 19 | Long zIntersectAndStore(String key, String otherKey, String destKey) | 获取key和oKey交集并存在destKey中 | +| 20 | Long zIntersectAndStore(String key,Collection oKeys,String dKey) | 获取key和多个集合交集并存在dKey中 | +| | | | +| 21 | Cursor> zScan(String key, ScanOptions options) | 使用迭代器获取 | +| | **添加相关** | | +| 22 | Boolean zAdd(String key, String value, double score) | 添加元素,zSet按score由小到大排列 | +| 23 | Long zAdd(String key, Set> values) | 批量添加,TypedTuple使用见下面介绍 | +| | **删除相关** | | +| 24 | Long zRemove(String key, Object... values) | 移除 | +| 25 | Double zIncrementScore(String key, String value, double delta) | 增加元素的score值,并返回增加后的值 | +| 26 | Long zRemoveRange(String key, long start, long end) | 移除指定索引位置的成员 | +| 27 | Long zRemoveRangeByScore(String key, double min, double max) | 根据指定的score值的范围来移除成员 | + +> **批量添加时`TypedTuple`的使用:**
+> TypedTuple typedTuple = new DefaultTypedTuple(value,score) + +

-// -Set zReverseRangeByScore(String key, double min, double max, long start, long end); -//----------------------------------------------------------------------------------- +## 知识补充 -//返回元素在集合的排名,有序集合是按照元素的score值由小到大排列 -Long zRank(String key, Object value); +### 一、Redis知识补充 + Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为:String(字符串)、List(列表)、Set(集合)、Hash(散列)和 zSet(有序集合)。 -//返回元素在集合的排名,按元素的score值由大到小排列 -Long zReverseRank(String key, Object value); +#### 1.String(字符串) -//根据score值获取集合元素数量 -Long zCount(String key, double min, double max); +**结构存储的值:**
+  可以是字符串、整数或者浮点数。 -//获取集合大小 -Long zSize(String key); +**结构的读写能力:**
+  对整个字符串或者字符串的其中一部分执行操作,对象和浮点数执行自增(increment)或者自减(decrement)。 -//获取集合大小 -Long zZCard(String key); +#### 2. List(列表) -//获取集合中value元素的score值 -Double zScore(String key, Object value); +**结构存储的值:**
+  一个链表,链表上的每个节点都包含了一个字符串。 -//------------------------------------------------------------------------------------ +**结构的读写能力:**
+  从链表的两端推入或者弹出元素,根据偏移量(offset)对链表进行修剪(trim),读取单个或者多个元素,根据值来查找或者移除元素。 -//获取key和otherKey的并集并存储在destKey中 -Long zUnionAndStore(String key, String otherKey, String destKey); +#### 3. Set(集合) -//获取key和多个集合的并集并存储在destKey中 -Long zUnionAndStore(String key, Collection otherKeys, String destKey) +**结构存储的值:**
+  包含字符串的无序收集器(unOrderedCollection),并且被包含的每个字符串都是独一无二的、各不相同。 -//----------------------------------------------------------------------------------- +**结构的读写能力:**
+  添加、获取、移除单个元素,检查一个元素是否存在于某个集合中,计算交集、并集、差集,从集合里面随机获取元素。 -//获取key和otherKey的交集并存储在destKey中 -Long zIntersectAndStore(String key, String otherKey, String destKey); +#### 4. Hash(散列) -//获取key和多个集合的交集并存储在destKey中 -Long zIntersectAndStore(String key, Collection otherKeys, String destKey); +**结构存储的值:**
+  包含键值对的无序散列表。 -//----------------------------------------------------------------------------------- +**结构的读写能力:**
+  添加、获取、移除单个键值对,获取所有键值对。 -//使用迭代器获取 -Cursor> zScan(String key, ScanOptions options); +#### 5. zSet(有序集合) -``` +**结构存储的值:**
+  字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值(score)的大小决定。 -#### 3.修改操作: -```java -//移除 -Long zRemove(String key, Object... values); +**结构的读写能力:**
+  添加、获取、删除单个元素,根据分值(score)范围(range)或者成员来获取元素。 -//增加元素的score值,并返回增加后的值 -Double zIncrementScore(String key, String value, double delta); +
-//移除指定索引位置的成员 -Long zRemoveRange(String key, long start, long end); +### 二、RedisTemplate和StringRedisTemplate +  二者主要区别是他们使用的序列化类不一样,RedisTemplate使用的是JdkSerializationRedisSerializer, +StringRedisTemplate使用的是StringRedisSerializer,两者的数据是不共通的。 -//根据指定的score值的范围来移除成员 -Long zRemoveRangeByScore(String key, double min, double max); +#### 1. RedisTemplate: +  RedisTemplate使用的是JDK的序列化策略,向Redis存入数据会将数据先序列化成字节数组然后在存入Redis数据库, +这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面:`\xAC\xED\x00\x05t\x05sr\x00`。 -``` - - - -## 知识补充 -### 一、Redis知识补充 -Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为:String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。 -     +  所以使用RedisTemplate可以把一个Java对象直接存储在Redis里面,但是存进去的数据是不易直观读的,不通用的, +建议不要直接存一个Object对象,可以变成Hash来存储,也可以转成json格式的数据来存储,在实际应用中也是很多都采用json格式来存储的。 -结构类型 | 结构存储的值 | 结构的读写能力 ----|---|--- -String | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行自增(increment)或者自减(decrement) -List | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值来查找或者移除元素 -Set | 包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二的、各不相同 | 添加、获取、移除单个元素;检查一个元素是否存在于某个集合中;计算交集、并集、差集;从集合里卖弄随机获取元素 -Hash | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对 -ZSet | 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素 +#### 2. StringRedisTemplate: +  StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的, +StringRedisTemplate是继承RedisTemplate的,这种对redis的操方式更优雅,任何Redis连接工具,都可以读出直观的数据,便于数据的维护。 +
- - -### 二、RedisTemplate和StringRedisTemplate -二者主要区别是他们使用的序列化类不一样,RedisTemplate使用的是JdkSerializationRedisSerializer, StringRedisTemplate使用的是StringRedisSerializer,两者的数据是不共通的。 - -#### 1.RedisTemplate: -   RedisTemplate使用的是JDK的序列化策略,向Redis存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面:\xAC\xED\x00\x05t\x05sr\x00。 -   所以使用RedisTemplate可以直接把一个java对象直接存储在redis里面。 - -#### 2.StringRedisTemplate: -   StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。StringRedisTemplate是继承RedisTemplate的,这种对redis的操方式更优雅,因为RedisTemplate以字节数组的形式存储不利于管理,也不通用。 -  - - - ### 三、Redis与Spring的集成 1.集成配置 -```java +```xml @@ -356,10 +293,9 @@ ZSet | 字符串成员(member)与浮点数分值(score)之间的有序映射, - + - + @@ -368,8 +304,8 @@ ZSet | 字符串成员(member)与浮点数分值(score)之间的有序映射, - - + + ``` @@ -378,3 +314,25 @@ ZSet | 字符串成员(member)与浮点数分值(score)之间的有序映射, @Autowired private RedisUtil redisUtil; ``` + +### 四、SpringBoot中如何使用 +修改你的RedisUtil代码: +```java +@Component +public class RedisUtil { + @Autowired + private StringRedisTemplate redisTemplate; + + ...... +} +``` +使用`@Autowired`自动注入redisTemplate。 + +
+ +## 推荐 + +[EasyWeb管理系统模板](http://easyweb.vip) | +[基于OAuth2.0的前后端分离开发平台](https://gitee.com/whvse/EasyWeb) + +
diff --git a/RedisUtil.java b/RedisUtil.java index 920169e..f49345d 100644 --- a/RedisUtil.java +++ b/RedisUtil.java @@ -1362,4 +1362,45 @@ public Long zIntersectAndStore(String key, Collection otherKeys, public Cursor> zScan(String key, ScanOptions options) { return redisTemplate.opsForZSet().scan(key, options); } + + /** + * 获取Redis List 序列化 + * @param key + * @param targetClass + * @param + * @return + */ + public List getListCache(final String key, Class targetClass) { + byte[] result = redisTemplate.execute(new RedisCallback() { + @Override + public byte[] doInRedis(RedisConnection connection) throws DataAccessException { + return connection.get(key.getBytes()); + } + }); + if (result == null) { + return null; + } + return ProtoStuffSerializerUtil.deserializeList(result, targetClass); + } + + /*** + * 将List 放进缓存里面 + * @param key + * @param objList + * @param expireTime + * @param + * @return + */ + public boolean putListCacheWithExpireTime(String key, List objList, final long expireTime) { + final byte[] bkey = key.getBytes(); + final byte[] bvalue = ProtoStuffSerializerUtil.serializeList(objList); + boolean result = redisTemplate.execute(new RedisCallback() { + @Override + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + connection.setEx(bkey, expireTime, bvalue); + return true; + } + }); + return result; + } } \ No newline at end of file