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è)名字