一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術|

服務器之家 - 數(shù)據(jù)庫 - Redis - 詳解Redis基本命令與使用場景

詳解Redis基本命令與使用場景

2021-08-08 21:57Grey Zeng Redis

REmote DIctionary Server(Redis)是一個由Salvatore Sanfilippo寫的key-value 存儲系統(tǒng),是跨平臺的非關系型數(shù)據(jù)庫,是一個開源的使用ANSI C語言編寫、遵守BSD協(xié)議、支持網絡、可基于內存、分布式、可選持久性的鍵值對(Key-Value)存儲數(shù)據(jù)庫,并提

Redis和Memcached對比

其中有一個比較重要的區(qū)別是關于其提供的數(shù)據(jù)結構區(qū)別

Memcached

在其數(shù)據(jù)結構中僅使用字符串和整數(shù)。因此,您保存的所有內容都可以是字符串或整數(shù)。它很復雜,因為對于整數(shù),您可以做的唯一數(shù)據(jù)操作是添加或減去它們。如果需要保存數(shù)組或對象,則必須先將它們序列化然后保存。要閱讀它們,您需要取消序列化。

Redis

具有更強大的數(shù)據(jù)結構,它不僅可以處理字符串整數(shù),還可以處理二進制安全字符串,二進制安全字符串列表,二進制安全字符串集和有序集。

關于Redis的數(shù)據(jù)結構:https://zhuanlan.zhihu.com/p/270592490

基本命令

# 如果k1的值設置過,就不設置,如果k1的值沒有設置,才會設置k1的值為hello

# msetnx 同理

set k1 hello nx

 

# 如果k2沒設置,就不能設置k2的值為hello,如果k2的值設置過,才能把他設置過hello

set k2 hello xx

 

# 設置多個值,其中把k1設置xx,把k2設置為33

mset k1 xx k2 33

 

# 拼接字符串

APPEND k1 " world"

 

# 范圍查找(從0開始)

GETRANGE k1 0 1

 

# 范圍查找(逆序,最右邊編號從-1開始)

# 所以0,-1 就是拿到整個字符串

GETRANGE k1 0 -1

 

# 把k1字符串的第1個(從第0個位置開始)用xxx開始替換后續(xù)的字符

# 如果k1是hello,那么執(zhí)行完下面的語句,k1會被設置為:hxxxo

SETRANGE k1 1 xxx

 

# 獲取k1字符串的長度

STRLEN k1

 

# 獲取數(shù)據(jù)類型

TYPE k1

 

# 查詢某個命令的使用,如下命令,就是查詢SET命令如何使用

help SET

 

# k1的值+1

INCR k1

 

# k1的值+22

INCRBY k1 22

 

# k1的值-1

DECR k1

 

# k1的值-22

DECRBY k1 22

 

# k1的值+0.5

INCRBYFLOAT k1 0.5

 

# 可以使用--raw選項在終端上強制進行原始輸出

127.0.0.1:6379> set k3 中

OK

127.0.0.1:6379> get k3

"\xe4\xb8\xad"

127.0.0.1:6379> exit

[root@node1 utils]# redis-cli --raw

127.0.0.1:6379> get k3

 

# 獲取k1的值,然后把k1的值設置為hello

GETSET k1 hello

 

# 設置k1的值為a,如果要把k1的值變?yōu)閎,也可以通過setbit操作

# 也就是將 01100001 變成 01100010 (a的ASCII碼是97,b的ASCII碼是98),也就是將'a'中的offset 6從0變成1,將offset 7 從1變成0  (從0開始算)

set k1 a

setbit k1 6 1

setbit k1 7 0

 

# 查找字符串里面bit值為1的位置 (從左邊開始數(shù))

set k1 a

bitpos k1 1

結果為:1

 

# bitpos的 start end指的是字節(jié)位置

# 查找字符串里面bit值為1從第0個字節(jié)開始的位置

set k1 ab

BITPOS k1 1 0

1

 

# 查找字符串里面bit值為0從第1個字節(jié)開始的位置

# 其中9的ASCII碼為00111001 a的ascii碼為01100001

# 所以a9的ASCII碼為01100001 00111001

# BITPOS k1 0 1取的位置就是:01100001 ‘0'0111001 中‘'圈住的位置

set k1 a9

BITPOS k1 0 1

9

 

 

# BITPOS找不到則返回-1

# 例如:查找字符串里面bit值為1的位置

set k1 "\x00\x00\x00"

BITPOS k1 1

-1

 

# bitcount統(tǒng)計的是1的數(shù)量, bitcount key [start, end] , 其中的start和end指的是byte位置而非bit位置。

# a的ASCII碼為01100001

set k1 a

bitcount k1

3

場景1:統(tǒng)計每個用戶的登錄天數(shù)

假設jack這名用戶,分別在第6天,第23天,第134天,和第364天登錄了系統(tǒng)。

可以執(zhí)行如下命令:

setbit jack 6 1setbit jack 23 1setbit jack 134 1setbit jack 364 1

統(tǒng)計jack登錄的天數(shù),直接可以通過:

bitcount jack

場景2:電商網站派發(fā)禮物

假設某個電商網站做活動,在某天要派送禮物,假設這個網站有2億用戶,請問應該備貨多少禮物比較適合

思路:

首先,可以考慮一下統(tǒng)計整個網站的活躍用戶有多少,比如我們設置三天,1號,2號,3號,統(tǒng)計三天登錄的用戶獲得一個近似的活躍用戶的數(shù)量:

# 編號為2的用戶登在2019年1月1號錄了一次

setbit 20190101   2  1

# 編號為3的用戶在2019年1月2號登錄了一次

setbit 20190102   3  1

# 編號為7的用戶在2019年1月2號登錄了一次

setbit 20190102   7  1

# 編號為7的用戶在2019年1月3號登錄了一次

setbit 20190103   7  1

然后通過:

# 將每一天標識的人數(shù)(位置上為1)的數(shù)進行與運算

bitop  or   destkey 20190101  20190102  20190103

然后求這個destkey中含有的1的數(shù)量,即為比較活躍的用戶(派發(fā)禮物需要準備的禮物數(shù)量)

BITCOUNT destkey

搶購,秒殺,詳情頁,點贊,評論

都可以使用Redis的incr 方法,這樣就可以規(guī)避并發(fā)下,對數(shù)據(jù)庫的事務操作,完全由redis內存操作代替

更多命令

# lpush和lpop搭配可以實現(xiàn)棧的功能

# lpush和rpop搭配可以實現(xiàn)隊列的功能

# 從左邊進

lpush k1 a b c

# 從左邊彈出

lpop k1

c

 

# lrange可以從左到右列出元素

lpush k1 a b c

lrange k1

1) "c"

2) "b"

3) "a"

 

# lindex 可以定位某個元素(從左邊開始,從0開始)

lindex k1 0

"c"

 

# lset 可以設置某個位置的元素

lset k1 0 xxxxx

lrange k1 0 -1

1) "xxxxx"

2) "b"

3) "a"

 

#LREM key count value

#根據(jù)參數(shù) count 的值,移除列表中與參數(shù) value 相等的元素。

#count 的值可以是以下幾種:

#count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數(shù)量為 count 。

#count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數(shù)量為 count 的絕對值。

#count = 0 : 移除表中所有與 value 相等的值。

 

LREM k3 2 a

 

# LINSERT 

lpush k1 a b c d e f g

linsert k1 after b 6 # 也可以用before

lrange k1 0 -1

1) "g"

2) "f"

3) "e"

4) "d"

5) "c"

6) "b"

7) "6"

8) "a"# lpush和lpop搭配可以實現(xiàn)棧的功能

# lpush和rpop搭配可以實現(xiàn)隊列的功能

# 從左邊進

lpush k1 a b c

# 從左邊彈出

lpop k1

c

 

# lrange可以從左到右列出元素

lpush k1 a b c

lrange k1

1) "c"

2) "b"

3) "a"

 

# lindex 可以定位某個元素(從左邊開始,從0開始)

lindex k1 0

"c"

 

# lset 可以設置某個位置的元素

lset k1 0 xxxxx

lrange k1 0 -1

1) "xxxxx"

2) "b"

3) "a"

 

 

 

 

#當 BLPOP被調用時,如果給定 key 內至少有一個非空列表,那么彈出遇到的第一個非空列表的頭元素,并和被彈出元素所屬的列表的名字 key 一起,組成結果返回給調用者。

# BLPOP可以實現(xiàn)單播FIFO隊列

blpop x y z 0

 

# 打開另外一個redis-cli

# 然后執(zhí)行

lpush y xxxsd

 

# 可以看到blpop x y z 0

# 返回了參數(shù)

blpop x y z 0

1) "y"

2) "xxxsd"

 

# blpop 最后一個參數(shù)是超時時間,如果設置為0,則不超時

 

# trim掉第三號元素之前和第五號元素之后的元素,從左邊第0個位置開始算

 

lpush k1 a b c d e f g

(integer) 15

ltrim k1 1 3

OK

lrange k1 0 -1

1) "f"

2) "e"

3) "d"

 

# Hash

hset person name zs

(integer) 1

hset person age 18 address GZ

(integer) 2

hmget person name age address

1) "zs"

2) "18"

3) "GZ"

 

hkeys person

1) "name"

2) "age"

3) "address"

 

hvals person

1) "zs"

2) "18"

3) "GZ"

 

hgetall person

1) "name"

2) "zs"

3) "age"

4) "18"

5) "address"

6) "GZ"

 

hincrbyfloat person age 0.5

"18.5"

 

hincrbyfloat person age -1

"17.5"

 

sadd k1 a  b c a

(integer) 3

 

smembers k1

1) "b"

2) "a"

3) "c"

 

srem k1 a

(integer) 1

smembers k1

1) "b"

2) "c"

 

# 交集sinter,類似的,還有并集:sunion,差集:sdiff

# sinerstore k k1 k2 將k1和k2交集后的元素存入k

sadd k1 a b c

SMEMBERS k1

1) "a"

2) "c"

3) "b"

sadd k2 a b d

(integer) 3

SINTER k1 k2

1) "a"

2) "b"

SUNION k1 k2

1) "a"

2) "d"

3) "b"

4) "c"

SDIFF k1 k2

"c"

 

#SRANDMEMBER 命令接受可選的 count 參數(shù):

#如果 count 為正數(shù),且小于集合基數(shù),那么命令返回一個包含 count 個元素的數(shù)組,數(shù)組中的元素各不相同。如果 count 大于等于集合基數(shù),那么返回整個集合。

#如果 count 為負數(shù),那么命令返回一個數(shù)組,數(shù)組中的元素可能會重復出現(xiàn)多次,而數(shù)組的長度為 count 的絕對值。

# 可以用來抽獎

SRANDMEMBER k3 -3

1) "b"

2) "b"

3) "c"

 

#有序集

#sorted_set

#Z開頭的命令,ZADD,ZCOUNT

 

zadd fruit 8 apple 2 banana 3 orange

zrange fruit 0 -1

1) "banana"

2) "orange"

3) "apple"

zrange fruit 0 -1 withscores

1) "banana"

2) "2"

3) "orange"

4) "3"

5) "apple"

6) "8"

 

zcount fruit 3 8

(integer) 2

zscore fruit apple

"8"

 

#價格由低到高取出前兩位

zarange k1 0 1

 

#價格由高到低取出前兩位

zrevarange k1 0 1

 

zscore fruit apple

"8"

zrank fruit banana

0

 

zincrby fruit 2.5 banana

"4.5"

 

127.0.0.1:6379> zadd k1 2 a 3 b 4 c

(integer) 3

127.0.0.1:6379> zadd k2 3 a 1 b 2 c

(integer) 3

127.0.0.1:6379> ZUNIONSTORE k4 2 k1 k2

(integer) 3

127.0.0.1:6379> zrange k4 0 -1

1) "b"

2) "a"

3) "c"

127.0.0.1:6379> ZUNIONSTORE k4 2 k1 k2 aggregate sum

(integer) 3

127.0.0.1:6379> zrange k4 0 -1

1) "b"

2) "a"

3) "c"

127.0.0.1:6379> ZUNIONSTORE k4 2 k1 k2 aggregate max

(integer) 3

127.0.0.1:6379> zrange k4 0 -1

1) "a"

2) "b"

3) "c"

127.0.0.1:6379> ZUNIONSTORE k4 2 k1 k2 aggregate min

(integer) 3

127.0.0.1:6379> zrange k4 0 -1

1) "b"

2) "a"

3) "c"

通過管道連接Redis發(fā)送命令

yum install nc

[root@node01 ~]# nc localhost 6379

keys *

*0

set k1 heelo

+OK

 

 

[root@node1 utils]# echo -e "set k2 99\nincr k2\n get k2" | nc localhost 6379

+OK

:100

$3

100

發(fā)布/訂閱功能

127.0.0.1:6379> subscribe xxx

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "xxx"

3) (integer) 1

1) "message"

2) "xxx"

3) "hellod"

 

 

127.0.0.1:6379> publish xxx hellod

(integer) 1

如果需要考慮獲取實時數(shù)據(jù)和歷史數(shù)據(jù)

關于實時數(shù)據(jù)

  • pub/sub功能關于歷史消息
  • 三天前(sorted_set)
  • 更早以前(來自數(shù)據(jù)庫)

架構如下:

詳解Redis基本命令與使用場景

Redis的事務

執(zhí)行順序

詳解Redis基本命令與使用場景

示例

127.0.0.1:6379> MULTI

OK

127.0.0.1:6379(TX)> set k1 aa

QUEUED

127.0.0.1:6379(TX)> set k2 ddd

QUEUED

127.0.0.1:6379(TX)> exec

1) OK

2) OK

watch用法

127.0.0.1:6379> watch k1

OK

127.0.0.1:6379> MULTI

OK

127.0.0.1:6379(TX)> get k1

QUEUED

127.0.0.1:6379(TX)> keys *

QUEUED

127.0.0.1:6379(TX)> exec

(nil)

另外一個客戶端

127.0.0.1:6379> MULTI

OK

127.0.0.1:6379(TX)> keys *

QUEUED

127.0.0.1:6379(TX)> set k1 ddsdfasdf

QUEUED

127.0.0.1:6379(TX)> exec

1) (empty array)

2) OK

為什么 Redis 的事務不支持回滾(roll back)

摘自:http://www.redis.cn/topics/transactions.html

如果你有使用關系式數(shù)據(jù)庫的經驗, 那么 “Redis 在事務失敗時不進行回滾,而是繼續(xù)執(zhí)行余下的命令”這種做法可能會讓你覺得有點奇怪。

以下是這種做法的優(yōu)點:

Redis 命令只會因為錯誤的語法而失敗(并且這些問題不能在入隊時發(fā)現(xiàn)),或是命令用在了錯誤類型的鍵上面:這也就是說,從實用性的角度來說,失敗的命令是由編程錯誤造成的,而這些錯誤應該在開發(fā)的過程中被發(fā)現(xiàn),而不應該出現(xiàn)在生產環(huán)境中。因為不需要對回滾進行支持,所以 Redis 的內部可以保持簡單且快速。有種觀點認為 Redis 處理事務的做法會產生 bug , 然而需要注意的是, 在通常情況下, 回滾并不能解決編程錯誤帶來的問題。 舉個例子, 如果你本來想通過 INCR 命令將鍵的值加上 1 , 卻不小心加上了 2 , 又或者對錯誤類型的鍵執(zhí)行了 INCR , 回滾是沒有辦法處理這些情況的。

以上就是詳解Redis基本命令與使用場景的詳細內容,更多關于Redis基本命令與使用場景的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/greyzeng/p/8547299.html

延伸 · 閱讀

精彩推薦
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • RedisRedis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現(xiàn)讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis實現(xiàn)排行榜功能

    redis實現(xiàn)排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現(xiàn)排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數(shù)db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現(xiàn)高可用的...

    李留廣10222021-08-09
主站蜘蛛池模板: 亚洲高清国产拍精品动图 | 国产精品香蕉 | 国产伊人久久 | 花唇肿胀无法合拢双性 | 天天综合天天综合色在线 | 99视频免费 | 奇米影视亚洲狠狠色 | 亚洲AV国产福利精品在现观看 | 逼里逼里香 | 免费在线视频一区 | www.99热.com| 岛国片免费观看 | 免费欧美一级片 | 精品图区| 久草草在线视视频 | 蜜桃麻豆| 欧美精品久久久久久久免费观看 | 亚洲AV综合99一二三四区 | 天天翘 | 日韩欧美一区黑人vs日本人 | 日本免费在线播放 | 天天草视频 | 国内久久精品视频 | 无套插入 | 亚洲欧美优优色在线影院 | 加勒比久草| 黑帮大佬与我的365天2标清中文 | fuqer老师| 啾咪成人漫画免费 | 无人影院在线播放 | 波多野结衣教师未删减版 | 久久永久视频 | 数学老师扒开腿让我爽快 | 2021国产麻豆剧传媒剧情 | 亚洲 欧美 中文 日韩 视频 | 极端 成熟 性别 视频 | 九九久久国产精品免费热6 九九精品视频一区二区三区 | 日韩妹妹 | 亚洲精品乱码久久久久久蜜桃 | 无码日韩精品一区二区免费 | 成人小视频在线免费观看 |