<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot2.X整合Redis

          共 26298字,需瀏覽 53分鐘

           ·

          2020-09-12 20:29

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          66套java從入門到精通實(shí)戰(zhàn)課程分享

          項(xiàng)目采用SpringBoot2.3.3
          項(xiàng)目目錄

          pom.xml文件

          <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0modelVersion>    <parent>        <groupId>org.springframework.bootgroupId>        <artifactId>spring-boot-starter-parentartifactId>        <version>2.3.3.RELEASEversion>        <relativePath/>     parent>    <groupId>net.auiogroupId>    <artifactId>spring-boot-redisartifactId>    <version>0.0.1-SNAPSHOTversion>    <name>spring-boot-redisname>    <description>Demo project for Spring Bootdescription>
          <properties> <java.version>1.8java.version> <springboot.version>2.2.3.RELEASEspringboot.version> <fastjson.version>1.2.54fastjson.version> properties>
          <dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> <version>${springboot.version}version> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-data-redisartifactId> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-pool2artifactId> dependency>
          <dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>${fastjson.version}version> dependency>

          <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-devtoolsartifactId> <scope>runtimescope> <optional>trueoptional> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> <exclusions> <exclusion> <groupId>org.junit.vintagegroupId> <artifactId>junit-vintage-engineartifactId> exclusion> exclusions> dependency> dependencies>
          <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> <configuration> <fork>truefork> configuration> plugin> plugins> build>
          project>

          application.properties

          spring.redis.host=localhostspring.redis.port=6379spring.redis.jedis.pool.max-active=8spring.redis.jedis.pool.max-idle=500spring.redis.jedis.pool.max-wait=-1spring.redis.jedis.pool.min-idle=0spring.redis.lettuce.shutdown-timeout=0

          RedisConfig.java

          package net.auio.springboot.config;
          import net.auio.springboot.Initializr.MyRedisSerInitializr;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer;
          import java.net.UnknownHostException;
          @Configurationpublic class RedisConfig {
          @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); MyRedisSerInitializr myRedisSerInitializr = new MyRedisSerInitializr(); template.setKeySerializer(stringRedisSerializer); template.setValueSerializer(myRedisSerInitializr); template.setHashKeySerializer(stringRedisSerializer); template.setHashValueSerializer(myRedisSerInitializr); return template;
          }
          }

          RedisController.java

          package net.auio.springboot.controller;
          import net.auio.springboot.exception.BusinessException;import net.auio.springboot.service.RedisService;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.*;
          import javax.annotation.Resource;@RestController@RequestMapping(value = "/redis")public class RedisController {
          @Resource RedisService redisService;
          @GetMapping(value = "/getvalue/{key}") public String getvalue(@PathVariable("key") String key){ if (!StringUtils.isEmpty(key)){ if(!redisService.hasKey(key)){ return "key不存在"; } Object o = redisService.get(key); return o.toString(); }else{ return "key不允許為空"; } }
          @PostMapping(value = "/add") public String addStringRedis(String key,String value){ try { redisService.set(key,value); return key+"添加成功"; } catch (Exception e) { e.printStackTrace(); throw new BusinessException(1001,e.getMessage()); } }}

          BusinessException.java

          package net.auio.springboot.exception;
          public class BusinessException extends RuntimeException { private final int messageCode; private final String detailMessage;
          public BusinessException(int messageCode,String message){ super(message); this.messageCode=messageCode; this.detailMessage =message; }
          public int getMessageCode() { return messageCode; }
          public String getDetailMessage() { return detailMessage; }}

          MyRedisSerInitializr.java

          package net.auio.springboot.Initializr;
          import com.alibaba.fastjson.JSON;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.SerializationException;
          import java.nio.charset.Charset;import java.nio.charset.StandardCharsets;
          public class MyRedisSerInitializr implements RedisSerializer<Object> {
          private final Charset charset;
          public MyRedisSerInitializr() { this(StandardCharsets.UTF_8); }
          public MyRedisSerInitializr(Charset charset) { this.charset = charset; }
          @Override public byte[] serialize(Object o) throws SerializationException { if(o==null){ return new byte[0]; } if (o instanceof String){ return o.toString().getBytes(charset); }else { String string=JSON.toJSONString(o); return string.getBytes(charset); } }
          @Override public Object deserialize(byte[] bytes) throws SerializationException { return (bytes==null ? null : new String(bytes,charset)); }}

          RedisService.java

          package net.auio.springboot.service;
          import net.auio.springboot.exception.BusinessException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;
          import javax.annotation.Resource;import java.util.*;import java.util.concurrent.TimeUnit;@Servicepublic class RedisService { @Resource private RedisTemplate redisTemplate; /** -------------------key相關(guān)操作--------------------- */ /** * 是否存在key * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.Boolean * @throws */ public Boolean hasKey(String key) { if (null==key){ return false; } return redisTemplate.hasKey(key); } /** * 刪除key * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return Boolean 成功返回true 失敗返回false * @throws */ public Boolean delete(String key) { if (null==key){ return false; } return redisTemplate.delete(key); } /** * 批量刪除key * @Author: 妖妖玖 * @CreateDate: 2019/8/27 20:27 * @UpdateUser: * @UpdateDate: 2019/8/27 20:27 * @Version: 0.0.1 * @param keys * @return Long 返回成功刪除key的數(shù)量 * @throws */ public Long delete(Collection keys) { return redisTemplate.delete(keys); } /** * 設(shè)置過期時(shí)間 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param timeout ? * @param unit * @return java.lang.Boolean * @throws */ public Boolean expire(String key, long timeout, TimeUnit unit) { if (null==key||null==unit){ return false; } return redisTemplate.expire(key, timeout, unit); } /** * 查找匹配的key * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param pattern * @return java.util.Set * @throws */ public Set keys(String pattern) { if (null==pattern){ return null; } return redisTemplate.keys(pattern); } /** * 移除 key 的過期時(shí)間,key 將持久保持 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.Boolean * @throws */ public Boolean persist(String key) { if (null==key){ return false; } return redisTemplate.persist(key); } /** * 返回 key 的剩余的過期時(shí)間 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param unit * @return java.lang.Long 當(dāng) key 不存在時(shí),返回 -2 。當(dāng) key 存在但沒有設(shè)置剩余生存時(shí)間時(shí),返回 -1 。否 則,以秒為單位,返回 key的剩余生存時(shí)間 * @throws */ public Long getExpire(String key, TimeUnit unit) { if(null==key||null==unit){ throw new BusinessException(4001004,"key or TomeUnit 不能為空"); } return redisTemplate.getExpire(key, unit); } //*************String相關(guān)數(shù)據(jù)類型*************************** /** * 設(shè)置指定 key 的值 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param value * @return void * @throws */ public void set(String key, Object value) { if(null==key||null==value){ return; } redisTemplate.opsForValue().set(key, value); } /** * 設(shè)置key 的值 并設(shè)置過期時(shí)間 * @Author: 妖妖玖 迎學(xué)教育 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param value ? * @param time ? * @param unit * @return void * @throws */ public void set(String key,Object value,long time,TimeUnit unit){ if(null==key||null==value||null==unit){ return; } redisTemplate.opsForValue().set(key,value,time,unit); } /** * 設(shè)置key 的值 并設(shè)置過期時(shí)間 * key存在 不做操作返回false * key不存在設(shè)置值返回true * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param value ? * @param time ? * @param unit * @return java.lang.Boolean * @throws */ public Boolean setifAbsen(String key,Object value,long time,TimeUnit unit){ if(null==key||null==value||null==unit){ throw new BusinessException(4001004,"kkey、value、unit都不能為空"); } return redisTemplate.opsForValue().setIfAbsent(key,value,time,unit); } /** * 獲取指定Key的Value。如果與該Key關(guān)聯(lián)的Value不是string類型,Redis將拋出異常, * 因?yàn)镚ET命令只能用于獲取string Value,如果該Key不存在,返回null * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.Object * @throws */ public Object get(String key){ if(null==key){ return null; } return redisTemplate.opsForValue().get(key); } /** * 很明顯先get再set就說先獲取key值對應(yīng)的value然后再set 新的value 值。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param value * @return java.lang.Object * @throws */ public Object getSet(String key,Object value){ if(null==key){ return null; } return redisTemplate.opsForValue().getAndSet(key,value); } /** * 通過批量的key獲取批量的value * @Author: 妖妖玖 迎學(xué)教育 * @UpdateUser: * @Version: 0.0.1 * @param keys * @return java.util.List * @throws */ public List mget(Collection keys){ if(null==keys){ return Collections.emptyList(); } return redisTemplate.opsForValue().multiGet(keys); } /** * 將指定Key的Value原子性的增加increment。如果該Key不存在,其初始值為0,在incrby之后其值為increment。 * 如果Value的值不能轉(zhuǎn)換為整型值,如Hi,該操作將執(zhí)行失敗并拋出相應(yīng)異常。操作成功則返回增加后的value值。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param increment * @return long * @throws */ public long incrby(String key,long increment){ if(null==key){ throw new BusinessException(4001004,"key不能為空"); } return redisTemplate.opsForValue().increment(key,increment); } /** * * 將指定Key的Value原子性的減少decrement。如果該Key不存在,其初始值為0, * 在decrby之后其值為-decrement。如果Value的值不能轉(zhuǎn)換為整型值, * 如Hi,該操作將執(zhí)行失敗并拋出相應(yīng)的異常。操作成功則返回減少后的value值。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param decrement * @return java.lang.Long * @throws */ public Long decrby(String key,long decrement){ if(null==key){ throw new BusinessException(4001004,"key不能為空"); } return redisTemplate.opsForValue().decrement(key,decrement); } /** * 如果該Key已經(jīng)存在,APPEND命令將參數(shù)Value的數(shù)據(jù)追加到已存在Value的末尾。如果該Key不存在, * APPEND命令將會(huì)創(chuàng)建一個(gè)新的Key/Value。返回追加后Value的字符串長度。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param value * @return java.lang.Integer * @throws */ public Integer append(String key,String value){ if(key==null){ throw new BusinessException(4001004,"key不能為空"); } return redisTemplate.opsForValue().append(key,value); }//******************hash數(shù)據(jù)類型********************* /** * 通過key 和 field 獲取指定的 value * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param field 迎學(xué)教育 * @return java.lang.Object * @throws */ public Object hget(String key, Object field) { if(null==key||null==field){ return null; } return redisTemplate.opsForHash().get(key,field); } /** * 為指定的Key設(shè)定Field/Value對,如果Key不存在,該命令將創(chuàng)建新Key以用于存儲(chǔ)參數(shù)中的Field/Value對, * 如果參數(shù)中的Field在該Key中已經(jīng)存在,則用新值覆蓋其原有值。 * 返回1表示新的Field被設(shè)置了新值,0表示Field已經(jīng)存在,用新值覆蓋原有值。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param field * @param value * @return * @throws */ public void hset(String key, Object field, Object value) { if(null==key||null==field){ return; } redisTemplate.opsForHash().put(key,field,value); } /** * 判斷指定Key中的指定Field是否存在,返回true表示存在,false表示參數(shù)中的Field或Key不存在。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param field * @return java.lang.Boolean * @throws */ public Boolean hexists(String key, Object field) { if(null==key||null==field){ return false; } return redisTemplate.opsForHash().hasKey(key,field); } /** * 從指定Key的Hashes Value中刪除參數(shù)中指定的多個(gè)字段,如果不存在的字段將被忽略, * 返回實(shí)際刪除的Field數(shù)量。如果Key不存在,則將其視為空Hashes,并返回0。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param fields * @return java.lang.Long * @throws */ public Long hdel(String key, Object... fields) { if(null==key||null==fields||fields.length==0){ return 0L; } return redisTemplate.opsForHash().delete(key,fields); } /** * 通過key獲取所有的field和value * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.util.Map * @throws */ public Map hgetall(String key) { if(key==null){ return null; } return redisTemplate.opsForHash().entries(key); } /** * 逐對依次設(shè)置參數(shù)中給出的Field/Value對。如果其中某個(gè)Field已經(jīng)存在,則用新值覆蓋原有值。 * 如果Key不存在,則創(chuàng)建新Key,同時(shí)設(shè)定參數(shù)中的Field/Value。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param hash * @return * @throws */ public void hmset(String key, Map hash) { if(null==key||null==hash){ return; } redisTemplate.opsForHash().putAll(key,hash); } /** * 獲取和參數(shù)中指定Fields關(guān)聯(lián)的一組Values,其返回順序等同于Fields的請求順序。 * 如果請求的Field不存在,其值對應(yīng)的value為null。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param fields * @return java.util.List * @throws */ public List hmget(String key, Collection fields) { if(null==key||null==fields){ return null; } return redisTemplate.opsForHash().multiGet(key,fields); } /** * 對應(yīng)key的字段自增相應(yīng)的值 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param field ? * @param increment * @return java.lang.Long * @throws */ public Long hIncrBy(String key,Object field,long increment){ if (null==key||null==field){ throw new BusinessException(4001004,"key or field 不能為空"); } return redisTemplate.opsForHash().increment(key,field,increment); } //***************List數(shù)據(jù)類型*************** /** * 向列表左邊添加元素。如果該Key不存在,該命令將在插入之前創(chuàng)建一個(gè)與該Key關(guān)聯(lián)的空鏈表,之后再將數(shù)據(jù)從鏈表的頭部插入。 * 如果該鍵的Value不是鏈表類型,該命令將將會(huì)拋出相關(guān)異常。操作成功則返回插入后鏈表中元素的數(shù)量。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param strs 可以使一個(gè)string 也可以使string數(shù)組 迎學(xué)教育 * @return java.lang.Long 返回操作的value個(gè)數(shù) * @throws */ public Long lpush(String key, Object... strs) { if(null==key){ return 0L; } return redisTemplate.opsForList().leftPushAll(key,strs); } /** * 向列表右邊添加元素。如果該Key不存在,該命令將在插入之前創(chuàng)建一個(gè)與該Key關(guān)聯(lián)的空鏈表,之后再將數(shù)據(jù)從鏈表的尾部插入。 * 如果該鍵的Value不是鏈表類型,該命令將將會(huì)拋出相關(guān)異常。操作成功則返回插入后鏈表中元素的數(shù)量。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param strs 可以使一個(gè)string 也可以使string數(shù)組 * @return java.lang.Long 返回操作的value個(gè)數(shù) * @throws */ public Long rpush(String key, Object... strs) { if(null==key){ return 0L; } return redisTemplate.opsForList().rightPushAll(key,strs); } /** * 返回并彈出指定Key關(guān)聯(lián)的鏈表中的第一個(gè)元素,即頭部元素。如果該Key不存在, * 返回nil。LPOP命令執(zhí)行兩步操作:第一步是將列表左邊的元素從列表中移除,第二步是返回被移除的元素值。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.Object * @throws */ public Object lpop(String key) { if(null==key){ return null; } return redisTemplate.opsForList().leftPop(key); } /** * 返回并彈出指定Key關(guān)聯(lián)的鏈表中的最后一個(gè)元素,即頭部元素。如果該Key不存在,返回nil。 * RPOP命令執(zhí)行兩步操作:第一步是將列表右邊的元素從列表中移除,第二步是返回被移除的元素值。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.Object * @throws */ public Object rpop(String key) { if(null==key){ return null; } return redisTemplate.opsForList().rightPop(key); } /** *該命令的參數(shù)start和end都是0-based。即0表示鏈表頭部(leftmost)的第一個(gè)元素。 * 其中start的值也可以為負(fù)值,-1將表示鏈表中的最后一個(gè)元素,即尾部元素,-2表示倒數(shù)第二個(gè)并以此類推。 * 該命令在獲取元素時(shí),start和end位置上的元素也會(huì)被取出。如果start的值大于鏈表中元素的數(shù)量, * 空鏈表將會(huì)被返回。如果end的值大于元素的數(shù)量,該命令則獲取從start(包括start)開始,鏈表中剩余的所有元素。 * 注:Redis的列表起始索引為0。顯然,LRANGE numbers 0 -1 可以獲取列表中的所有元素。返回指定范圍內(nèi)元素的列表。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param start * @param end * @return java.util.List 迎學(xué)教育 * @throws */ public List lrange(String key, long start, long end) { if(null==key){ return null; } return redisTemplate.opsForList().range(key,start,end); } /** * 讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除。 * 下標(biāo) 0 表示列表的第一個(gè)元素,以 1 表示列表的第二個(gè)元素,以此類推。 * 你也可以使用負(fù)數(shù)下標(biāo),以 -1 表示列表的最后一個(gè)元素, -2 表示列表的倒數(shù)第二個(gè)元素,以此類推。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param start * @param end * @return * @throws */ public void ltrim(String key, long start, long end) { if(null==key){ return; } redisTemplate.opsForList().trim(key,start,end); } /** * 該命令將返回鏈表中指定位置(index)的元素,index是0-based,表示從頭部位置開始第index的元素, * 如果index為-1,表示尾部元素。如果與該Key關(guān)聯(lián)的不是鏈表,該命令將返回相關(guān)的錯(cuò)誤信息。如果超出index返回這返回nil。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @param index * @return java.lang.Object * @throws */ public Object lindex(String key, long index) { if(null==key){ return null; } return redisTemplate.opsForList().index(key,index); } /** * 返回指定Key關(guān)聯(lián)的鏈表中元素的數(shù)量,如果該Key不存在,則返回0。如果與該Key關(guān)聯(lián)的Value的類型不是鏈表,則拋出相關(guān)的異 常。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.Long * @throws */ public Long llen(String key) { if(null==key){ return 0L; } return redisTemplate.opsForList().size(key); } //***************Set數(shù)據(jù)類型************* /** * 如果在插入的過程用,參數(shù)中有的成員在Set中已經(jīng)存在,該成員將被忽略,而其它成員仍將會(huì)被正常插入。 * 如果執(zhí)行該命令之前,該Key并不存在,該命令將會(huì)創(chuàng)建一個(gè)新的Set,此后再將參數(shù)中的成員陸續(xù)插入。返回實(shí)際插入的成員數(shù)量。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param members 可以是一個(gè)String 也可以是一個(gè)String數(shù)組 * @return java.lang.Long 添加成功的個(gè)數(shù) 迎學(xué)教育 * @throws */ public Long sadd(String key, Object... members) { if (null==key){ return 0L; } return redisTemplate.opsForSet().add(key, members); } /** * 返回Set中成員的數(shù)量,如果該Key并不存在,返回0。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.Long * @throws */ public Long scard(String key) { if (null==key){ return 0L; } return redisTemplate.opsForSet().size(key); } /** * 判斷參數(shù)中指定成員是否已經(jīng)存在于與Key相關(guān)聯(lián)的Set集合中。返回true表示已經(jīng)存在,false表示不存在,或該Key本身并不存 在。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param member * @return java.lang.Boolean * @throws */ public Boolean sismember(String key, Object member) { if (null==key){ return false; } return redisTemplate.opsForSet().isMember(key,member); } /** * 和SPOP一樣,隨機(jī)的返回Set中的一個(gè)成員,不同的是該命令并不會(huì)刪除返回的成員。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.String * @throws */ public Object srandmember(String key) { if (null==key){ return null; } return redisTemplate.opsForSet().randomMember(key); } /** * 和SPOP一樣,隨機(jī)的返回Set中的一個(gè)成員,不同的是該命令并不會(huì)刪除返回的成員。 * 還可以傳遞count參數(shù)來一次隨機(jī)獲得多個(gè)元素,根據(jù)count的正負(fù)不同,具體表現(xiàn)也不同。 * 當(dāng)count 為正數(shù)時(shí),SRANDMEMBER 會(huì)隨機(jī)從集合里獲得count個(gè)不重復(fù)的元素。 * 如果count的值大于集合中的元素個(gè)數(shù),則SRANDMEMBER 會(huì)返回集合中的全部元素。 * 當(dāng)count為負(fù)數(shù)時(shí),SRANDMEMBER 會(huì)隨機(jī)從集合里獲得|count|個(gè)的元素,如果|count|大與集合中的元素, * 就會(huì)返回全部元素不夠的以重復(fù)元素補(bǔ)齊,如果key不存在則返回nil。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param count 迎學(xué)教育 * @return java.util.List * @throws */ public List srandmember(String key,int count) { if(null==key){ return null; } return redisTemplate.opsForSet().randomMembers(key,count); } /** * 通過key隨機(jī)刪除一個(gè)set中的value并返回該值 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.String * @throws */ public Object spop(String key) { if (null==key){ return null; } return redisTemplate.opsForSet().pop(key); } /** * 通過key獲取set中所有的value * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.util.Set * @throws */ public Set smembers(String key) { if (null==key){ return null; } return redisTemplate.opsForSet().members(key); } /** * 從與Key關(guān)聯(lián)的Set中刪除參數(shù)中指定的成員,不存在的參數(shù)成員將被忽略, * 如果該Key并不存在,將視為空Set處理。返回從Set中實(shí)際移除的成員數(shù)量,如果沒有則返回0。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param members * @return java.lang.Long * @throws */ public Long srem(String key, Object... members) { if (null==key){ return 0L; } return redisTemplate.opsForSet().remove(key,members); } /** * 將元素value從一個(gè)集合移到另一個(gè)集合 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param srckey ? * @param dstkey ? * @param member * @return java.lang.Long * @throws */ public Boolean smove(String srckey, String dstkey, Object member) { if (null==srckey||null==dstkey){ return false; } return redisTemplate.opsForSet().move(srckey,member,dstkey); } /** * 獲取兩個(gè)集合的并集 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param otherKeys * @return java.util.Set 返回兩個(gè)集合合并值 * @throws */ public Set sUnion(String key, String otherKeys) { if (null==key||otherKeys==null){ return null; } return redisTemplate.opsForSet().union(key, otherKeys); } //**********Sorted Set 數(shù)據(jù)類型******************** /** *添加參數(shù)中指定的所有成員及其分?jǐn)?shù)到指定key的Sorted Set中,在該命令中我們可以指定多組score/member作為參數(shù)。 * 如果在添加時(shí)參數(shù)中的某一成員已經(jīng)存在,該命令將更新此成員的分?jǐn)?shù)為新值,同時(shí)再將該成員基于新值重新排序。 * 如果鍵不存在,該命令將為該鍵創(chuàng)建一個(gè)新的Sorted Set Value,并將score/member對插入其中。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param score ? * @param member * @return java.lang.Long * @throws */ public Boolean zadd(String key, double score, Object member) { if (null==key){ return false; } return redisTemplate.opsForZSet().add(key,member,score); } /** * 該命令將移除參數(shù)中指定的成員,其中不存在的成員將被忽略。 * 如果與該Key關(guān)聯(lián)的Value不是Sorted Set,相應(yīng)的錯(cuò)誤信息將被返回。如果操作成功則返回實(shí)際被刪除的成員數(shù)量。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param members 可以使一個(gè)string 也可以是一個(gè)string數(shù)組 * @return java.lang.Long * @throws */ public Long zrem(String key, Object... members) { if(null==key||null==members){ return 0L; } return redisTemplate.opsForZSet().remove(key,members); } /** * 返回Sorted Set中的成員數(shù)量,如果該Key不存在,返回0。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key * @return java.lang.Long 迎學(xué)教育 * @throws */ public Long zcard(String key) { if (null==key){ return 0L; } return redisTemplate.opsForZSet().size(key); } /** * 該命令將為指定Key中的指定成員增加指定的分?jǐn)?shù)。如果成員不存在,該命令將添加該成員并假設(shè)其初始分?jǐn)?shù)為0, * 此后再將其分?jǐn)?shù)加上increment。如果Key不存在,該命令將創(chuàng)建該Key及其關(guān)聯(lián)的Sorted Set, * 并包含參數(shù)指定的成員,其分?jǐn)?shù)為increment參數(shù)。如果與該Key關(guān)聯(lián)的不是Sorted Set類型, * 相關(guān)的錯(cuò)誤信息將被返回。如果不報(bào)錯(cuò)則以串形式表示的新分?jǐn)?shù)。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param score ? * @param member * @return java.lang.Double * @throws */ public Double zincrby(String key, double score, Object member) { if (null==key){ throw new BusinessException(4001004,"key 不能為空"); } return redisTemplate.opsForZSet().incrementScore(key,member,score); } /** * 該命令用于獲取分?jǐn)?shù)(score)在min和max之間的成員數(shù)量。 * (min= * 同理zcount key min (max 則表明(min= * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param min ? * @param max * @return java.lang.Long * @throws */ public Long zcount(String key, double min, double max) { if (null==key){ return 0L; } return redisTemplate.opsForZSet().count(key, min, max); } /** * Sorted Set中的成員都是按照分?jǐn)?shù)從低到高的順序存儲(chǔ),該命令將返回參數(shù)中指定成員的位置值, * 其中0表示第一個(gè)成員,它是Sorted Set中分?jǐn)?shù)最低的成員。如果該成員存在,則返回它的位置索引值。否則返回nil。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param member * @return java.lang.Long * @throws */ public Long zrank(String key, Object member) { if (null==key){ return null; } return redisTemplate.opsForZSet().rank(key,member); } /** * 如果該成員存在,以字符串的形式返回其分?jǐn)?shù),否則返回null * @Author: 妖妖玖 * @UpdateUser: 迎學(xué)教育 * @Version: 0.0.1 * @param key ? * @param member * @return java.lang.Double * @throws */ public Double zscore(String key, Object member) { if (null==key){ return null; } return redisTemplate.opsForZSet().score(key,member); } /** * 該命令返回順序在參數(shù)start和stop指定范圍內(nèi)的成員,這里start和stop參數(shù)都是0-based,即0表示第一個(gè)成員,-1表示最后 一個(gè)成員。如果start大于該Sorted * Set中的最大索引值,或start > stop,此時(shí)一個(gè)空集合將被返回。如果stop大于最大索引值, * 該命令將返回從start到集合的最后一個(gè)成員。如果命令中帶有可選參數(shù)WITHSCORES選項(xiàng), * 該命令在返回的結(jié)果中將包含每個(gè)成員的分?jǐn)?shù)值,如value1,score1,value2,score2...。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param min ? * @param max * @return java.util.Set 指定區(qū)間內(nèi)的有序集成員的列表。 * @throws */ public Set zrange(String key, long min, long max) { if (null==key){ return null; } return redisTemplate.opsForZSet().range(key, min, max); } /** * 該命令的功能和ZRANGE基本相同,唯一的差別在于該命令是通過反向排序獲取指定位置的成員, * 即從高到低的順序。如果成員具有相同的分?jǐn)?shù),則按降序字典順序排序。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param start ? * @param end * @return java.util.Set * @throws */ public Set zReverseRange(String key, long start, long end) { if (null==key){ return null; } return redisTemplate.opsForZSet().reverseRange(key, start, end); } /** * 該命令將返回分?jǐn)?shù)在min和max之間的所有成員,即滿足表達(dá)式min <= score <= max的成員, * 其中返回的成員是按照其分?jǐn)?shù)從低到高的順序返回,如果成員具有相同的分?jǐn)?shù), * 則按成員的字典順序返回。可選參數(shù)LIMIT用于限制返回成員的數(shù)量范圍。 * 可選參數(shù)offset表示從符合條件的第offset個(gè)成員開始返回,同時(shí)返回count個(gè)成員。 * 可選參數(shù)WITHSCORES的含義參照ZRANGE中該選項(xiàng)的說明。*最后需要說明的是參數(shù)中min和max的規(guī)則可參照命令ZCOUNT。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param max ? * @param min * @return java.util.Set * @throws */ public Set zrangebyscore(String key, double min, double max) { if (null==key){ return null; } return redisTemplate.opsForZSet().rangeByScore(key, min, max); } /** * 該命令除了排序方式是基于從高到低的分?jǐn)?shù)排序之外,其它功能和參數(shù)含義均與ZRANGEBYSCORE相同。 * 需要注意的是該命令中的min和max參數(shù)的順序和ZRANGEBYSCORE命令是相反的。 * @Author: 妖妖玖 * @UpdateUser: * @Version: 0.0.1 * @param key ? * @param max ? * @param min * @return java.util.Set * @throws */ public Set zrevrangeByScore(String key,double min,double max) { if (null==key){ return null; } return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max); }}

          SpringBootRedisApplication .java

          package net.auio.springboot;
          import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
          @SpringBootApplicationpublic class SpringBootRedisApplication {
          public static void main(String[] args) { SpringApplication.run(SpringBootRedisApplication.class, args); }
          }



          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。

          本文鏈接:

          http://blog.csdn.net/weixin_42341298/article/details/108453504




          粉絲福利:108本java從入門到大神精選電子書領(lǐng)取

          ???

          ?長按上方鋒哥微信二維碼?2 秒
          備注「1234」即可獲取資料以及
          可以進(jìn)入java1234官方微信群



          感謝點(diǎn)贊支持下哈?

          瀏覽 35
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                    <th id="afajh"><progress id="afajh"></progress></th>
                    一本大道HEYZO乱码专区 一本大道东京热无码中文字幕 | 一区二区精品视频尤酸乳 | 久久久久亚洲AV成人无码电影 | 色婷婷精品在线播放 | 奇米影视狠狠去 |