Redis詳細使用及結(jié)合SpringBoot

<p>????今天咱來聊一下Redis五種數(shù)據(jù)類型的詳細用法以及在代碼中如何使用。廢話不多說,開始!</p><p>
</p><p>Redis五種數(shù)據(jù)類型:
</p><p>(1)string:字符串對象
</p><p>(2)list:列表對象</p><p>(3)hash:散列
</p><p>(4)set:集合</p><p>(5)zset:有序集合</p><p>
</p><p>接下來一一進行操作(命令行操作,由于很多,就不一一截圖了):
</p><p><strong>一、統(tǒng)一操作(五種數(shù)據(jù)類型都擁有,針對key)</strong></p><p>我給定一個key:k1</p><pre>//獲取所有key
keys?*
//刪除k1
DEL?k1
//檢查給定的k1是否存在
EXISTS?k1
//給k1設(shè)置1秒的過期時間,1秒過后,k1被刪除
EXPIRE?k1?1
//給k1設(shè)置過期時間為unix時間戳,也就是北京時間2019-11-29?22:22:09
EXPIREAT?k1?1575037329
//查看k1還有多長時間過期,單位為毫秒
PTTL?k1
//查看k1還有多長時間過期,單位為秒
TTL?k1
//取消k1的過期時間設(shè)置
PERSIST?k1
//修改key的名稱,將k1修改為k2
RENAME?k1?k2
//查看k1是什么數(shù)據(jù)類型的
TYPE?K1</pre><p>
</p><p><strong>二、string(字符串對象)</strong></p><pre>//設(shè)置k1的值為value1
set?k1?value1
//獲取k1的值
get?k1
//先獲取k1的值,然后再將k1的值設(shè)為k1_value?
GetSet?k1?k1_value
//同時設(shè)置多個key的值,k1的值為v1,k2的值為v2
mset?k1?v1?k2?v2
//同時獲取k1,k2的值
mget?k1?k2
//將k1的值加1
incr?k1
//將k1的值加上3
incrby?k1?3
//將k1的值減1
decr?k1
//將k1的值減3
decrby?k1?3
//在k1的值后面添加相應(yīng)的字符串
append?k1?value</pre><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-f4332a9fd975b2d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p><strong>三、list</strong><strong>(列表對象)</strong></p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-7116487abf47d2ce.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>從左到右索引為0,1,2...</p><pre>//將v1,v2,v3添加到列表k1
LPUSH?k1?v1?v2?v3
//獲取列表k1中索引為1的值,索引從0算起
LINDEX?k1?1
//獲取列表k1的元素個數(shù)
?LLEN?k1
?//移除并獲取k1的第一個元素
?LPOP?k1
?//獲取索引0~2的元素,當2改成-1,則獲取所有元素
?LRANGE?k1?0?2
?//設(shè)置索引為1的元素值為v4
?LSET?k1?1?v4
?//移除并獲取列表k1的最后一個元素
?RPOP?k1
?//在列表k1尾部添加v5和v6兩個元素
?RPUSH?k1?v5?v6</pre><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-e46dbf4f5ef0d10d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>
</p><p><strong>四、hash(散列對象)</strong>
</p><p>散列對象相當于字典(map)</p><pre>//給h_k1添加一個鍵為k1,值為v1的entry
HSET?h_k1?k1?v1
//獲取h_k1中k1的值
HGET?h_k1?k1
//刪除h_k1中的k1,可以刪除多個,key之間空格隔開
HDEL?h_k1?k1
//獲取h_k1中k1的值
HGET?h_k1?k1
//給h_k1添加<k2,v2>,<k3,v3>的entry
HMSET?h_k1?k2?v2?k3?v3
//同時獲取h_k1中k2,k3的值
HMGET?h_k1?k2?k3
//獲取h_k1中的所有鍵對值
HGETALL?h_k1
//獲取h_k1中的鍵對值數(shù)量
HLEN?h_k1
//獲取h_k1中所有的key
HKEYS?h_k1
//獲取h_k1中所有的value
HVALS?h_k1
//查看h_k1中key為k2的entry是否存在
HEXISTS?h_k1?k2</pre><p>
</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-2e945a5d426d43c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>
</p><p><strong>五、set(集合)</strong></p><p>集合中的元素是唯一的,類似于java中的set集合</p><pre>//往s_k1集合中添加v1,v2,v3,v4
SADD?s_k1?v1?v2?v3?v4
//獲取s_k1集合成員數(shù)量
SCARD?s_k
//獲取s_k1中的所有成員
SMEMBERS?s_k1
//移除并返回s_k1中隨機一個數(shù)
SPOP?s_k1
//給s_k1,s_k2做交集
SINTER?s_k1?s_k2
//給s_k1,s_k2做交集并且將結(jié)果存儲到s_k3
SINTERSTORE?s_k3?s_k1?s_k2
//給s_k1,s_k2做并集
SUNION?s_k1?s_k2
//給s_k1,s_k2做并集并且將結(jié)果存儲到s_k4
SUNIONSTORE?s_k4?s_k1?s_k2</pre><p>
</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-504bc30b26629da6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>
</p><p><strong>六、zset(有序集合)</strong></p><pre>//給z_k1添加三個元素v1、v2、v3,分值分別是1、2、3
ZADD?z_k1?1?v1?2?v2?3?v3
//獲取z_k1的元素個數(shù)
ZCARD?z_k1
//獲取分值為1~3的成員數(shù)
ZCOUNT?z_k1?1?3
//獲取索引?0~2的成員,2改成-1為獲取所有成員?
ZRANGE?z_k1?0?2
//獲取索引?0~2的成員以及其分值
ZRANGE?z_k1?0?2??withscores
//獲取分值為0~2的成員,后面也可以帶上withscores
ZRANGEBYSCORE?z_k1?0?2
//獲取v2的索引
ZRANK?z_k1?v2
//獲取z_k1中v1的分值
ZSCORE?z_k1?v1
//對z_k1和z_k2做交集,中間的2表示對兩個有序集合做交集,并將結(jié)果存在z_k3
ZINTERSTORE?z_k3?2?z_k1?z_k2
//對z_k1和z_k2做并集,中間的2表示對兩個有序集合做并集,并將結(jié)果存在z_k4
ZUNIONSTORE?z_k4?2?z_k1?z_k2</pre><p>
</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-72198ce44198bb4a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>
</p><p>
</p><p>命令行的常規(guī)操作如上,接下來看一下代碼(分為普通maven項目和 spring boot項目)如何操作。
</p><p><strong>一、普通maven項目</strong>
</p><p>(1)操作單機redis(一般使用jedis連接,需要導入jedis的jar包)</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-3ed17f7863b8ec32.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p><strong>:</strong>
</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-7df90489bda1c35e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>連接之后就可以直接用返回的jedis操作api,相應(yīng)的IDEA都會有提示,這里就不在贅述。</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-901ea3afbf923a04.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>(2)連接集群方式</p><p>連接無密碼集群:</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-2520f6fab80c5814.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>連接有密碼集群:
</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-8e4f6c95c5df4399.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>
</p><p><strong>二、springboot上操作redis</strong></p><p>首先得在pom文件中添加依賴:</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-ba4bb09a9fd93cbe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>(1)單機版
</p><p>spring-data-redis提供了一種代碼配置(需要利用@Configuration注解創(chuàng)建一個配置類)的方式可獲取RedisTemplate
</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-3b38bc523233ad7a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>配置之后就可用直接用@Autowired注解注入進行使用。
</p><p>
</p><p>
</p><p>也可通過配置文件(application.properties)配置redis信息進行連接</p><p class="image-package"><img class="uploaded-img" src="https://upload-images.jianshu.io/upload_images/5080600-5c566b587d88e06e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto"/></p><p>通過配置文件可以直接在代碼中通過注解注入的方式使用</p><pre>@Autowired
??StringRedisTemplate?stringRedisTemplate;
??//自定義初始化之后執(zhí)行的方法
??@PostConstruct
??public?void?run()?throws?Exception?{
????ValueOperations<String,?String>?stringStringValueOperations?=?redisTemplate.opsForValue();
????stringStringValueOperations.set("k1","v1");
????System.out.println(stringStringValueOperations.get("k1"));
??}</pre><p>
</p><p>
</p><p>(2)集群連接方式</p><p>配置文件</p><pre>#數(shù)據(jù)庫
spring.redis.database=0
spring.redis.password=123456

設(shè)置為0可以讓master掛機后,直接切換到slave

spring.redis.cluster.max-redirects=0
spring.redis.cluster.nodes=192.168.197.100:7001,192.168.197.110:7001,192.168.197.120:7001,192.168.197.100:7002,192.168.197.110:7002,192.168.197.120:7002
spring.redis.jedis.pool.max-wait=3600
spring.redis.jedis.pool.max-active=1
spring.redis.jedis.pool.max-idle=1
spring.redis.jedis.pool.min-idle=1</pre><p>
</p><p>配置類:</p><pre>package?com.liusy.zuul.com;
import?org.springframework.beans.factory.annotation.Value;
import?org.springframework.context.annotation.Bean;
import?org.springframework.context.annotation.Configuration;
import?org.springframework.data.redis.connection.RedisClusterConfiguration;
import?org.springframework.data.redis.connection.RedisConnectionFactory;
import?org.springframework.data.redis.connection.RedisPassword;
import?org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import?org.springframework.data.redis.core.RedisTemplate;
import?org.springframework.data.redis.serializer.StringRedisSerializer;
import?redis.clients.jedis.JedisPoolConfig;
import?java.util.ArrayList;
import?java.util.Arrays;
import?java.util.List;
@Configuration
public?class?redisConfig?{
????//獲取配置文件里的值
????@Value("{spring.redis.password}&quot;) &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;password; &nbsp;&nbsp;&nbsp;&nbsp;@Value(&quot;{spring.redis.cluster.nodes}")
????String?nodes;
????@Value("{spring.redis.cluster.max-redirects}&quot;) &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;redirects; &nbsp;&nbsp;&nbsp;&nbsp;@Value(&quot;{spring.redis.jedis.pool.max-wait}")
????String?maxWritTime;
????@Value("{spring.redis.jedis.pool.max-active}&quot;) &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;maxActive; &nbsp;&nbsp;&nbsp;&nbsp;@Value(&quot;{spring.redis.jedis.pool.max-idle}")
????String?maxIdle;
????@Value("${spring.redis.jedis.pool.min-idle}")
????String?minIdle;
????@Bean
????public?RedisTemplate?redisTemplate()?{
????????RedisTemplate?redisTemplate?=?new?RedisTemplate();
????????redisTemplate.setKeySerializer(new?StringRedisSerializer());
????????redisTemplate.setValueSerializer(new?StringRedisSerializer());
????????redisTemplate.setConnectionFactory(getConnectionFactory());
????????return?redisTemplate;
????}
????@Bean
????public?RedisConnectionFactory?getConnectionFactory()?{
????????List<String>?nodelist?=?new?ArrayList<>();
????????nodelist?=?Arrays.asList(nodes.split(","));
????????RedisClusterConfiguration?config?=?new?RedisClusterConfiguration(nodelist);
????????config.setPassword(RedisPassword.of(password));
????????config.setMaxRedirects(Integer.parseInt(redirects));
????????JedisConnectionFactory?connectionFactory??=?new?JedisConnectionFactory(config);
????????connectionFactory.afterPropertiesSet();
????????return?connectionFactory;
????}
????@Bean
????public?JedisPoolConfig?jedisPoolConfig(){
????????JedisPoolConfig?jedisPoolConfig?=?new?JedisPoolConfig();
????????jedisPoolConfig.setMaxTotal(Integer.valueOf(maxActive));
????????jedisPoolConfig.setMaxWaitMillis(Integer.valueOf(maxWritTime));
????????jedisPoolConfig.setMaxIdle(Integer.valueOf(maxIdle));
????????jedisPoolConfig.setMinIdle(Integer.valueOf(minIdle));
????????//?是否在從池中取出連接前進行檢驗,如果檢驗失敗,則從池中去除連接并嘗試取出另一個
????????jedisPoolConfig.setTestOnBorrow(true);
????????//?在空閑時檢查有效性,?默認false
????????jedisPoolConfig.setTestWhileIdle(false);
????????return?jedisPoolConfig;
????}
}</pre><p>
</p><p>springboot啟動之后直接用@Autowired注解注入RedisTemplate使用就可以了</p><p>
</p><p>以上就是redis的使用,全文比較粗糙,展開就會很長。下篇將聊一下Redis底層數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)。</p><p>
</p><p>=======================================================</p><p>我是Liusy,一個喜歡健身的程序員。</p><p>歡迎關(guān)注【Liusy01】,一起交流Java技術(shù)及健身,獲取更多干貨。</p><p>
</p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容