CentOS安裝Redis

[if !supportLists]1.1.1?[endif]安裝環(huán)境

redis是C語(yǔ)言開發(fā),安裝redis需要先將官網(wǎng)下載的源碼進(jìn)行編譯,編譯依賴gcc環(huán)境。如果沒有g(shù)cc環(huán)境,需要安裝gcc:

yum install gcc-c++

如果提示是否下載,輸入y。


如果提示是否安裝,輸入y


[if !supportLists]1.1.2?[endif]Redis安裝

[if !supportLists]l?[endif]步驟1:將Windows下下載的壓縮文件上傳到Linux下。通過(guò)secureCRT進(jìn)行上傳,步驟如下:

l alt + p

l put F:/redis-3.0.0.tar.gz

l

[if !supportLists]l?[endif]步驟2: 解壓文件

l tar –zxvf redis-3.0.0.tar.gz


[if !supportLists]l?[endif]步驟3: 編譯redis (編譯,將.c文件編譯為.o文件)

l 進(jìn)入解壓文件夾,cd redis-3.0.0

l 執(zhí)行make

1)如果沒有安裝gcc,編譯將出現(xiàn)錯(cuò)誤提示。(如果安裝失敗,必須刪除文件夾,重寫解壓)

2)安裝成功


[if !supportLists]l?[endif]步驟4: 安裝

l make PREFIX=/usr/local/src/redis install

l

安裝完后,在/usr/local/src/redis/bin下有幾個(gè)可執(zhí)行文件

redis-benchmark ----性能測(cè)試工具

redis-check-aof ----AOF文件修復(fù)工具

redis-check-dump ----RDB文件檢查工具(快照持久化文件)

redis-cli ----命令行客戶端

redis-server ----redis服務(wù)器啟動(dòng)命令


[if !supportLists]l?[endif]步驟5: copy文件

redis啟動(dòng)需要一個(gè)配置文件,可以修改端口號(hào)等信息。

cp redis.conf?/usr/local/redis



[if !supportLists]1.1?[endif]Redis的啟動(dòng)

[if !supportLists]1.1.1?[endif]前端模式啟動(dòng)

直接運(yùn)行bin/redis-server將以前端模式啟動(dòng),前端模式啟動(dòng)的缺點(diǎn)是啟動(dòng)完成后,不能再進(jìn)行其他操作,如果要操作必須使用ctrl+c,同時(shí)redis-server程序結(jié)束,不推薦使用此方法。

/usr/local/redis/bin/redis-server


使用CTRL+ C停止前端模式



[if !supportLists]1.1.2?[endif]后端模式

[if !supportLists]l?[endif]修改redis.conf配置文件, daemonize yes 以后端模式啟動(dòng)。

vim /usr/local/redis/redis.conf


[if !supportLists]l?[endif]啟動(dòng)時(shí),指定配置文件

cd /usr/local/redis/

./bin/redis-server ./redis.conf


[if !supportLists]l?[endif]Redis默認(rèn)端口6379,通過(guò)當(dāng)前服務(wù)進(jìn)行查看

ps -ef?| grep -i redis



[if !supportLists]1.2?[endif]Redis停止

[if !supportLists]l?[endif]強(qiáng)制結(jié)束程序。強(qiáng)行終止Redis進(jìn)程可能會(huì)導(dǎo)致redis持久化數(shù)據(jù)丟失。

kill -9 31475 #pid需要通過(guò)“ps aux | grep -i redis”進(jìn)行查詢

[if !supportLists]l?[endif]正確停止Redis的方式應(yīng)該是向Redis發(fā)送SHUTDOWN命令,方法為:(關(guān)閉默認(rèn)端口)

cd /usr/local/redis

./bin/redis-cli shutdown


[if !supportLists]1.3?[endif]Redis使用

[if !supportLists]1.3.1?[endif]連接客戶端

在redis的安裝目錄中有redis的客戶端,即redis-cli(Redis Command Line Interface),它是Redis自帶的基于命令行的Redis客戶端。

redis-cli -h ip地址 -p 端口


默認(rèn)ip和端口



[if !supportLists]1.3.2?[endif]向Redis服務(wù)器發(fā)送命令

redis-cli連上redis服務(wù)后,可以在命令行發(fā)送命令。

[if !supportLists]l?[endif]ping,測(cè)試客戶端與Redis的連接是否正常,如果連接正常會(huì)收到回復(fù)PONG



[if !supportLists]l?[endif]set/get,使用set和get可以向redis設(shè)置數(shù)據(jù)、獲取數(shù)據(jù)。



[if !supportLists]l?[endif]del,刪除指定key的內(nèi)容。



[if !supportLists]l?[endif]keys *,查看當(dāng)前庫(kù)中所有的key值


[if !supportLists]第2章?[endif]Jedis入門

[if !supportLists]2.1?[endif]Jedis介紹

Redis不僅是使用命令來(lái)操作,現(xiàn)在基本上主流的語(yǔ)言都有客戶端支持,比如java、C、C#、C++、php、Node.js、Go等。

在官方網(wǎng)站里列一些Java的客戶端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推薦使用Jedis和Redisson。在企業(yè)中用的最多的就是Jedis,下面我們就重點(diǎn)學(xué)習(xí)下Jedis。

Jedis同樣也是托管在github上,地址:https://github.com/xetorthio/jedis


[if !supportLists]2.2?[endif]Java連接Redis

[if !supportLists]2.2.1?[endif]導(dǎo)入jar包



[if !supportLists]2.2.2?[endif]單實(shí)例連接


@Test

public void testJedisSingle(){

//1設(shè)置ip地址和端口

Jedis jedis = new Jedis("192.168.137.128", 6379);

//2設(shè)置數(shù)據(jù)

jedis.set("name", "itheima");

//3獲得數(shù)據(jù)

String name = jedis.get("name");

System.out.println(name);

//4釋放資源

jedis.close();

}

DENIED?Redisis?running?in?protected?modebecause?protected?mode?is?enabled,?no?bind?address?was?specified,?noauthentication?password?is?requested?to?clients.???

In?this?mode?connections?areonly?accepted?from?the?loopback?interface.?If?you?want?to?connect?from?externalcomputers?to?Redis?you?may?adopt?one?of?the?following???

solutions:?1)?Justdisable?protected?mode?sending?the?command'CONFIG?SET?protected-mode?no'?fromthe?loopback?interface?by?connecting?to?Redis?from?the?same?host???

the?server?isrunning,?however?MAKE?SURE?Redisis?not?publicly?accessible?from?internet?ifyou?do?so.?Use?CONFIG?REWRITE?to?make?this?change?permanent.???

2)?Alternativelyyou?can?just?disable?the?protected?modeby?editing?the?Redis?configurationfile,?and?setting?the?protected?mode?option?to?'no',?and?then?restarting?theserver.???

3)?If?you?started?the?server?manually?justfor?testing,?restart?it?withthe?'--protected-mode?no'?option.???

4)?Setup?a?bind?addressor?an?authenticationpassword.?NOTE:?You?only?need?to?do?one?of?the?above?things?in?order?for?theserver?to?start?accepting?connections?from?the?outside.??

Connection?closed?by?foreign?host.??

客戶端無(wú)法登錄Redis服務(wù)器報(bào)錯(cuò),解除保護(hù)模式

1、修改redis服務(wù)器的配置文件??

vi?redis.conf ? ?

注釋以下綁定的主機(jī)地址??

#?bind?127.0.0.1 ?

2、修改redis服務(wù)器的參數(shù)配置 ?

修改redis的守護(hù)進(jìn)程為no?,不啟用??

127.0.0.1:6379>?configset?daemonize?"no"??

OK ?

修改redis的保護(hù)模式為no,不啟用??

127.0.0.1:6379>?configset?protected-mode?"no"??

OK

[if !supportLists]2.2.3?[endif]連接超時(shí)

[if !supportLists]l?[endif]如果運(yùn)行上面代碼時(shí),拋如下異常

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out

[if !supportLists]l?[endif]必須設(shè)置linux防火墻

vim /etc/sysconfig/iptables


service iptables restart



[if !supportLists]2.2.4?[endif]連接池連接


@Test

public void testJedisPool(){

//1獲得連接池配置對(duì)象,設(shè)置配置項(xiàng)

JedisPoolConfig config = new JedisPoolConfig();

// 1.1最大連接數(shù)

config.setMaxTotal(30);

// 1.2最大空閑連接數(shù)

config.setMaxIdle(10);

//2獲得連接池

JedisPool jedisPool = new JedisPool(config, "192.168.137.128", 6379);

//3獲得核心對(duì)象

Jedis jedis = null;

try {

jedis = jedisPool.getResource();

//4設(shè)置數(shù)據(jù)

jedis.set("name", "itcast");

//5獲得數(shù)據(jù)

String name = jedis.get("name");

System.out.println(name);

} catch (Exception e) {

e.printStackTrace();

} finally{

if(jedis != null){

jedis.close();

}

//虛擬機(jī)關(guān)閉時(shí),釋放pool資源

if(jedisPool != null){

jedisPool.close();

}

}

}




[if !supportLists]第3章?[endif]Redis的數(shù)據(jù)結(jié)構(gòu)

[if !supportLists]3.1?[endif]Redis數(shù)據(jù)結(jié)構(gòu)介紹

[if !supportLists]l?[endif]redis是一種高級(jí)的key-value的存儲(chǔ)系統(tǒng),其中value支持五種數(shù)據(jù)類型。

[if !supportLists]1、?[endif]字符串(String)

[if !supportLists]2、?[endif]哈希(hash)

[if !supportLists]3、?[endif]字符串列表(list)

[if !supportLists]4、?[endif]字符串集合(set)

[if !supportLists]5、?[endif]有序字符串集合(sorted set)

[if !supportLists]l?[endif]而關(guān)于key的定義呢,需要大家注意的幾點(diǎn):

[if !supportLists]1、?[endif]key不要太長(zhǎng),最好不要超過(guò)1024個(gè)字節(jié),這不僅會(huì)消耗內(nèi)存還會(huì)降低查找效率

[if !supportLists]2、?[endif]key不要太短,如果太短會(huì)降低key的可讀性?

[if !supportLists]3、?[endif]在項(xiàng)目中,key最好有一個(gè)統(tǒng)一的命名規(guī)范


[if !supportLists]3.2?[endif]存儲(chǔ)string

[if !supportLists]3.2.1?[endif]概述

字符串類型是Redis中最為基礎(chǔ)的數(shù)據(jù)存儲(chǔ)類型,它在Redis中是二進(jìn)制安全的,這便意味著該類型存入和獲取的數(shù)據(jù)相同。在Redis中字符串類型的Value最多可以容納的數(shù)據(jù)長(zhǎng)度是512M。


[if !supportLists]3.2.2?[endif]常用命令

[if !supportLists]3.2.2.1?[endif]賦值

[if !supportLists]l?[endif]set?key value:設(shè)定key持有指定的字符串value,如果該key存在則進(jìn)行覆蓋操作。總是返回”O(jiān)K”



[if !supportLists]3.2.2.2?[endif]取值

[if !supportLists]l?[endif]get key:獲取key的value。如果與該key關(guān)聯(lián)的value不是String類型,redis將返回錯(cuò)誤信息,因?yàn)間et命令只能用于獲取String value;如果該key不存在,返回(nil)。


[if !supportLists]l?[endif]getsetkey value:先獲取該key的值,然后在設(shè)置該key的值。



[if !supportLists]3.2.2.3?[endif]刪除

[if !supportLists]l?[endif]del key:刪除指定key



[if !supportLists]3.2.2.4?[endif]數(shù)值增減

[if !supportLists]l?[endif]incr?key:將指定的key的value原子性的遞增1.如果該key不存在,其初始值為0,在incr之后其值為1。如果value的值不能轉(zhuǎn)成整型,如hello,該操作將執(zhí)行失敗并返回相應(yīng)的錯(cuò)誤信息。


[if !supportLists]l?[endif]decr key:將指定的key的value原子性的遞減1.如果該key不存在,其初始值為0,在incr之后其值為-1。如果value的值不能轉(zhuǎn)成整型,如hello,該操作將執(zhí)行失敗并返回相應(yīng)的錯(cuò)誤信息。




[if !supportLists]3.2.3?[endif]擴(kuò)展命令(了解)

[if !supportLists]l?[endif]incrby key?increment:將指定的key的value原子性增加increment,如果該key不存在,器初始值為0,在incrby之后,該值為increment。如果該值不能轉(zhuǎn)成整型,如hello則失敗并返回錯(cuò)誤信息


[if !supportLists]l?[endif]decrby key decrement:將指定的key的value原子性減少decrement,如果該key不存在,器初始值為0,在decrby之后,該值為decrement。如果該值不能轉(zhuǎn)成整型,如hello則失敗并返回錯(cuò)誤信息


[if !supportLists]l?[endif]appendkey value:拼湊字符串。如果該key存在,則在原有的value后追加該值;如果該key不存在,則重新創(chuàng)建一個(gè)key/value




[if !supportLists]3.3?[endif]存儲(chǔ)hash

[if !supportLists]3.3.1?[endif]概述

Redis中的Hash類型可以看成具有String Key和String Value的map容器。所以該類型非常適合于存儲(chǔ)值對(duì)象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么該類型的數(shù)據(jù)也將僅占用很少的磁盤空間。每一個(gè)Hash可以存儲(chǔ)4294967295個(gè)鍵值對(duì)。

[if !supportLists]3.3.2?[endif]常用命令

[if !supportLists]3.3.2.1?[endif]賦值

[if !supportLists]l?[endif]hsetkey field value:為指定的key設(shè)定field/value對(duì)(鍵值對(duì))。



[if !supportLists]l?[endif]hmset key field value [field2 value2 …]:設(shè)置key中的多個(gè)filed/value



[if !supportLists]3.3.2.2?[endif]取值

[if !supportLists]l?[endif]hgetkey field:返回指定的key中的field的值


[if !supportLists]l?[endif]hmget key fileds:獲取key中的多個(gè)filed的值


[if !supportLists]l?[endif]hgetallkey:獲取key中的所有filed-vaule



[if !supportLists]3.3.2.3?[endif]刪除

[if !supportLists]l?[endif]hdel key field [field …]:可以刪除一個(gè)或多個(gè)字段,返回值是被刪除的字段個(gè)數(shù)



[if !supportLists]l?[endif]del key:刪除整個(gè)內(nèi)容


[if !supportLists]3.3.2.4?[endif]增加數(shù)字

[if !supportLists]l?[endif]hincrbykey field increment:設(shè)置key中filed的值增加increment,如:age增加20




[if !supportLists]3.3.3?[endif]自學(xué)命令(了解)

[if !supportLists]l?[endif]hexists key field:判斷指定的key中的filed是否存在


[if !supportLists]l?[endif]hlenkey:獲取key所包含的field的數(shù)量



[if !supportLists]l?[endif]hkeys key:獲得所有的key


[if !supportLists]l?[endif]hvals key:獲得所有的value



[if !supportLists]3.4?[endif]存儲(chǔ)list(了解)

[if !supportLists]3.4.1?[endif]概述

在Redis中,List類型是按照插入順序排序的字符串鏈表。和數(shù)據(jù)結(jié)構(gòu)中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。在插入時(shí),如果該鍵并不存在,Redis將為該鍵創(chuàng)建一個(gè)新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那么該鍵也將會(huì)被從數(shù)據(jù)庫(kù)中刪除。List中可以包含的最大元素?cái)?shù)量是4294967295。

從元素插入和刪除的效率視角來(lái)看,如果我們是在鏈表的兩頭插入或刪除元素,這將會(huì)是非常高效的操作,即使鏈表中已經(jīng)存儲(chǔ)了百萬(wàn)條記錄,該操作也可以在常量時(shí)間內(nèi)完成。然而需要說(shuō)明的是,如果元素插入或刪除操作是作用于鏈表中間,那將會(huì)是非常低效的。相信對(duì)于有良好數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)的開發(fā)者而言,這一點(diǎn)并不難理解。

[if !supportLists]1、?[endif]ArrayList使用數(shù)組方式存儲(chǔ)數(shù)據(jù),所以根據(jù)索引查詢數(shù)據(jù)速度快,而新增或者刪除元素時(shí)需要設(shè)計(jì)到位移操作,所以比較慢。

[if !supportLists]2、?[endif]LinkedList使用雙向鏈接方式存儲(chǔ)數(shù)據(jù),每個(gè)元素都記錄前后元素的指針,所以插入、刪除數(shù)據(jù)時(shí)只是更改前后元素的指針指向即可,速度非常快,然后通過(guò)下標(biāo)查詢?cè)貢r(shí)需要從頭開始索引,所以比較慢。

[if !supportLists]3、?[endif]雙向鏈表中添加數(shù)據(jù)


[if !supportLists]4、?[endif]雙向鏈表中刪除數(shù)據(jù)




[if !supportLists]3.4.2?[endif]常用命令

[if !supportLists]3.4.2.1?[endif]兩端添加

[if !supportLists]l?[endif]lpush?key values[value1 value2…]:在指定的key所關(guān)聯(lián)的list的頭部插入所有的values,如果該key不存在,該命令在插入的之前創(chuàng)建一個(gè)與該key關(guān)聯(lián)的空鏈表,之后再向該鏈表的頭部插入數(shù)據(jù)。插入成功,返回元素的個(gè)數(shù)。


[if !supportLists]l?[endif]rpush?key values[value1、value2…]:在該list的尾部添加元素。



[if !supportLists]3.4.2.2?[endif]查看列表

[if !supportLists]l?[endif]lrangekey start end:獲取鏈表中從start到end的元素的值,start、end從0開始計(jì)數(shù);也可為負(fù)數(shù),若為-1則表示鏈表尾部的元素,-2則表示倒數(shù)第二個(gè),依次類推…



[if !supportLists]3.4.2.3?[endif]兩端彈出

[if !supportLists]l?[endif]lpop key:返回并彈出指定的key關(guān)聯(lián)的鏈表中的第一個(gè)元素,即頭部元素。如果該key不存在,返回nil;若key存在,則返回鏈表的頭部元素。



[if !supportLists]l?[endif]rpopkey:從尾部彈出元素。




[if !supportLists]3.4.2.4?[endif]獲取列表中元素的個(gè)數(shù)

[if !supportLists]l?[endif]llenkey:返回指定的key關(guān)聯(lián)的鏈表中的元素的數(shù)量。




[if !supportLists]3.4.3?[endif]擴(kuò)展命令(了解)

[if !supportLists]l?[endif]lpushx?key?value:僅當(dāng)參數(shù)中指定的key存在時(shí),向關(guān)聯(lián)的list的頭部插入value。如果不存在,將不進(jìn)行插入。



[if !supportLists]l?[endif]rpushx key value:在該list的尾部添加元素



[if !supportLists]l?[endif]lremkey count value:刪除count個(gè)值為value的元素,如果count大于0,從頭向尾遍歷并刪除count個(gè)值為value的元素,如果count小于0,則從尾向頭遍歷并刪除。如果count等于0,則刪除鏈表中所有等于value的元素。

0)初始化數(shù)據(jù)

1)從頭刪除,2個(gè)數(shù)字“3”

lrem mylist3 2 3

2)從尾刪除,2個(gè)數(shù)字“1”

lrem mylist3 -2 1

3)刪除所有數(shù)字“2”

lrem mylist3 0 2

[if !supportLists]l?[endif]lsetkey index value:設(shè)置鏈表中的index的腳標(biāo)的元素值,0代表鏈表的頭元素,-1代表鏈表的尾元素。操作鏈表的腳標(biāo)不存在則拋異常。


[if !supportLists]l?[endif]linsert?key before|after pivot value:在pivot元素前或者后插入value這個(gè)元素。



[if !supportLists]l?[endif]rpoplpush resource destination:將鏈表中的尾部元素彈出并添加到頭部。[循環(huán)操作]


1)將mylist5右端彈出,壓入到mylist6左邊。


2)將mylist6右端數(shù)據(jù)彈出,壓入到左端




[if !supportLists]3.4.4?[endif]使用場(chǎng)景

rpoplpush使用場(chǎng)景

Redis鏈表經(jīng)常會(huì)被用于消息隊(duì)列的服務(wù),以完成多程序之間的消息交換。假設(shè)一個(gè)應(yīng)用程序正在執(zhí)行LPUSH操作向鏈表中添加新的元素,我們通常將這樣的程序稱之為"生產(chǎn)者(Producer)",而另外一個(gè)應(yīng)用程序正在執(zhí)行RPOP操作從鏈表中取出元素,我們稱這樣的程序?yàn)?消費(fèi)者(Consumer)"。如果此時(shí),消費(fèi)者程序在取出消息元素后立刻崩潰,由于該消息已經(jīng)被取出且沒有被正常處理,那么我們就可以認(rèn)為該消息已經(jīng)丟失,由此可能會(huì)導(dǎo)致業(yè)務(wù)數(shù)據(jù)丟失,或業(yè)務(wù)狀態(tài)的不一致等現(xiàn)象的發(fā)生。然而通過(guò)使用RPOPLPUSH命令,消費(fèi)者程序在從主消息隊(duì)列中取出消息之后再將其插入到備份隊(duì)列中,直到消費(fèi)者程序完成正常的處理邏輯后再將該消息從備份隊(duì)列中刪除。同時(shí)我們還可以提供一個(gè)守護(hù)進(jìn)程,當(dāng)發(fā)現(xiàn)備份隊(duì)列中的消息過(guò)期時(shí),可以重新將其再放回到主消息隊(duì)列中,以便其它的消費(fèi)者程序繼續(xù)處理。



[if !supportLists]3.5?[endif]存儲(chǔ)set(了解)

[if !supportLists]3.5.1?[endif]概述

在Redis中,我們可以將Set類型看作為沒有排序的字符集合,和List類型一樣,我們也可以在該類型的數(shù)據(jù)值上執(zhí)行添加、刪除或判斷某一元素是否存在等操作。需要說(shuō)明的是,這些操作的時(shí)間復(fù)雜度為O(1),即常量時(shí)間內(nèi)完成次操作。Set可包含的最大元素?cái)?shù)量是4294967295。

和List類型不同的是,Set集合中不允許出現(xiàn)重復(fù)的元素,這一點(diǎn)和C++標(biāo)準(zhǔn)庫(kù)中的set容器是完全相同的。換句話說(shuō),如果多次添加相同元素,Set中將僅保留該元素的一份拷貝。和List類型相比,Set類型在功能上還存在著一個(gè)非常重要的特性,即在服務(wù)器端完成多個(gè)Sets之間的聚合計(jì)算操作,如unions、intersections和differences。由于這些操作均在服務(wù)端完成,因此效率極高,而且也節(jié)省了大量的網(wǎng)絡(luò)IO開銷。

[if !supportLists]3.5.2?[endif]常用命令

[if !supportLists]3.5.2.1?[endif]添加/刪除元素

[if !supportLists]l?[endif]sadd key values[value1、value2…]:向set中添加數(shù)據(jù),如果該key的值已有則不會(huì)重復(fù)添加



[if !supportLists]l?[endif]srem?key members[member1、member2…]:刪除set中指定的成員




[if !supportLists]3.5.2.2?[endif]獲得集合中的元素

[if !supportLists]l?[endif]smembers key:獲取set中所有的成員



[if !supportLists]l?[endif]sismember key member:判斷參數(shù)中指定的成員是否在該set中,1表示存在,0表示不存在或者該key本身就不存在。(無(wú)論集合中有多少元素都可以極速的返回結(jié)果)



[if !supportLists]3.5.2.3?[endif]集合的差集運(yùn)算A-B

[if !supportLists]l?[endif]sdiff key1 key2…:返回key1與key2中相差的成員,而且與key的順序有關(guān)。即返回差集

(屬于A并且不屬于B的元素構(gòu)成的集合)





[if !supportLists]3.5.2.4?[endif]集合的交集運(yùn)算A∩ B

[if !supportLists]l?[endif]sinter key1 key2 key3…:返回交集

(屬于A且屬于B的元素構(gòu)成的集合)





[if !supportLists]3.5.2.5?[endif]集合的并集運(yùn)算A∪ B

[if !supportLists]l?[endif]sunion key1 key2 key3…:返回并集

(屬于A或者屬于B的元素構(gòu)成的集合)




[if !supportLists]3.5.3?[endif]擴(kuò)展命令(了解)

[if !supportLists]l?[endif]scard key:獲取set中成員的數(shù)量


[if !supportLists]l?[endif]srandmember key:隨機(jī)返回set中的一個(gè)成員


[if !supportLists]l?[endif]sdiffstore destination key1?key2…:將key1、key2相差的成員存儲(chǔ)在destination上


[if !supportLists]l?[endif]sinterstore destination key[key…]:將返回的交集存儲(chǔ)在destination上


[if !supportLists]l?[endif]sunionstore destination key[key…]:將返回的并集存儲(chǔ)在destination上



[if !supportLists]3.5.4?[endif]使用場(chǎng)景

1、可以使用Redis的Set數(shù)據(jù)類型跟蹤一些唯一性數(shù)據(jù),比如訪問(wèn)某一博客的唯一IP地址信息。對(duì)于此場(chǎng)景,我們僅需在每次訪問(wèn)該博客時(shí)將訪問(wèn)者的IP存入Redis中,Set數(shù)據(jù)類型會(huì)自動(dòng)保證IP地址的唯一性。

2、充分利用Set類型的服務(wù)端聚合操作方便、高效的特性,可以用于維護(hù)數(shù)據(jù)對(duì)象之間的關(guān)聯(lián)關(guān)系。比如所有購(gòu)買某一電子設(shè)備的客戶ID被存儲(chǔ)在一個(gè)指定的Set中,而購(gòu)買另外一種電子產(chǎn)品的客戶ID被存儲(chǔ)在另外一個(gè)Set中,如果此時(shí)我們想獲取有哪些客戶同時(shí)購(gòu)買了這兩種商品時(shí),Set的intersections命令就可以充分發(fā)揮它的方便和效率的優(yōu)勢(shì)了。

[if !supportLists]3.6?[endif]存儲(chǔ)sortedset(了解)

[if !supportLists]3.6.1?[endif]概述

Sorted-Set和Set類型極為相似,它們都是字符串的集合,都不允許重復(fù)的成員出現(xiàn)在一個(gè)Set中。它們之間的主要差別是Sorted-Set中的每一個(gè)成員都會(huì)有一個(gè)分?jǐn)?shù)(score)與之關(guān)聯(lián),Redis正是通過(guò)分?jǐn)?shù)來(lái)為集合中的成員進(jìn)行從小到大的排序。然而需要額外指出的是,盡管Sorted-Set中的成員必須是唯一的,但是分?jǐn)?shù)(score)卻是可以重復(fù)的。

在Sorted-Set中添加、刪除或更新一個(gè)成員都是非常快速的操作,其時(shí)間復(fù)雜度為集合中成員數(shù)量的對(duì)數(shù)。由于Sorted-Set中的成員在集合中的位置是有序的,因此,即便是訪問(wèn)位于集合中部的成員也仍然是非常高效的。事實(shí)上,Redis所具有的這一特征在很多其它類型的數(shù)據(jù)庫(kù)中是很難實(shí)現(xiàn)的,換句話說(shuō),在該點(diǎn)上要想達(dá)到和Redis同樣的高效,在其它數(shù)據(jù)庫(kù)中進(jìn)行建模是非常困難的。

例如:游戲排名、微博熱點(diǎn)話題等使用場(chǎng)景。

[if !supportLists]3.6.2?[endif]常用命令

[if !supportLists]3.6.2.1?[endif]添加元素

[if !supportLists]l?[endif]zadd key score member score2 member2 … :將所有成員以及該成員的分?jǐn)?shù)存放到sorted-set中。如果該元素已經(jīng)存在則會(huì)用新的分?jǐn)?shù)替換原有的分?jǐn)?shù)。返回值是新加入到集合中的元素個(gè)數(shù),不包含之前已經(jīng)存在的元素。





[if !supportLists]3.6.2.2?[endif]獲得元素

[if !supportLists]l?[endif]zscorekey member:返回指定成員的分?jǐn)?shù)



[if !supportLists]l?[endif]zcardkey:獲取集合中的成員數(shù)量



[if !supportLists]3.6.2.3?[endif]刪除元素

[if !supportLists]l?[endif]zrem key member[member…]:移除集合中指定的成員,可以指定多個(gè)成員。



[if !supportLists]3.6.2.4?[endif]范圍查詢

[if !supportLists]l?[endif]zrange key start end [withscores]:獲取集合中腳標(biāo)為start-end的成員,[withscores]參數(shù)表明返回的成員包含其分?jǐn)?shù)。




[if !supportLists]l?[endif]zrevrange key start stop [withscores]:照元素分?jǐn)?shù)從大到小的順序返回索引從start到stop之間的所有元素(包含兩端的元素)




[if !supportLists]l?[endif]zremrangebyrank?key start stop:按照排名范圍刪除元素


[if !supportLists]l?[endif]zremrangebyscore?key min max:按照分?jǐn)?shù)范圍刪除元素



[if !supportLists]3.6.3?[endif]擴(kuò)展命令(了解)

[if !supportLists]l?[endif]zrangebyscore key min max [withscores] [limit offset count]:返回分?jǐn)?shù)在[min,max]的成員并按照分?jǐn)?shù)從低到高排序。[withscores]:顯示分?jǐn)?shù);[limit offset count]:offset,表明從腳標(biāo)為offset的元素開始并返回count個(gè)成員。




[if !supportLists]l?[endif]zincrby key increment member:設(shè)置指定成員的增加的分?jǐn)?shù)。返回值是更改后的分?jǐn)?shù)。



[if !supportLists]l?[endif]zcount key min max:獲取分?jǐn)?shù)在[min,max]之間的成員




[if !supportLists]l?[endif]zrank key member:返回成員在集合中的排名。(從小到大)



[if !supportLists]l?[endif]zrevrank key member:返回成員在集合中的排名。(從大到小)






[if !supportLists]3.6.4?[endif]使用場(chǎng)景

1、可以用于一個(gè)大型在線游戲的積分排行榜。每當(dāng)玩家的分?jǐn)?shù)發(fā)生變化時(shí),可以執(zhí)行ZADD命令更新玩家的分?jǐn)?shù),此后再通過(guò)ZRANGE命令獲取積分TOPTEN的用戶信息。當(dāng)然我們也可以利用ZRANK命令通過(guò)username來(lái)獲取玩家的排行信息。最后我們將組合使用ZRANGE和ZRANK命令快速的獲取和某個(gè)玩家積分相近的其他用戶的信息。

2、Sorted-Set類型還可用于構(gòu)建索引數(shù)據(jù)。



[if !supportLists]第4章?[endif]keys的通用操作

[if !supportLists]l?[endif]keyspattern:獲取所有與pattern匹配的key,返回所有與該key匹配的keys。*表示任意一個(gè)或多個(gè)字符,?表示任意一個(gè)字符


[if !supportLists]l?[endif]del key1?key2…:刪除指定的key


[if !supportLists]l?[endif]exists key:判斷該key是否存在,1代表存在,0代表不存在


[if !supportLists]l?[endif]renamekey newkey:為當(dāng)前的key重命名


[if !supportLists]l?[endif]expire key:設(shè)置過(guò)期時(shí)間,單位:秒


[if !supportLists]l?[endif]ttlkey:獲取該key所剩的超時(shí)時(shí)間,如果沒有設(shè)置超時(shí),返回-1。如果返回-2表示超時(shí)不存在。



[if !supportLists]l?[endif]type key:獲取指定key的類型。該命令將以字符串的格式返回。 返回的字符串為string、list、set、hash和zset,如果key不存在返回none。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,011評(píng)論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,323評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,874評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,095評(píng)論 0 286
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,605評(píng)論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,551評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,720評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,961評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,330評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,690評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,862評(píng)論 0 38
  • NOSQL類型簡(jiǎn)介鍵值對(duì):會(huì)使用到一個(gè)哈希表,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,031評(píng)論 2 27
  • 何以為居? 山水云霧處,辟隅一屋 何以為樂(lè)? 窗明幾凈前,手執(zhí)一書 何以為友? 三杯兩盞間,各愛一方 何以為生? ...
    寂廖的小紅樹閱讀 345評(píng)論 0 0
  • 這些年一眨眼已快到而立之年,不能免俗地進(jìn)入上下而求索的尷尬境地。想要開創(chuàng)新的天地?似乎慢他人幾拍。想要拾回舊日榮光...
    sinsir閱讀 342評(píng)論 0 0
  • 昨天光顧著關(guān)注路上的天氣,暴雪啊,凍雨啊,結(jié)果早晨起來(lái)發(fā)現(xiàn)車打不著火了,悲劇啊! 經(jīng)分析可能是柴油掛蠟了。
    漫整掘意閱讀 161評(píng)論 0 0