12. Redis 數(shù)據(jù)類型和常用命令

6. Redis數(shù)據(jù)類型

命令不區(qū)分大小寫, key和value區(qū)分大小寫

6.1 字符串(string)

6.1.1 創(chuàng)建一個(gè)key

127.0.0.1:6379> set code 'hello world'
OK
127.0.0.1:6379> get code
"hello world"
127.0.0.1:6379> type code # type用來(lái)查看數(shù)據(jù)類型
string
# 命令不區(qū)分大小寫, 數(shù)據(jù)區(qū)分大小寫

127.0.0.1:6379> SET NAME dave
OK
127.0.0.1:6379> get NAME
"dave"
127.0.0.1:6379> get name
(nil)
# ex 用來(lái)指定有效期, 以秒為單位

127.0.0.1:6379> set name aaa ex 5 
OK
127.0.0.1:6379> get name
"aaa"
127.0.0.1:6379> get name # 5秒后過(guò)期
(nil)
# nx: 當(dāng)key不存在時(shí), 才對(duì)其進(jìn)行賦值

127.0.0.1:6379> get NAME
"dave"
127.0.0.1:6379> set NAME bbb nx  # NAME已經(jīng)存在, 因此不會(huì)重新賦值
(nil)
127.0.0.1:6379> get NAME
"dave"
# xx: 當(dāng)key存在時(shí), 才對(duì)其進(jìn)行賦值

127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name ccc xx  # name不存在, 因此不會(huì)賦值
(nil)
127.0.0.1:6379> set NAME ccc xx
OK
127.0.0.1:6379> get NAME
"ccc"

6.1.2 獲取一個(gè)key

127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get NAME
"ccc"
# mget: 同時(shí)獲取多個(gè)key

127.0.0.1:6379> mget name NAME
1) (nil)
2) "ccc"
# keys配合通配符, 獲取指定模式的key, 但是不會(huì)顯示其值

127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> keys k*
1) "key1"
2) "key2"
# keys *: 獲取所有的key

1) "key1"
2) "code"
3) "NAME"
4) "key2"

6.1.3 刪除key

127.0.0.1:6379> del key1  # 刪除單個(gè)key
(integer) 1
127.0.0.1:6379> del key2 code # 刪除多個(gè)key
(integer) 2
127.0.0.1:6379> keys *
1) "NAME"

6.1.4 批量創(chuàng)建多個(gè)key

# mset: 奇數(shù)位為key, 偶數(shù)位為值

127.0.0.1:6379> mset 1 2 3 4 5 6 
OK
127.0.0.1:6379> mget 1 3 5
1) "2"
2) "4"
3) "6"

6.1.5 追加數(shù)據(jù)

# append: 結(jié)果仍是字符串

127.0.0.1:6379> append city "sh gz sz" 
(integer) 10
127.0.0.1:6379> get city
"bjsh gz sz"
127.0.0.1:6379> set country cn
OK
127.0.0.1:6379> append country " usa au jp"  # 追加時(shí), 左側(cè)要有一個(gè)空格, 避免追加后和原有的字符串連在一起
(integer) 12
127.0.0.1:6379> get country
"cn usa au jp"

6.1.6 設(shè)置新值并同時(shí)返回舊值

127.0.0.1:6379> get NAME
"ccc"
127.0.0.1:6379> getset NAME ddd
"ccc"
127.0.0.1:6379> get NAME
"ddd"

6.1.7 查看字符串key對(duì)應(yīng)值所占的字節(jié)數(shù)

127.0.0.1:6379> get NAME
"ddd"
127.0.0.1:6379> strlen NAME
(integer) 3

6.1.8 判斷key是否存在

127.0.0.1:6379> exists NAME
(integer) 1  # 1表示存在
127.0.0.1:6379> del NAME
(integer) 1
127.0.0.1:6379> exists NAME
(integer) 0 # 0表示不存在

6.1.9 查看key的過(guò)期時(shí)間

# ttl: -1 表示永不過(guò)期, -2 表示已經(jīng)過(guò)期或者key不存在, 1,2,3..表示剩余有效時(shí)間, 以秒為單位

127.0.0.1:6379> ttl city 
(integer) -1

6.1.10 重新設(shè)置key的過(guò)期時(shí)間

# expire

127.0.0.1:6379> set location la ex 10
OK
127.0.0.1:6379> expire location 20
(integer) 1
127.0.0.1:6379> ttl location
(integer) 16
127.0.0.1:6379> ttl location
(integer) 15
127.0.0.1:6379> ttl location
(integer) 14
127.0.0.1:6379> ttl location
(integer) 13

6.1.11 取消key的有效期

# persist

127.0.0.1:6379> set  location la ex 20
OK
127.0.0.1:6379> ttl location
(integer) 16
127.0.0.1:6379> persist location
(integer) 1
127.0.0.1:6379> ttl location
(integer) -1

6.1.12 數(shù)值遞增

  • 比如點(diǎn)贊功能
redis實(shí)現(xiàn)自增, 比如點(diǎn)贊功能, 由于redis是單線程處理請(qǐng)求, 因此自增的時(shí)候不會(huì)沖突, 是串行執(zhí)行
# incr

127.0.0.1:6379> set id 1 
OK
127.0.0.1:6379> incr id
(integer) 2
127.0.0.1:6379> incr id
(integer) 3
127.0.0.1:6379> incr id
(integer) 4
127.0.0.1:6379> get id
"4"
# 當(dāng)key不存在, 那么incr會(huì)從0開(kāi)始自增, 每次加1

127.0.0.1:6379> get number
(nil)
127.0.0.1:6379> incr number
(integer) 1
127.0.0.1:6379> get number
"1"

6.1.13 數(shù)值遞減

  • 比如用在取消點(diǎn)贊功能
# decr

127.0.0.1:6379> get id
"4"
127.0.0.1:6379> decr id
(integer) 3
127.0.0.1:6379> decr id
(integer) 2
127.0.0.1:6379> decr id
(integer) 1
127.0.0.1:6379> decr id
(integer) 0
127.0.0.1:6379> decr id
(integer) -1 # 可以遞減成負(fù)數(shù)
127.0.0.1:6379> decr id
(integer) -2
# 如果key不存在, decr會(huì)從0開(kāi)始自減, 每次減1

127.0.0.1:6379> get number
"1"
127.0.0.1:6379> get num
(nil)
127.0.0.1:6379> decr num
(integer) -1

6.1.14 數(shù)值增加

# incrby NUM

127.0.0.1:6379> get num
(nil)
127.0.0.1:6379> decr num
(integer) -1
127.0.0.1:6379> incrby num 1
(integer) 0
127.0.0.1:6379> incrby num 10
(integer) 10

6.1.15 數(shù)值減少

# decrby NUM

127.0.0.1:6379> get num
(nil)
127.0.0.1:6379> decr num
(integer) -1
127.0.0.1:6379> incrby num 1
(integer) 0
127.0.0.1:6379> incrby num 10
(integer) 10
127.0.0.1:6379> decrby num 10
(integer) 0

6.2 列表(list)

有序
雙向管道, 左右都可以寫入, 先進(jìn)先出
列表值可以重復(fù)

6.2.1 創(chuàng)建列表并插入數(shù)據(jù)

127.0.0.1:6379> lpush city bj sh gz sz
(integer) 4
127.0.0.1:6379> type city
list
127.0.0.1:6379> rpush country cn jp kr 
(integer) 3

6.2.2 查看列表中元素的個(gè)數(shù)

127.0.0.1:6379> llen city
(integer) 4

6.2.3 獲取指定位置的數(shù)據(jù)

lrange: 從左到右, 按照范圍, 必須指定兩個(gè)索引編號(hào)
沒(méi)有rrange

127.0.0.1:6379> lrange city 0 0  # 查看第0個(gè)元素
1) "sz"
127.0.0.1:6379> lrange city 0 2
1) "sz"
2) "gz"
3) "sh"
127.0.0.1:6379> lrange city 0 -1 # 查看列表所有元素
1) "sz"
2) "gz"
3) "sh"
4) "bj"
lindex: 從左到右, 按照索引編號(hào), 取單個(gè)值

127.0.0.1:6379> lindex city 0
"sz"

6.2.4 修改列表指定索引對(duì)應(yīng)的值

127.0.0.1:6379> lrange city 0 -1
1) "sz"
2) "gz"
3) "sh"
4) "bj"
127.0.0.1:6379> lset city 0 as
OK
127.0.0.1:6379> lrange city 0 -1
1) "as"
2) "gz"
3) "sh"
4) "bj"

6.2.5 移除列表數(shù)據(jù)

元素全部移除后, 列表也會(huì)被刪除
lpop: 從左移除

127.0.0.1:6379> lrange city 0 -1
1) "as"
2) "gz"
3) "sh"
4) "bj"
127.0.0.1:6379> lpop city
"as"
127.0.0.1:6379> lrange city 0 -1
1) "gz"
2) "sh"
3) "bj"
rpop: 從右移除

127.0.0.1:6379> lrange city 0 -1
1) "gz"
2) "sh"
3) "bj"
127.0.0.1:6379> rpop city
"bj"
127.0.0.1:6379> lrange city 0 -1
1) "gz"
2) "sh"

6.3 集合

set是string類型的無(wú)序集合, 集合中的成員是唯一的, 這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)
可以在兩個(gè)不同的集合中對(duì)數(shù)據(jù)進(jìn)行比對(duì)并取值, 常用于取值判斷, 統(tǒng)計(jì)交集等場(chǎng)景
實(shí)現(xiàn)共同好友
集合的值不能重復(fù)
無(wú)序
集合間可以進(jìn)行操作

6.3.1 創(chuàng)建集合

127.0.0.1:6379> sadd set1 v1
(integer) 1
127.0.0.1:6379> sadd set2 v1 v4
(integer) 2
# 集合中的重復(fù)值會(huì)被自動(dòng)去重

127.0.0.1:6379> sadd set3 v1 v1 v1
(integer) 1
127.0.0.1:6379> smembers set3
1) "v1"

6.3.2 查看集合中所有元素

127.0.0.1:6379> smembers set1
1) "v1"
127.0.0.1:6379> smembers set2
1) "v4"
2) "v1"

6.3.3 集合中追加數(shù)值

127.0.0.1:6379> smembers set3
1) "v1"
127.0.0.1:6379> sadd set3 v1  # 追加重復(fù)數(shù)據(jù)不會(huì)生效, 自動(dòng)去重
(integer) 0
127.0.0.1:6379> smembers set3
1) "v1"
127.0.0.1:6379> sadd set3 v2
(integer) 1
127.0.0.1:6379> smembers set3
1) "v2"
2) "v1"

6.3.4 刪除集合中的元素

127.0.0.1:6379> smembers set3
1) "v2"
2) "v1"
127.0.0.1:6379> srem set3 v2
(integer) 1
127.0.0.1:6379> smembers set3
1) "v1"

6.3.5 集合間交集

127.0.0.1:6379> smembers set1
1) "v1"
127.0.0.1:6379> smembers set2
1) "v4"
2) "v1"
127.0.0.1:6379> sinter set1 set2
1) "v1"

6.3.6 集合間差集

127.0.0.1:6379> sdiff set1 set2 # 取差集時(shí), 第一個(gè)集合的元素要比第二個(gè)集合多
(empty list or set)
127.0.0.1:6379> sdiff set2 set1
1) "v4"

6.3.6 集合間并集

127.0.0.1:6379> sunion set1 set2
1) "v4"
2) "v1"

6.4 有序集合sorted set

集合自動(dòng)排序
靠打分機(jī)制, 給每個(gè)元素打分; 不同的元素可以打分相同, 一個(gè)元素只能有一個(gè)分?jǐn)?shù)
redis有序集合和集合一樣也是string類型的元素集合, 且不允許重復(fù)的成員, 會(huì)被自動(dòng)去重
不同的是, 每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double(雙精度浮點(diǎn)型)類型的分?jǐn)?shù),
redis正是通過(guò)該分?jǐn)?shù)來(lái)為集合中的成員進(jìn)行從小打到的排序, 有序集合的成員是唯一的, 但分?jǐn)?shù)是可以重復(fù)的
集合是通過(guò)哈希表來(lái)實(shí)現(xiàn), 所以添加, 刪除, 查找的復(fù)雜度都是O(1), 集合中最大的成員數(shù)為2^32-1個(gè), 每個(gè)集合開(kāi)業(yè)存儲(chǔ)40多億個(gè)成員, 常用于排行榜場(chǎng)景
有序集合的特點(diǎn):
有序
無(wú)重復(fù)元素
每個(gè)元素是由score和value組成
score可以重復(fù)
value不可以重復(fù)
對(duì)于同一個(gè)value, 多次打分, 后來(lái)的生效

6.4.1 生成有序集合

127.0.0.1:6379> zadd set 100 dave
(integer) 1
127.0.0.1:6379> zadd set 100 dave 90 admin 80 boss # 生成多個(gè)元素有序集合, 奇數(shù)位為分?jǐn)?shù), 偶數(shù)位為值
(integer) 2

6.4.2 生成排行榜

127.0.0.1:6379> zadd set 100 dave 90 admin 80 boss
(integer) 2
127.0.0.1:6379> zrange set 0 -1  # zrange表示正序從小到大排序
1) "boss"
2) "admin"
3) "dave"
127.0.0.1:6379> zrevrange set 0 -1 # zrevrange表示倒序從大到小排序
1) "dave"
2) "admin"
3) "boss"
127.0.0.1:6379> zrevrange set 0 -1 withscores # withscores顯示每個(gè)元素的分?jǐn)?shù)
1) "dave"  
2) "100"
3) "admin"
4) "90"
5) "boss"
6) "80"

6.4.3 獲取集合中元素的個(gè)數(shù)

127.0.0.1:6379> zcard set
(integer) 3

6.4.4 基于索引返回value

127.0.0.1:6379> zrange set 0 -1 
1) "boss"
2) "admin"
3) "dave"
127.0.0.1:6379> zrange set 0 1
1) "boss"
2) "admin"
127.0.0.1:6379> zrange set 0 100 # 超出索引范圍不會(huì)報(bào)錯(cuò)
1) "boss"
2) "admin"
3) "dave"

6.4.5 返回某個(gè)value的索引(排名)

127.0.0.1:6379> zrange set 0 -1
1) "boss"
2) "admin"
3) "dave"
127.0.0.1:6379> zrank set boss  # 集合安裝正序排名
(integer) 0
127.0.0.1:6379> zrevrank set boss # 集合按照倒序排名
(integer) 2

6.4.6 獲取某個(gè)value的分?jǐn)?shù)

127.0.0.1:6379> zscore set dave
"120"

6.4.7 刪除集合中的元素

127.0.0.1:6379> zrange set 0 -1
1) "boss"
2) "admin"
3) "dave"
127.0.0.1:6379> zrem set boss
(integer) 1
127.0.0.1:6379> zrange set 0 -1
1) "admin"
2) "dave"

6.5 哈希

hash特別適合用于對(duì)象存儲(chǔ)
hash是一個(gè)string類型的字段(field)和值(value)的映射表, redis中每個(gè)hash可以存儲(chǔ)2^32-1個(gè)鍵值對(duì), 類似于字典存放了多個(gè)k/v對(duì)
圖片.png

6.5.1 生成hashkey

127.0.0.1:6379> hset 9527 name zhouxingxing age 20 # 奇數(shù)位為field, 偶數(shù)位為value
(integer) 2
127.0.0.1:6379> type 9527
hash
127.0.0.1:6379> hgetall 9527
1) "name"
2) "zhouxingxing"
3) "age"
4) "20"
# 增加field

127.0.0.1:6379> hset 9527 gender male
(integer) 1
127.0.0.1:6379> hgetall 9527 # 獲取所有field的value
1) "name"
2) "zhouxingxing"
3) "age"
4) "20"
5) "gender"
6) "male"

6.5.2 獲取hash key的對(duì)應(yīng)字段的值

127.0.0.1:6379> hget 9527 name # hget獲取單個(gè)field的value
"zhouxingxing"
127.0.0.1:6379> hmget 9527 name age # hmget獲取多個(gè)field的value
1) "zhouxingxing"
2) "20"

6.5.3 刪除一個(gè)hash key的對(duì)應(yīng)字段

127.0.0.1:6379> hdel 9527 name
(integer) 1
127.0.0.1:6379> hget 9527 name
(nil)

6.5.4 批量設(shè)置hash key的多個(gè)field和value

127.0.0.1:6379> hmset alibaba ceo mayun age 50 gender male
OK
127.0.0.1:6379> hgetall alibaba
1) "ceo"
2) "mayun"
3) "age"
4) "50"
5) "gender"
6) "male"

6.5.5 獲取hash中多個(gè)指定字段的值

127.0.0.1:6379> hmget alibaba ceo age # hmget獲取多個(gè)字段對(duì)應(yīng)的value, hget獲取單個(gè)字段對(duì)應(yīng)的value
1) "mayun"
2) "50"

6.5.6 獲取hash中所有字段的field

127.0.0.1:6379> hkeys alibaba
1) "ceo"
2) "age"
3) "gender"

6.5.7 獲取hash key對(duì)應(yīng)所有field的value

127.0.0.1:6379> hvals alibaba
1) "mayun"
2) "50"
3) "male"

6.5.8 獲取指定hash key的所有filed及value

127.0.0.1:6379> hgetall alibaba
1) "ceo"
2) "mayun"
3) "age"
4) "50"
5) "gender"
6) "male"

6.5.9 刪除hash key

127.0.0.1:6379> del alibaba
(integer) 1

6.5.10 查看某個(gè)key是否存在

127.0.0.1:6379> exists alibaba
(integer) 0

7. Redis常用命令

7.1 info

顯示當(dāng)前節(jié)點(diǎn)redis的運(yùn)行狀態(tài), 可以跟字段名

127.0.0.1:6379> info
# Server
redis_version:5.0.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:28849dbea6f07cc8
redis_mode:standalone
os:Linux 4.18.0-193.el8.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:8.3.1
process_id:753
run_id:fb7c86f04a4936a880dfd3d00bef4a7a35e3945a
tcp_port:6379
uptime_in_seconds:28625
127.0.0.1:6379> info server # 查看server字段信息
# Server
redis_version:5.0.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:28849dbea6f07cc8
redis_mode:standalone
os:Linux 4.18.0-193.el8.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:8.3.1
process_id:753
run_id:fb7c86f04a4936a880dfd3d00bef4a7a35e3945a
tcp_port:6379
uptime_in_seconds:28664
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:4422089
executable:/usr/bin/redis-server
config_file:/etc/redis.conf
info replication
info clients

7.2 config

用于查看當(dāng)前redis配置, 以及不重啟redis服務(wù)實(shí)現(xiàn)動(dòng)態(tài)更改redis配置等

注意:不是所有配置都可以動(dòng)態(tài)修改, 且以此方式無(wú)法持久保存

舉例: config臨時(shí)設(shè)置redis密碼

config set requirepass 123456789

舉例: 獲取當(dāng)前redis的配置信息

config get *

舉例: 查看某一指令的配置信息

127.0.0.1:6379> config get bind
1) "bind"
2) "0.0.0.0"

舉例: 臨時(shí)提高redis占用的內(nèi)存

redis一般內(nèi)存設(shè)為物理機(jī)的一般, 專用來(lái)存放數(shù)據(jù)
至于其程序運(yùn)行, 還需要額外占用內(nèi)存空間
config set maxmemory 8589934592 #以字節(jié)為單位

7.3 select

切換數(shù)據(jù)庫(kù)

select 1

注意: redis cluster模式下不支持多個(gè)數(shù)據(jù)庫(kù).

7.4 keys命令

查看當(dāng)前庫(kù)下的所有key, 支持通配符, 生產(chǎn)環(huán)境禁用

7.5 bgsave

手動(dòng)在后臺(tái)執(zhí)行RDB持久化操作

7.6 dbsize

返回當(dāng)前庫(kù)下的所有key的數(shù)量
info命令的最后一行會(huì)返回所有庫(kù)所有key的數(shù)量

7.7 flushdb

強(qiáng)制清空當(dāng)前庫(kù)中所有的key, 當(dāng)前所在庫(kù)

7.8 flushall

強(qiáng)制清空當(dāng)前redis服務(wù)器所有庫(kù)中的所有key, 所有庫(kù)

生產(chǎn)建議把flushdb, flushall, config命令都禁用, 清空命令不應(yīng)該使用, 而config命令也盡量不要去臨時(shí)調(diào)整redis配置

vim /etc/redis.conf
rename-command flushall ""
rename-command flushdb ""
rename-command config "" # 直接禁用某個(gè)命令, 此為ranme-command的配置在登錄redis后執(zhí)行config get命令是查不到的, 并不會(huì)顯示
rename-command config linux # 這樣想要執(zhí)行config, 只能執(zhí)行l(wèi)inux, 相當(dāng)于把config換個(gè)名字
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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