redis拾遺(一)——基本的數據類型

準備

安裝

Linux環境下的redis安裝,可以參考這篇博客,其中對相關配置也有提及,傳送門:redis linux 安裝

命令別名配置

爲了啓動方便,需要配置別名的命令,否則每次都指定啓動命令,啓動的配置文件,是個很繁瑣的工作,這裏需要設置命令的別名,這裏爲了使得每一次系統啓動別名都能生效,就採用修改配置文件的方式來定義別名

1、修改.bashrc文件,加入如下命令

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
##指定到redis的bin目錄
alias redis-bin='cd /usr/local/software/redis-5.0.0/bin'
##執行指定的redis-server啓動腳本,指定配置文件
alias redis-server='./redis-server /usr/local/software/redis-5.0.0/conf/redis.conf'
##執行redis-cli客戶端
alias redis-cli='./redis-cli'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

2、配置之後的結果如下所示

##通過這個命令直接定位到了redis的目錄
[root@localhost /]# redis-bin
## 直接後臺啓動redis-server
[root@localhost bin]# redis-server 
4265:C 27 Jun 2020 10:08:15.829 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4265:C 27 Jun 2020 10:08:15.829 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=4265, just started
4265:C 27 Jun 2020 10:08:15.829 # Configuration loaded
##直接啓動了redis的客戶端
[root@localhost bin]# redis-cli 
127.0.0.1:6379>

幾種數據類型

如果被問到redis的數據類型有幾種,有些程序員可能只會回答5種,但是其實在某一個版本之後,redis的類型已經不止5種了,官網中關於redis的數據類型其實介紹有如下幾種

string,Hash,Set,List,Zset,Hyperloglog,Geo,Streams。其中前5中是基本的數據類型,後三種算是redis的高級數據類型。

string

存儲的類型

String可以用來存儲字符串,整數,浮點數。同時也可以單個和批量的操作

簡單命令實例

單個

127.0.0.1:6379> set name coderMan
OK
127.0.0.1:6379> get name
"coderMan"
##判斷是否存在
127.0.0.1:6379> exists coderMan
(integer) 0 ##0表示不存在
127.0.0.1:6379> exists name
(integer) 1 ##1表示存在
127.0.0.1:6379> get name
"coderMan"
127.0.0.1:6379> del name
(integer) 1

批量

127.0.0.1:6379> set name1 codehole
OK
127.0.0.1:6379> set name2 holycoder
OK
## 批量獲取
127.0.0.1:6379> mget name1 name2
1) "codehole"
2) "holycoder"
## 批量設置
127.0.0.1:6379> mset name1 boy name2  girl name3 unknown
OK
127.0.0.1:6379> mget name1 name2 name3
1) "boy"
2) "girl"
3) "unknown"
##批量刪除
127.0.0.1:6379> del name1 name2 name3
(integer) 3

過期

127.0.0.1:6379> set name coderMan
OK
127.0.0.1:6379> expire name 6
(integer) 1
127.0.0.1:6379> get name
"coderMan"
127.0.0.1:6379> get name #5s之後
(nil)
## 基於此可實現分佈式鎖。關於分佈式鎖後續我們再總結
127.0.0.1:6379> setnx name coderMan
(integer) 1
127.0.0.1:6379> setnx name TestExist
(integer) 0
127.0.0.1:6379> get name
"coderMan" #沒有變化

計數

127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> incr age
(integer) 11
127.0.0.1:6379> incrby age 7
(integer) 18
127.0.0.1:6379> incrby age -6
(integer) 12

應用場景

分佈式鎖,全局id,計數器,限流,位統計(bitmap)

list

存儲類型

存儲有序的字符串,元素可以重複,可以作爲隊列也可以作爲棧。

簡單命令實例

右進左出

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> llen books
(integer) 3
127.0.0.1:6379> lpop books
"python"
127.0.0.1:6379> lpop books
"java"
127.0.0.1:6379> lpop books
"golang"
127.0.0.1:6379> lpop books
(nil)

右進右出

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> rpop books
"golang"
127.0.0.1:6379> rpop books
"java"
127.0.0.1:6379> rpop books
"python"
127.0.0.1:6379> rpop books
(nil)

簡單的截取操作

127.0.0.1:6379> rpush books python java golang
(integer) 3
## 相當於java鏈表中的get(int index)方法,底層會遍歷list,找到指定的元素
127.0.0.1:6379> lindex books 1
"java"
## lrange有兩個參數,一個表示開始位置,一個表示結束位置,lrange key 0 -1 表示獲取所有列表中的元素
127.0.0.1:6379> lrange books 0 -1
1) "python"
2) "java"
3) "golang"
## ltrim也有兩個參數,一個表示開始位置,一個表示結束位置,ltrim key start end ,表示從start到end的元素全部保留,其餘全部丟棄。
127.0.0.1:6379> ltrim books 1 -1
OK
127.0.0.1:6379> ltrim books 0 1
OK
127.0.0.1:6379> lrange books 0 -1
1) "java"
2) "golang"
127.0.0.1:6379> ltrim books 1 0
OK
127.0.0.1:6379> lrange books 0 -1
(empty list or set)

應用場景

消息隊列,用戶操作時間線,調用鏈路等。

hash

hash的數據結構可以用如下圖表示,與數據結構知識中的hash表差別不大,只是在redis中需要一個key值去標識這個map。

在這裏插入圖片描述

存儲類型

包含鍵值對的無序散列表。value只能是字符串,不能嵌套其他類型。

簡單命令實例

127.0.0.1:6379> hset books java "think in java"
(integer) 1
127.0.0.1:6379> hset books golang "concurrency in go"
(integer) 1
127.0.0.1:6379> hset books python "python cookbook"
(integer) 1
127.0.0.1:6379> hgetall books
1) "java"
2) "think in java"
3) "golang"
4) "concurrency in go"
5) "python"
6) "python cookbook"
127.0.0.1:6379> hlen books
(integer) 3
127.0.0.1:6379> hget books java
"think in java"
127.0.0.1:6379> hset books golang "learning go programming"
(integer) 0
127.0.0.1:6379> hget books golang
"learning go programming"
## 批量設置
127.0.0.1:6379> hmset books java "effective java" python "learning python" golang "modern golang progarmming"
OK

應用場景

string能做的事情,hash都能做。

set

存儲類型

存儲string類型的無序集合。

簡單操作命令

## 往set中增加元素
127.0.0.1:6379> sadd books java
(integer) 1
127.0.0.1:6379> sadd books java
(integer) 0
127.0.0.1:6379> sadd books java golang
(integer) 1
## 列出set中所有的元素
127.0.0.1:6379> smembers books
1) "java"
2) "golang"
## 判斷是否是其中的元素
127.0.0.1:6379> sismember books java
(integer) 1
127.0.0.1:6379> sismember books rust
(integer) 0
## 計算元素個數
127.0.0.1:6379> scard books
(integer) 2
## 隨機彈出一個元素
127.0.0.1:6379> spop books
"golang"

應用場景

抽獎,簽到打開,點贊,商品標籤等。

zset

存儲類型

有序的一個set,每個元素有一個score,可以根據score進行排序

在這裏插入圖片描述

簡單命令實例

## 增加各種元素
127.0.0.1:6379> zadd books 9.0 "think in java"
(integer) 1
127.0.0.1:6379> zadd books 8.9 "java concurrency"
(integer) 1
127.0.0.1:6379> zadd books 8.6 "java cookbook"
(integer) 1
## 按照score排序輸出,參數區間爲排名範圍
127.0.0.1:6379> zrange books 0 -1
1) "java cookbook"
2) "java concurrency"
3) "think in java"
127.0.0.1:6379> zrevrange books 0 -1
1) "think in java"
2) "java concurrency"
3) "java cookbook"
## 計算zset中的元素個數
127.0.0.1:6379> zcard books
(integer) 3
## 獲取指定key的value
127.0.0.1:6379> zscore books "think in java"
"9"
## 根據分值區間遍歷zset
127.0.0.1:6379> zrangebyscore books 0 8.91
1) "java cookbook"
2) "java concurrency"
## 根據(-∞,8.91]分數區間進行遍歷
127.0.0.1:6379> zrangebyscore books -inf 8.91 withscores
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"
## 刪除
127.0.0.1:6379> zrem books "java concurrency"
(integer) 1
127.0.0.1:6379> zrange books 0 -1
1) "java cookbook"
2) "think in java"

應用場景

排行榜

總結

簡單總結了一下redis的基本數據結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章