当前位置 博文首页 > 、唐城:分享一个基于 Jedis 的 Redis 工具类

    、唐城:分享一个基于 Jedis 的 Redis 工具类

    作者:[db:作者] 时间:2021-08-20 19:00

    以下为部分代码,完整的代码和redis应用实例,请移步到码云。

    码云地址:

    https://gitee.com/JYFlyer/spring-boot-redis-case

    /**
    ?*?基于jedis的redis操作工具类
    ?*?@author?jyf
    ?*?@time?2019/8/3?22:30
    ?*/
    public?final?class?RedisUtils?{
    ?
    ???/*
    ????除了该工具类提供的方法外,还可以在外面调用getJedis()方法,获取到jedis实例后,调用它原生的api来操作
    ?????*/
    ?
    ????/**
    ?????*?获取jedis对象,并选择redis库。jedis默认是0号库,可传入1-16之间的数选择库存放数据
    ?????*?原则上使用一个redis库存放数据,通过特定的key的命令规则来区分不同的数据就行了。
    ?????*
    ?????*?@param?index redis库号。使用可变参数的目的就是该参数可传可不传。
    ?????*?@return?返回jedis对象
    ?????*/
    ????public?static?Jedis?getJedis(int...?index)?{
    ????????Jedis?jedis?=?MyJedisPoolConfig.getJedisPool().getResource();
    ????????if?(index?!=?null?&&?index.length?>?0)?{
    ????????????if?(index[0]?>?0?&&?index[0]?<=?16){
    ????????????????jedis.select(index[0]);
    ????????????}
    ????????}
    ????????return?jedis;
    ????}
    ?
    ????/*########################??key的操作??################################*/
    ?
    ????/**
    ?????*?根据pattern返回当前库中的key
    ?????*
    ?????*?@param?pattern
    ?????*?@return
    ?????*/
    ????public?static?Set<String>?keys(String?pattern)?{
    ????????Jedis?jedis?=?null;
    ????????Set<String>?keys?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????keys?=?jedis.keys(pattern);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?keys;
    ????}
    ?
    ????/**
    ?????*?删除一个或多个key
    ?????*
    ?????*?@param?key?一个或多个key
    ?????*/
    ????public?static?Long?del(String...?key)?{
    ????????Jedis?jedis?=?null;
    ????????Long?delNum?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????delNum?=jedis.del(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?delNum;
    ????}
    ?
    ????/**
    ?????*?批量删除
    ?????*?@param?keyList?要删除的key的集合
    ?????*/
    ????public?static?void?mdel(List<String>?keyList){
    ????????Jedis?jedis?=?getJedis();
    ????????//获取pipeline
    ????????Pipeline?pipeline?=?jedis.pipelined();
    ????????for?(String?key?:?keyList)?{
    ????????????pipeline.del(key);
    ????????}
    ????????//执行结果同步,这样才能保证结果的正确性。实际上不执行该方法也执行了上面的命令,但是结果确不一定完全正确。
    ????????//注意
    ????????pipeline.sync();
    ????????//关闭连接
    ????????jedis.close();
    ????}
    ?
    ????/**
    ?????*?判断某个key是否还存在
    ?????*
    ?????*?@param?key?key
    ?????*?@return
    ?????*/
    ????public?static?Boolean?exists(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????Boolean?flag?=?false;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????flag?=?jedis.exists(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?flag;
    ????}
    ?
    ????/**
    ?????*?设置某个key的过期时间,单位秒
    ?????*
    ?????*?@param?key?key
    ?????*?@param?seconds?过期时间秒
    ?????*/
    ????public?static?void?expire(String?key,?int?seconds)?{
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.expire(key,?seconds);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?查看某个key还有几秒过期,-1表示永不过期?,-2表示已过期
    ?????*
    ?????*?@param?key?key
    ?????*?@return
    ?????*/
    ????public?static?Long?timeToLive(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????Long?ttl;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????ttl?=?jedis.ttl(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?ttl;
    ????}
    ?
    ????/**
    ?????*?查看某个key对应的value的类型
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?String?type(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????String?type?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????type?=?jedis.type(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?type;
    ????}
    ?
    ?
    ????/*########################??string(字符串)的操作??####################*/
    ?
    ????/**
    ?????*?获取某个key的value,类型要对,只能value是string的才能获取
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?String?get(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????String?value?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????value?=?jedis.get(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?value;
    ????}
    ?
    ????/**
    ?????*?设置某个key的value
    ?????*
    ?????*?@param?key
    ?????*?@param?value
    ?????*/
    ????public?static?void?set(String?key,?String?value)?{
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.set(key,?value);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?字符串后追加内容
    ?????*
    ?????*?@param?key?key
    ?????*?@param?appendContent?要追加的内容
    ?????*/
    ????public?static?void?append(String?key,?String?appendContent)?{
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.append(key,?appendContent);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?返回key的value的长度
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?Long?strlen(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????Long?strLen?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????strLen?=?jedis.strlen(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?strLen;
    ????}
    ?
    ????/**
    ?????*?value?加1?必
    ?????*?须是字符型数字
    ?????*?@param?key
    ?????*?@return?增加后的值
    ?????*/
    ????public?static?Long?incr(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????Long?incrResult?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????incrResult?=?jedis.incr(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?incrResult;
    ????}
    ?
    ????/**
    ?????*?value?减1???必须是字符型数字
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?Long?decr(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????Long?decrResult?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????decrResult?=?jedis.decr(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?decrResult;
    ????}
    ?
    ????/**
    ?????*?value?加increment
    ?????*
    ?????*?@param?key?key
    ?????*?@param?increment?加几
    ?????*?@return
    ?????*/
    ????public?static?Long?incrby(String?key,?int?increment)?{
    ????????Jedis?jedis?=?null;
    ????????Long?incrByResult?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????incrByResult?=?jedis.incrBy(key,?increment);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?incrByResult;
    ????}
    ?
    ????/**
    ?????*?value?减increment
    ?????*
    ?????*?@param?key
    ?????*?@param?increment
    ?????*?@return
    ?????*/
    ????public?static?Long?decrby(String?key,?int?increment)?{
    ????????Jedis?jedis?=?null;
    ????????Long?decrByResult?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????decrByResult?=?jedis.decrBy(key,?increment);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?decrByResult;
    ????}
    ?
    ????/**
    ?????*?给某个key设置过期时间和value,成功返回OK
    ?????*
    ?????*?@param?key?key
    ?????*?@param?seconds?过期时间秒
    ?????*?@param?value?设置的值
    ?????*?@return
    ?????*/
    ????public?static?String?setex(String?key,?int?seconds,?String?value)?{
    ????????Jedis?jedis?=?null;
    ????????String?result?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????result?=?jedis.setex(key,?seconds,?value);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?result;
    ????}
    ?
    ?
    ????/*########################??list(列表)的操作??#######################*/
    ????//lpush?rpush?lpop?rpop?lrange?lindex?llen?lset
    ?
    ????/**
    ?????*?从左边向列表中添加值
    ?????*
    ?????*?@param?key?key
    ?????*?@param?str?要添加的值
    ?????*/
    ????public?static?void?lpush(String?key,?String?str)?{
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.lpush(key,?str);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?从右边向列表中添加值
    ?????*
    ?????*?@param?key?key
    ?????*?@param?str?要添加的值
    ?????*/
    ????public?static?void?rpush(String?key,?String?str)?{
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.rpush(key,?str);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?从左边取出一个列表中的值
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?String?lpop(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????String?lpop?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????lpop?=?jedis.lpop(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?lpop;
    ????}
    ?
    ????/**
    ?????*?从右边取出一个列表中的值
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?String?rpop(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????String?rpop?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????rpop?=?jedis.rpop(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?rpop;
    ????}
    ?
    ????/**
    ?????*?取出列表中指定范围内的值,0?到?-1?表示全部
    ?????*
    ?????*?@param?key
    ?????*?@param?startIndex
    ?????*?@param?endIndex
    ?????*?@return
    ?????*/
    ????public?static?List<String>?lrange(String?key,?int?startIndex,?int?endIndex)?{
    ????????Jedis?jedis?=?null;
    ????????List<String>?result?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????result?=?jedis.lrange(key,?startIndex,?endIndex);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?result;
    ????}
    ?
    ????/**
    ?????*?返回某列表指定索引位置的值
    ?????*
    ?????*?@param?key?列表key
    ?????*?@param?index?索引位置
    ?????*?@return
    ?????*/
    ????public?static?String?lindex(String?key,?int?index)?{
    ????????Jedis?jedis?=?null;
    ????????String?lindex?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????lindex?=?jedis.lindex(key,?index);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?lindex;
    ????}
    ?
    ????/**
    ?????*?返回某列表的长度
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?Long?llen(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????Long?llen?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????llen?=?jedis.llen(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?llen;
    ????}
    ?
    ????/**
    ?????*?给某列表指定位置设置为指定的值
    ?????*
    ?????*?@param?key
    ?????*?@param?index
    ?????*?@param?str
    ?????*/
    ????public?static?void?lset(String?key,?Long?index,?String?str)?{
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.lset(key,?index,?str);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?对列表进行剪裁,保留指定闭区间的元素(索引位置也会重排)
    ?????*?@param?key?列表key
    ?????*?@param?startIndex?开始索引位置
    ?????*?@param?endIndex?结束索引位置
    ?????*/
    ????public?static?void?ltrim(String?key,Integer?startIndex,Integer?endIndex){
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.ltrim(key,?startIndex,?endIndex);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?从列表的左边阻塞弹出一个元素
    ?????*?@param?key?列表的key
    ?????*?@param?timeout?阻塞超时时间,0表示若没有元素就永久阻塞
    ?????*?@return
    ?????*/
    ????public?static?List<String>?blpop(String?key,Integer?timeout){
    ????????Jedis?jedis?=?null;
    ????????List<String>?valueList?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????valueList?=?jedis.blpop(timeout,?key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?valueList;
    ????}
    ?
    ????/**
    ?????*?从列表的右边阻塞弹出一个元素
    ?????*?@param?key?列表的key
    ?????*?@param?timeout?阻塞超时时间,0表示若没有元素就永久阻塞
    ?????*?@return
    ?????*/
    ????public?static?List<String>?brpop(String?key,Integer?timeout){
    ????????Jedis?jedis?=?null;
    ????????List<String>?valueList?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????valueList?=?jedis.brpop(timeout,?key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?valueList;
    ????}
    ?
    ?
    ????/*########################??hash(哈希表)的操作??#######################*/
    ????//hset?hget?hmset?hmget?hgetall?hdel?hkeys?hvals?hexists?hincrby
    ?
    ????/**
    ?????*?给某个hash表设置一个键值对
    ?????*
    ?????*?@param?key
    ?????*?@param?field
    ?????*?@param?value
    ?????*/
    ????public?static?void?hset(String?key,?String?field,?String?value)?{
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.hset(key,?field,?value);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?取出某个hash表中某个field对应的value
    ?????*
    ?????*?@param?key?key
    ?????*?@param?field?field
    ?????*?@return
    ?????*/
    ????public?static?String?hget(String?key,?String?field)?{
    ????????Jedis?jedis?=?null;
    ????????String?hget?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????hget?=?jedis.hget(key,?field);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?hget;
    ????}
    ?
    ????/**
    ?????*?某个hash表设置一个或多个键值对
    ?????*
    ?????*?@param?key
    ?????*?@param?kvMap
    ?????*/
    ????public?static?void?hmset(String?key,?Map<String,?String>?kvMap)?{
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.hmset(key,?kvMap);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?取出某个hash表中任意多个key对应的value的集合
    ?????*
    ?????*?@param?key
    ?????*?@param?fields
    ?????*?@return
    ?????*/
    ????public?static?List<String>?hmget(String?key,?String...?fields)?{
    ????????Jedis?jedis?=?null;
    ????????List<String>?hmget?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????hmget?=?jedis.hmget(key,?fields);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?hmget;
    ????}
    ?
    ????/**
    ?????*?取出某个hash表中所有的键值对
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?Map<String,?String>?hgetall(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????Map<String,?String>?kvMap?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????kvMap?=?jedis.hgetAll(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?kvMap;
    ????}
    ?
    ????/**
    ?????*?判断某个hash表中的某个key是否存在
    ?????*
    ?????*?@param?key
    ?????*?@param?field
    ?????*?@return
    ?????*/
    ????public?static?Boolean?hexists(String?key,?String?field)?{
    ????????Jedis?jedis?=?null;
    ????????Boolean?exists?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????exists?=?jedis.hexists(key,?field);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?exists;
    ????}
    ?
    ????/**
    ?????*?返回某个hash表中所有的key
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?Set<String>?hkeys(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????Set<String>?keys?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????keys?=?jedis.hkeys(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?keys;
    ????}
    ?
    ????/**
    ?????*?返回某个hash表中所有的value
    ?????*
    ?????*?@param?key
    ?????*?@return
    ?????*/
    ????public?static?List<String>?hvals(String?key)?{
    ????????Jedis?jedis?=?null;
    ????????List<String>?hvals?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????hvals?=?jedis.hvals(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?hvals;
    ????}
    ?
    ????/**
    ?????*?删除某个hash表中的一个或多个键值对
    ?????*
    ?????*?@param?key
    ?????*?@param?fields
    ?????*/
    ????public?static?void?hdel(String?key,?String...?fields)?{
    ????????Jedis?jedis?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????jedis.hdel(key,?fields);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????}
    ?
    ????/**
    ?????*?给某个hash表中的某个field的value增加多少
    ?????*
    ?????*?@param?key???????hash表的key
    ?????*?@param?field?????表中的某个field
    ?????*?@param?increment?增加多少
    ?????*?@return
    ?????*/
    ????public?static?Long?hincrby(String?key,?String?field,?Long?increment)?{
    ????????Jedis?jedis?=?null;
    ????????Long?result?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????result?=?jedis.hincrBy(key,?field,?increment);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?result;
    ????}
    ?
    ????/*########################??set(集合)的操作??###########################*/
    ?
    ????/**
    ?????*?往set集合中添加一个或多个元素
    ?????*?@param?key?key
    ?????*?@param?members?要添加的元素
    ?????*?@return?添加成功的元素个数
    ?????*/
    ????public?static?Long?sadd(String?key,String...?members){
    ????????Jedis?jedis?=?null;
    ????????Long?num?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????num?=?jedis.sadd(key,?members);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?num;
    ????}
    ?
    ????/**
    ?????*?返回set集合中的所有元素,顺序与加入时的顺序一致
    ?????*?@param?key?key
    ?????*?@return
    ?????*/
    ????public?static?Set<String>?smembers(String?key){
    ????????Jedis?jedis?=?null;
    ????????Set<String>?members?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????members?=?jedis.smembers(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?members;
    ????}
    ?
    ????/**
    ?????*?判断集合中是否存在某个元素
    ?????*?@param?key?key
    ?????*?@param?member?某个元素
    ?????*?@return?true存在,false不存在
    ?????*/
    ????public?static?Boolean?sismember(String?key,String?member){
    ????????Jedis?jedis?=?null;
    ????????Boolean?isMember?=?false;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????isMember?=?jedis.sismember(key,?member);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?isMember;
    ????}
    ?
    ????/**
    ?????*?返回set集合的长度
    ?????*?@param?key?key
    ?????*?@return
    ?????*/
    ????public?static?Long?scard(String?key){
    ????????Jedis?jedis?=?null;
    ????????Long?len?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????len?=?jedis.scard(key);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?len;
    ????}
    ?
    ????/**
    ?????*?删除set集合中指定的一个或多个元素
    ?????*?@param?key
    ?????*?@param?members?要删除的元素
    ?????*?@return?删除成功的元素个数
    ?????*/
    ????public?static?Long?srem(String?key,String...?members){
    ????????Jedis?jedis?=?null;
    ????????Long?num?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????num?=?jedis.srem(key,members);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?num;
    ????}
    ?
    ????/**
    ?????*?将key1中的元素key1Member移动到key2中
    ?????*?@param?key1?来源集合key
    ?????*?@param?key2?目的地集合key
    ?????*?@param?key1Member?key1中的元素
    ?????*?@return?1成功,0失败
    ?????*/
    ????public?static?Long?smove(String?key1,String?key2,String?key1Member){
    ????????Jedis?jedis?=?null;
    ????????Long?num?=?0L;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????num?=?jedis.smove(key1,key2,key1Member);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?num;
    ????}
    ?
    ????/**
    ?????*?随机查询返回集合中的指定个数的元素(若count为负数,返回的元素可能会重复)
    ?????*?@param?key?key
    ?????*?@param?count?要查询返回的元素个数
    ?????*?@return?元素list集合
    ?????*/
    ????public?static?List<String>?srandmember(String?key,int?count){
    ????????Jedis?jedis?=?null;
    ????????List<String>?members?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????members?=?jedis.srandmember(key,count);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?members;
    ????}
    ?
    ????/**
    ?????*?从set集合中随机弹出指定个数个元素
    ?????*?@param?key?key
    ?????*?@param?count?要弹出的个数
    ?????*?@return?随机弹出的元素
    ?????*/
    ????public?static?Set<String>?spop(String?key,int?count){
    ????????Jedis?jedis?=?null;
    ????????Set<String>?members?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????members?=?jedis.spop(key,count);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?members;
    ????}
    ?
    ????/**
    ?????*?求交集,返回多个set集合相交的部分
    ?????*?@param?setKeys?多个set集合的key
    ?????*?@return?相交的元素集合
    ?????*/
    ????public?static?Set<String>?sinter(String...?setKeys){
    ????????Jedis?jedis?=?null;
    ????????Set<String>?members?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????members?=?jedis.sinter(setKeys);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?members;
    ????}
    ?
    ????/**
    ?????*?求并集,求几个set集合的并集(因为set中不会有重复的元素,合并后的集合也不会有重复的元素)
    ?????*?@param?setKeys?多个set的key
    ?????*?@return?合并后的集合
    ?????*/
    ????public?static?Set<String>?sunion(String...?setKeys){
    ????????Jedis?jedis?=?null;
    ????????Set<String>?members?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????members?=?jedis.sunion(setKeys);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?members;
    ????}
    ?
    ????/**
    ?????*?求差集,求几个集合之间的差集
    ?????*?@param?setKeys?多个set的key
    ?????*?@return?差集
    ?????*/
    ????public?static?Set<String>?sdiff(String...?setKeys){
    ????????Jedis?jedis?=?null;
    ????????Set<String>?members?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????members?=?jedis.sdiff(setKeys);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?members;
    ????}
    ?
    ?
    ????/*########################??zset(有序集合)的操作??#######################*/
    ?
    ????/**
    ?????*?添加一个元素到zset
    ?????*?@param?key?key
    ?????*?@param?score?元素的分数
    ?????*?@param?member?元素
    ?????*?@return?成功添加的元素个数
    ?????*/
    ????public?static?Long?zadd(String?key,double?score,?String?member){
    ????????Jedis?jedis?=?null;
    ????????Long?num?=?null;
    ????????try?{
    ????????????jedis?=?getJedis();
    ????????????num?=?jedis.zadd(key,score,member);
    ????????}finally?{
    ????????????if?(jedis?!=?null){
    ????????????????jedis.close();
    ????????????}
    ????????}
    ????????return?num;
    ????}
    }

    ?五年从程序员到架构师!这是我见过史上最好的程序员职业规划

    (下一篇)?16 条 yyds 的代码规范

    40 个 SpringBoot 常用注解

    别慌,在Java面试的时候,面试官会这样问关于框架的问题?

    想要实时关注更多干货好文,扫描下图关注:

    ?

    cs