日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Redis 从入门到起飞(上)

發(fā)布時(shí)間:2025/3/21 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis 从入门到起飞(上) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. Redis 介紹

1.1 NoSQL 基本概念


為了解決高并發(fā)、高可用、高可擴(kuò)展,大數(shù)據(jù)存儲(chǔ)等一系列問題而產(chǎn)生的數(shù)據(jù)庫(kù)解決方案,就是NoSql。

NoSql,叫非關(guān)系型數(shù)據(jù)庫(kù),它的全名Not only sql。它不能替代關(guān)系型數(shù)據(jù)庫(kù),只能作為關(guān)系型數(shù)據(jù)庫(kù)的一個(gè)良好補(bǔ)充。

?

1.2 NoSQL 分類


  • 鍵值(Key-Value)存儲(chǔ)數(shù)據(jù)庫(kù) 相關(guān)產(chǎn)品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB 典型應(yīng)用: 內(nèi)容緩存,主要用于處理大量數(shù)據(jù)的高訪問負(fù)載。 數(shù)據(jù)模型: 一系列鍵值對(duì) 優(yōu)勢(shì): 快速查詢 劣勢(shì): 存儲(chǔ)的數(shù)據(jù)缺少結(jié)構(gòu)化

  • 列存儲(chǔ)數(shù)據(jù)庫(kù) 相關(guān)產(chǎn)品:Cassandra, HBase, Riak 典型應(yīng)用:分布式的文件系統(tǒng) 數(shù)據(jù)模型:以列簇式存儲(chǔ),將同一列數(shù)據(jù)存在一起 優(yōu)勢(shì):查找速度快,可擴(kuò)展性強(qiáng),更容易進(jìn)行分布式擴(kuò)展 劣勢(shì):功能相對(duì)局限

  • 文檔型數(shù)據(jù)庫(kù) 相關(guān)產(chǎn)品:CouchDB、MongoDB 典型應(yīng)用:Web應(yīng)用(與Key-Value類似,Value是結(jié)構(gòu)化的) 數(shù)據(jù)模型: 一系列鍵值對(duì) 優(yōu)勢(shì):數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格 劣勢(shì): 查詢性能不高,而且缺乏統(tǒng)一的查詢語法

  • 圖形(Graph)數(shù)據(jù)庫(kù) 相關(guān)數(shù)據(jù)庫(kù):Neo4J、InfoGrid、Infinite Graph 典型應(yīng)用:社交網(wǎng)絡(luò) 數(shù)據(jù)模型:圖結(jié)構(gòu) 優(yōu)勢(shì):利用圖結(jié)構(gòu)相關(guān)算法。 劣勢(shì):需要對(duì)整個(gè)圖做計(jì)算才能得出結(jié)果,不容易做分布式的集群方案。

?

1.3 Redis 基本概念


Redis是使用c語言開發(fā)的一個(gè)高性能鍵值數(shù)據(jù)庫(kù)。Redis可以通過一些鍵值類型來存儲(chǔ)數(shù)據(jù)。 鍵值類型: String字符類型 map散列類型 list列表類型 set集合類型 sortedset有序集合類型

?

1.4 發(fā)展歷史


2008年,意大利的一家創(chuàng)業(yè)公司Merzia推出了一款基于MySQL的網(wǎng)站實(shí)時(shí)統(tǒng)計(jì)系統(tǒng)LLOOGG,然而沒過多久該公司的創(chuàng)始人 Salvatore Sanfilippo便 對(duì)MySQL的性能感到失望,于是他決定親自為L(zhǎng)LOOGG量身定做一個(gè)數(shù)據(jù)庫(kù),并于2009年開發(fā)完成,這個(gè)數(shù)據(jù)庫(kù)就是Redis。 不過Salvatore Sanfilippo并不滿足只將Redis用于LLOOGG這一款產(chǎn)品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo將Redis開源發(fā)布,并開始和Redis的另一名主要的代碼貢獻(xiàn)者Pieter Noordhuis一起繼續(xù)著Redis的開發(fā),直到今天。

Salvatore Sanfilippo自己也沒有想到,短短的幾年時(shí)間,Redis就擁有了龐大的用戶群體。Hacker News在2012年發(fā)布了一份數(shù)據(jù)庫(kù)的使用情況調(diào)查,結(jié)果顯示有近12%的公司在使用Redis。國(guó)內(nèi)如新浪微博、街旁網(wǎng)、知乎網(wǎng),國(guó)外如GitHub、Stack Overflow、Flickr等都是Redis的用戶。

VMware公司從2010年開始贊助Redis的開發(fā), Salvatore Sanfilippo和Pieter Noordhuis也分別在3月和5月加入VMware,全職開發(fā)Redis。

?

1.5 應(yīng)用場(chǎng)景


緩存(數(shù)據(jù)查詢、短連接、新聞內(nèi)容、商品內(nèi)容等等)。(最多使用) 分布式集群架構(gòu)中的session分離。 聊天室的在線好友列表。 任務(wù)隊(duì)列。(秒殺、搶購(gòu)、12306等等) 應(yīng)用排行榜。 網(wǎng)站訪問統(tǒng)計(jì)。 數(shù)據(jù)過期處理(可以精確到毫秒)

?

2. Redis 安裝

2.1 下載


官網(wǎng)地址:http://redis.io/ 下載地址:http://download.redis.io/releases/redis-3.0.0.tar.gz

?

2.2 安裝


#sftp?上傳安裝包到linux #解壓 tar?-zxvf?redis.3.0.0.tar.gz #安裝c語言環(huán)境 sudo?apt-get?install?gcc-c++ #編譯 cd?redis-3.0.0 make #安裝 make?install?PREFIX?=?/usr/local/redis #?查看 cd?/usr/local/redis ls

?

2.3 redis 啟動(dòng)


2.3.1 前端啟動(dòng)

  • 前端啟動(dòng)命令?./redis-server

  • 前端啟動(dòng)的關(guān)閉 強(qiáng)制關(guān)閉?ctrl+c?正常關(guān)閉?./redis-cli shutdown

tips:一旦客戶端關(guān)閉,則redis服務(wù)也會(huì)停掉

2.3.2 后端啟動(dòng)

  • 將 redis 源碼包中的 redis.conf 文件拷貝至 bin 目錄下?cp /root/redis-3.0.0/redis.conf

  • 修改 redis.conf 文件,將 daemonize 改為 yes?vim redis.conf

  • 使用后端命令啟動(dòng) redis?./redis-server redis.conf

  • 查看是否啟動(dòng)成功?ps -aux | grep redis

  • 關(guān)閉后端啟動(dòng)的方式 強(qiáng)制關(guān)閉:?kill -9 進(jìn)程號(hào)?正常關(guān)閉:./redis-cli shutdown

?

3. Redis 客戶端

3.1 自帶客戶端


  • 啟動(dòng)?./redis-cli -h 127.0.0.1 -p 6379?-h 指定訪問 redis 服務(wù)器的 ip 地址 -p 指定訪問的 redis 服務(wù)器的 port 端口 還可以寫成 ./redis-cli 使用默認(rèn)配置,默認(rèn)ip 127.0.0.1,默認(rèn)端口 6379

  • 關(guān)閉 ctrl + c 127.0.0.1:6379>quit

3.2 圖形界面客戶端

redis-desktop-manager 打開如下:

選擇數(shù)據(jù)庫(kù)方式: select 加上數(shù)據(jù)庫(kù)的下標(biāo),就可以選擇指定的數(shù)據(jù)庫(kù)使用,下標(biāo)從0開始。

127.0.0.1:6379>?select?15 OK 127.0.0.1:6379[15]>

?

3.3 jedis 客戶端


3.3.1 介紹

Redis不僅是使用命令來操作,現(xiàn)在基本上主流的語言都有客戶端支持,比如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

3.3.2 工程搭建

  • 添加 jar commons-pool2-2.3.jar jedis-2.7.0.jar

3.3.2.1 單例連接 redis

3.3.2.2 使用連接池連接 redis

3.3.2.3 Spring 整合 jedisPool

添加 spring 的 jar 包 配置 spring 配置文件 applicationContext.xml

<?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"?xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd?"><!--?連接池配置?--><bean?id="jedisPoolConfig"?class="redis.clients.jedis.JedisPoolConfig"><!--?最大連接數(shù)?--><property?name="maxTotal"?value="30"?/><!--?最大空閑連接數(shù)?--><property?name="maxIdle"?value="10"?/><!--?每次釋放連接的最大數(shù)目?--><property?name="numTestsPerEvictionRun"?value="1024"?/><!--?釋放連接的掃描間隔(毫秒)?--><property?name="timeBetweenEvictionRunsMillis"?value="30000"?/><!--?連接最小空閑時(shí)間?--><property?name="minEvictableIdleTimeMillis"?value="1800000"?/><!--?連接空閑多久后釋放,?當(dāng)空閑時(shí)間>該值?且?空閑連接>最大空閑連接數(shù)?時(shí)直接釋放?--><property?name="softMinEvictableIdleTimeMillis"?value="10000"?/><!--?獲取連接時(shí)的最大等待毫秒數(shù),小于零:阻塞不確定的時(shí)間,默認(rèn)-1?--><property?name="maxWaitMillis"?value="1500"?/><!--?在獲取連接的時(shí)候檢查有效性,?默認(rèn)false?--><property?name="testOnBorrow"?value="false"?/><!--?在空閑時(shí)檢查有效性,?默認(rèn)false?--><property?name="testWhileIdle"?value="true"?/><!--?連接耗盡時(shí)是否阻塞,?false報(bào)異常,ture阻塞直到超時(shí),?默認(rèn)true?--><property?name="blockWhenExhausted"?value="false"?/></bean><!--?redis單機(jī)?通過連接池?--><bean?id="jedisPool"?class="redis.clients.jedis.JedisPool"destroy-method="close"><constructor-arg?name="poolConfig"?ref="jedisPoolConfig"?/><constructor-arg?name="host"?value="192.168.242.130"?/><constructor-arg?name="port"?value="6379"?/></bean> </beans>

測(cè)試代碼

????@Testpublic?void?testJedisPool()?{JedisPool?pool?=?(JedisPool)?applicationContext.getBean("jedisPool");Jedis?jedis?=?null;try?{jedis?=?pool.getResource();jedis.set("name",?"lisi");String?name?=?jedis.get("name");System.out.println(name);}?catch?(Exception?ex)?{ex.printStackTrace();}?finally?{if?(jedis?!=?null)?{//?關(guān)閉連接jedis.close();}}}

?

4. 數(shù)據(jù)類型

4.1 String 類型


賦值 set key value

127.0.0.1:6379>?set?test?123 OK

取值 get key

127.0.0.1:6379>?get?test "123"

取值并賦值 getset key value

127.0.0.1:6379>?getset?test?321 "123" 127.0.0.1:6379>?get?test "321"

設(shè)置獲取多個(gè)鍵值 mset key value [key value…] mget key [key…]

127.0.0.1:6379>?mset?k1?v1?k2?v2?k3?v3 OK 127.0.0.1:6379>?mget?k1?k2 1)?"v1" 2)?"v2"

刪除 del key

127.0.0.1:6379>?del?test (integer)?1

數(shù)值增減

  • 遞增數(shù)字 當(dāng)存儲(chǔ)的字符串是整數(shù)時(shí),Redis提供了一個(gè)實(shí)用的命令I(lǐng)NCR,其作用是讓當(dāng)前鍵值遞增,并返回遞增后的值。 語法:incr key

    127.0.0.1:6379>?set?num?1 OK 127.0.0.1:6379>?incr?num (integer)?2 127.0.0.1:6379>?incr?num (integer)?3 127.0.0.1:6379>?incr?num (integer)?4
  • 增加指定的整數(shù) incrby key increment

    127.0.0.1:6379>?incrby?num?2 (integer)?8 127.0.0.1:6379>?incrby?num?2 (integer)?10
  • 遞減數(shù)值 decr key

    127.0.0.1:6379>?decr?num (integer)?9 127.0.0.1:6379>?decr?num (integer)?8
  • 減少指定的數(shù)值 decryby key decrement

    127.0.0.1:6379>?decrby?num?2 (integer)?6 127.0.0.1:6379>?decrby?num?2 (integer)?4

向尾部追加值 APPEND的作用是向鍵值的末尾追加value。如果鍵不存在則將該鍵的值設(shè)置為value,即相當(dāng)于 SET key value。返回值是追加后字符串的總長(zhǎng)度。 語法:append key value

127.0.0.1:6379>?set?str?hello OK 127.0.0.1:6379>?append?str?"world" (integer)?10 127.0.0.1:6379>?get?str "helloworld"

獲取字符串長(zhǎng)度 STRLEN命令返回鍵值的長(zhǎng)度,如果鍵不存在則返回0。 語法:strlen key

127.0.0.1:6379>?strlen?str (integer)?10

應(yīng)用

  • 自增主鍵 商品編號(hào)、訂單號(hào)采用 string 的遞增數(shù)字特性生成

?

4.2 Hash 散列類型


4.2.1 使用 string 的問題

假設(shè)有User對(duì)象以JSON序列化的形式存儲(chǔ)到Redis中,User對(duì)象有id,username、password、age、name等屬性,存儲(chǔ)的過程如下: 保存、更新:User對(duì)象 json(string) redis

如果在業(yè)務(wù)上只是更新age屬性,其他的屬性并不做更新我應(yīng)該怎么做呢? 如果仍然采用上邊的方法在傳輸、處理時(shí)會(huì)造成資源浪費(fèi),下邊講的hash可以很好的解決這個(gè)問題。

4.2.2 介紹

hash叫散列類型,它提供了字段和字段值的映射。字段值只能是字符串類型,不支持散列類型、集合類型等其它類型。如下:

?

4.2.3 命令

賦值 HSET命令不區(qū)分插入和更新操作,當(dāng)執(zhí)行插入操作時(shí)HSET命令返回1,當(dāng)執(zhí)行更新操作時(shí)返回0。

  • 一次只設(shè)置一個(gè)字段值 語法:hset key field value

    127.0.0.1:6379>?hset?user?username?zhangsan (integer)?1
  • 一次設(shè)置多個(gè)字段值 語法:hmset key field value [field value…]

    127.0.0.1:6379>?hmset?user?age?20?username?lisi OK
  • 當(dāng)字段不存在時(shí)賦值,類似hset,區(qū)別在于如果字段存在,該命令不執(zhí)行任何操作。 語法:hsetnx key field value

    127.0.0.1:6379>?hsetnx?user?age?30 (integer)?0

取值

  • 一次獲取一個(gè)字段值 語法:hget key field

    127.0.0.1:6379>?hget?user?username "lisi"
  • 一次可以獲取多個(gè)字段值 語法:hmget key field [field…]

    127.0.0.1:6379>?hmget?user?age?username 1)?"20" 2)?"lisi"
  • 獲取所有字段值 語法:hgetall key

    127.0.0.1:6379>?hgetall?user 1)?"username" 2)?"lisi" 3)?"age" 4)?"20"

刪除字段 可以刪除一個(gè)或多個(gè)字段,返回值是被刪除的字段的個(gè)數(shù)。 語法:hdel key field [field…]

127.0.0.1:6379>?hdel?user?age (integer)?1 127.0.0.1:6379>?hdel?user?age?username (integer)?1

增加數(shù)字 語法:hincrby key field increment

127.0.0.1:6379>?hincrby?user?age?2 (integer)?2

判斷字段是否存在 語法:hexists key field

127.0.0.1:6379>?hexists?user?age (integer)?1

只獲取字段名或字段值 語法: hkeys key hvals key

127.0.0.1:6379>?hkeys?user 1)?"age"

獲取字段數(shù)量 語法:hlen key

127.0.0.1:6379>?hlen?user (integer)?1

應(yīng)用 存儲(chǔ)商品信息

127.0.0.1:6379>?hlen?user (integer)?1

獲取商品信息

127.0.0.1:6379>?hgetall?items:1001 1)?"id" 2)?"3" 3)?"name" 4)?"apple" 5)?"price" 6)?"5.00"

?

4.3 List 類型


4.3.1 ArrayList 和 LinkedList 的區(qū)別

Arraylist是使用數(shù)組來存儲(chǔ)數(shù)據(jù),特點(diǎn):查詢快、增刪慢

Linkedlist是使用雙向鏈表存儲(chǔ)數(shù)據(jù),特點(diǎn):增刪快、查詢慢,但是查詢鏈表兩端的數(shù)據(jù)也很快。

Redis的list是采用來鏈表來存儲(chǔ)的,所以對(duì)于redis的list數(shù)據(jù)類型的操作,是操作list的兩端數(shù)據(jù)來操作的。

4.3.2 命令

向列表兩端增加元素

  • 向列表左邊增加元素 語法:lpush key value [value…]

127.0.0.1:6379>?lpush?list:1?1?2?3 (integer)?3
  • 向列表右邊增加元素 語法:rpush key value [value…]

127.0.0.1:6379>?rpush?list:1?4?5?6 (integer)?6

查看列表 LRANGE命令是列表類型最常用的命令之一,獲取列表中的某一片段,將返回start、stop之間的所有元素(包含兩端的元素),索引從0開始。索引可以是負(fù)數(shù),如:“-1”代表最后邊的一個(gè)元素。

語法:lrange key start stop

127.0.0.1:6379>?lrange?list:1?0?2 1)?"3" 2)?"2" 3)?"1" 127.0.0.1:6379>?lrange?list:1?0?-1 1)?"3" 2)?"2" 3)?"1" 4)?"4" 5)?"5" 6)?"6"

從列表兩端彈出元素 LPOP命令從列表左邊彈出一個(gè)元素,會(huì)分兩步完成:

  • 第一步是將列表左邊的元素從列表中移除

  • 第二步是返回被移除的元素值。 語法: lpop key rpop key

    127.0.0.1:6379>?lpop?list:1 "3" 127.0.0.1:6379>?rpop?list:1 "6"

獲取列表中元素的個(gè)數(shù) 語法:llen key

127.0.0.1:6379>?llen?list:1 (integer)?4

刪除列表中指定的值 LREM命令會(huì)刪除列表中前count個(gè)值為value的元素,返回實(shí)際刪除的元素個(gè)數(shù)。根據(jù)count值的不同,該命令的執(zhí)行方式會(huì)有所不同:

  • 當(dāng)count>0時(shí), LREM會(huì)從列表左邊開始刪除。

  • 當(dāng)count<0時(shí), LREM會(huì)從列表后邊開始刪除。

  • 當(dāng)count=0時(shí), LREM刪除所有值為value的元素。

語法:lrem key count value

獲得/設(shè)置指定索引的元素值

  • 獲得指定索引的元素值 語法:lindex key index

    127.0.0.1:6379>?lindex?list:1?2 "4"
  • 設(shè)置指定索引的元素值 語法:lset key index value

    127.0.0.1:6379>?lset?list:1?2?2 OK

只保留列表指定片段 指定范圍和 lrange 一致 語法:ltrim key start stop

127.0.0.1:6379>?lrange?list:1?0?-1 1)?"2" 2)?"1" 3)?"2" 4)?"5" 127.0.0.1:6379>?ltrim?list:1?0?2 OK 127.0.0.1:6379>?lrange?list:1?0?-1 1)?"2" 2)?"1" 3)?"2"

向列表中插入元素 該命令首先會(huì)在列表中從左到右查找值為pivot的元素,然后根據(jù)第二個(gè)參數(shù)是BEFORE還是AFTER來決定將value插入到該元素的前面還是后面。 語法:linsert key before | after pivot value

127.0.0.1:6379>?lrange?list:1?0?-1 1)?"2" 2)?"1" 3)?"2" 127.0.0.1:6379>?linsert?list:1?after?1?9 (integer)?4 127.0.0.1:6379>?lrange?list:1?0?-1 1)?"2" 2)?"1" 3)?"9" 4)?"2"

將元素從一個(gè)列表轉(zhuǎn)移到另一個(gè)列表 語法:rpoplpush source destination

127.0.0.1:6379>?lrange?list:1?0?-1 1)?"2" 2)?"1" 3)?"9" 4)?"2" 127.0.0.1:6379>?rpoplpush?list:1?newlist "2" 127.0.0.1:6379>?lrange?newlist?0?-1 1)?"2" 127.0.0.1:6379>?lrange?list:1?0?-1 1)?"2" 2)?"1" 3)?"9"

應(yīng)用 在Redis中創(chuàng)建商品評(píng)論列表 用戶發(fā)布商品評(píng)論,將評(píng)論信息轉(zhuǎn)成json存儲(chǔ)到list中。 用戶在頁面查詢?cè)u(píng)論列表,從redis中取出json數(shù)據(jù)展示到頁面。

定義商品評(píng)論列表key: 商品編號(hào)為1001的商品評(píng)論key【items: comment:1001】

?

4.4 Set 類型


集合類型:無序、不可重復(fù) 列表類型:有序、可重復(fù)

4.4.1 命令

增加/刪除元素 語法:sadd key member [member…]

127.0.0.1:6379>?sadd?set?a?b?c (integer)?3 127.0.0.1:6379>?sadd?set?a (integer)?0

語法:srem key member [member…]

127.0.0.1:6379>?srem?set?c (integer)?1

獲得集合中的所有元素 語法:smembers key

127.0.0.1:6379>?smembers?set 1)?"b" 2)?"a"

判斷元素是否在集合中 語法:sismember key member

127.0.0.1:6379>?sismember?set?a (integer)?1 127.0.0.1:6379>?sismember?set?h (integer)?0

4.4.2 運(yùn)算命令

集合的差集運(yùn)算 A-B 屬于 A 并且 不屬于 B 的元素構(gòu)成的集合

?

語法:sdiff key [key…]

127.0.0.1:6379>?sadd?setA?1?2?3 (integer)?3 127.0.0.1:6379>?sadd?setB?2?3?4 (integer)?3 127.0.0.1:6379>?sdiff?setA?setB 1)?"1" 127.0.0.1:6379>?sdiff?setB?setA 1)?"4"

?

集合的交集運(yùn)算 屬于A且屬于B的元素構(gòu)成的集合

?

語法:sinter key [key…]

127.0.0.1:6379>?sinter?setA?setB 1)?"2" 2)?"3"

集合的并集運(yùn)算 屬于 A 或者 屬于 B 的元素構(gòu)成的集合

?

語法:sunion key [key…]

127.0.0.1:6379>?sunion?setA?setB 1)?"1" 2)?"2" 3)?"3" 4)?"4"

獲得集合中元素的個(gè)數(shù) 語法:scard key

127.0.0.1:6379>?smembers?setA 1)?"1" 2)?"2" 3)?"3" 127.0.0.1:6379>?scard?setA (integer)?3

從集合中彈出一個(gè)元素 注意:由于集合是無序的,所有spop命令會(huì)從集合中隨機(jī)選擇一個(gè)元素彈出。 語法:spop key

127.0.0.1:6379>?spop?setA "2"

?

4.5 Sortedset 類型


Sortedset 又叫 zset Sortedset 是有序集合,可排序的,但是唯一。 Sortedset 和 set 的不同之處,會(huì)給 set 中元素添加一個(gè)分?jǐn)?shù),然后通過這個(gè)分?jǐn)?shù)進(jìn)行排序。

4.5.1 命令

4.5.1.1 增加元素

向有序集合中加入一個(gè)元素和該元素的分?jǐn)?shù),如果該元素已經(jīng)存在則會(huì)用新的分?jǐn)?shù)替換原有的分?jǐn)?shù)。返回值是新加入到集合中的元素個(gè)數(shù),不包含之前已經(jīng)存在的元素。 語法:zadd key score member [score member…]

127.0.0.1:6379>?zadd?scoreboard?80?zhangsan?89?lisi?94?wangwu (integer)?3 127.0.0.1:6379>?zadd?scoreboard?97?lisi (integer)?0

4.5.1.2 獲取元素分?jǐn)?shù)

語法:zscore key member

127.0.0.1:6379>?zscore?scoreboard?lisi "97"

4.5.1.3 刪除元素

移除有序集key中的一個(gè)或多個(gè)成員,不存在的成員將被忽略。 當(dāng)key存在但不是有序集類型時(shí),返回一個(gè)錯(cuò)誤。

語法:zrem key member [member…]

127.0.0.1:6379>?zrem?scoreboard?lisi (integer)?1

4.5.1.4 獲得排名在某個(gè)范圍的元素列表

獲得排名在某個(gè)范圍的元素列表

  • 按照元素分?jǐn)?shù)從小到大的順序返回索引從start到stop之間的所有元素(包含兩端的元素) 語法:zrange key start stop [withscores]

    127.0.0.1:6379>?zrange?scoreboard?0?2 1)?"zhangsan" 2)?"wangwu"
  • 按照元素分?jǐn)?shù)從大到小的順序返回索引從start到stop之間的所有元素(包含兩端的元素) 語法:zrevrange key start stop [withscores]

    127.0.0.1:6379>?zrevrange?scoreboard?0?2 1)?"wangwu" 2)?"zhangsan"

    如果需要獲得元素的分?jǐn)?shù)可以在命令末尾加上 withscores 參數(shù) ··· 127.0.0.1:6379> zrevrange scoreboard 0 2 withscores

  • "wangwu"

  • "94"

  • "zhangsan"

  • "80" ···

  • 4.5.1.5 獲取元素的排名

    • 從小到大 語法:zrank key member

    127.0.0.1:6379>?zrank?scoreboard?zhangsan (integer)?0
    • 從大到小 語法:zrevrank key member

    127.0.0.1:6379>?zrevrank?scoreboard?zhangsan (integer)?1

    4.5.1.6 獲得指定分?jǐn)?shù)范圍的元素

    語法:zrangebyscore key min max [withscores][limit offset count]

    127.0.0.1:6379>?ZRANGEBYSCORE?scoreboard?90?97?WITHSCORES 1)?"wangwu" 2)?"94" 3)?"lisi" 4)?"97" 127.0.0.1:6379>?ZRANGEBYSCORE?scoreboard?70?100?limit?1?2 1)?"wangwu" 2)?"lisi"

    4.5.1.7 增加某個(gè)元素的分?jǐn)?shù)

    返回值是更改后的分?jǐn)?shù) 語法:zincrby key increment member

    127.0.0.1:6379>?ZINCRBY?scoreboard?4?lisi "101“

    4.5.1.8 獲得集合中元素的數(shù)量

    語法:zcard key

    127.0.0.1:6379>?zcard?scoreboard (integer)?3

    4.5.1.9 獲得指定分?jǐn)?shù)范圍內(nèi)的元素個(gè)數(shù)

    語法:zcount key min max

    127.0.0.1:6379>?zcount?scoreboard?80?90 (integer)?1

    4.5.1.10 按照排名范圍刪除元素

    語法:zremrangebyrank key start stop

    127.0.0.1:6379>?zremrangebyrank?scoreboard?0?1 (integer)?2 127.0.0.1:6379>?zrange?scoreboard?0?-1 1)?"wangwu"

    4.5.1.11 按照分?jǐn)?shù)范圍刪除元素

    語法:zremrangebyscore key min max

    127.0.0.1:6379>?zadd?scoreboard?84?zhangsan (integer)?1 127.0.0.1:6379>?ZREMRANGEBYSCORE?scoreboard?80?100 (integer)?1

    4.5.1.12 應(yīng)用

    4.5.1.13 商品銷售排行榜

    需求:根據(jù)商品銷售量對(duì)商品進(jìn)行排行顯示 思路:定義商品銷售排行榜(sorted set集合),Key為items:sellsort,分?jǐn)?shù)為商品銷售量。

    寫入商品銷售量:

    • 商品編號(hào)1001的銷量是9,商品編號(hào)1002的銷量是10 192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002

    • 商品編號(hào)1001的銷量加1 192.168.101.3:7001> ZINCRBY items:sellsort 1 1001

    • 商品銷量前10名: 192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores

    總結(jié)

    以上是生活随笔為你收集整理的Redis 从入门到起飞(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。