迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“我愛加班”。 面試開始,直入正題。 面試官: 你知道MySQL索引底層數據結構為啥用B+樹?而不用B樹、紅黑樹或者普通二叉樹? 我: 這事誰知道作 ...
Redis的五種基本數據類型
1、概述
- Redis是一個由C語言開發的基於key-value形式的非關係型資料庫
- key-value:鍵值對【鍵:String,值:五種數據類型】
- 非關係資料庫:NoSQL【Not Only SQL】
- 關係型資料庫:由二維表的形式來存儲數據
- 不是關係型資料庫,就是非關係型資料庫
- 非關係資料庫:NoSQL【Not Only SQL】
- key-value:鍵值對【鍵:String,值:五種數據類型】
- 存儲介質
- 預設是記憶體
- 可以持久化到磁碟上
- 官網
2、Redis的五種基本數據類型
- string:字元串
- hash:對象
- list:有序列表
- set:無序集合
- zset:有序集合
3、基本用法
1、string
set get getset mset mget
setnx strlen append incr incrby
decr decrby
#設置key和value,正確返回OK
set key value
set name zhangsan
#獲取key對應的value值,若沒有返回nil
get key
get name
#返回key對應的value,再重新設置這個key的值
getset key value
getset name lily
#設置多個鍵值對 正確返回OK
mset k1 v1 k2 v2 ...
mset sex 1 age 20 address hz
#獲取多對key對應的value
mget k1 k2 k3 ...
mget sex age address
#設置key-value:如果key不存在,則設置,如果key存在,則什麼都不做
#成功返回1,失敗返回0
setnx key value
setnx phone 13577889900
#計算key對應的value的長度
strlen key
strlen phone
#在原先的基礎之上進行字元串追加
append key value
append address xs
#本來address的值是hz,現在就是hzxs
#自增1,value是數值類型才能成功。如果key不存在,則直接以0為基礎,進行自增。如果這個值不是數值,則會報錯
incr key
incr age
#age本來是20,現在返回就是21
#自增指定數量,value是數值類型才能成功
incrby age 5
#age本來是20,現在返回就是25
#自減1,value是數值類型才能成功。
decr key
decr age
#age本來是0,現在返回就是-1
#自減指定數量,value是數值類型才能成功
decrby key
decrby age 20
#age本來是30,現在返回就是10
2、hash
hset hmset hget hmget hkeys
hvals hgetall hexists hlen hsetnx hdel
#設置值,必須指定大key和小key、value
hset person name tom
#設置多值
hmset person sex 1 age 20
#獲取單個小key對應的value
hget person sex
#獲取多個小key對應的value們
hmget person name age
#獲取所有的小key
hkeys person
#獲取所有的小key對應的values
hvals person
#獲取所有大key中的鍵值對
hgetall person
#判斷小key是否存在
hexists person age
#求大key中小key的數量
hlen person
#設置小key【小key不存在,則設置成功,如果存在,則什麼都不做】
hsetnx person age 25
#刪除
hdel person age
3、list
- 增加數據:兩種方式
- 左邊增加數據:左壓棧,後增加的數據在左邊
- 右邊增加數據:右壓棧,後增加的數據在右邊
- 讀取數據
- 讀取數據從左往右
lpush rpush lrange llen lindex lpop rpop rpoplpush lrem
#左壓棧
lpush key v1 v2 ...
#特征:存入的數據順序跟讀取順序相反
#右壓棧
rpush key v1 v2 ...
#特征:存入的數據順序跟讀取順序相同
#查詢列表中的數據
#下標從0開始,如果要讀到最末尾,endIndex就是-1
lrange key startIndex endIndex
lrange key 0 -1
#獲取列表元素的個數
llen key
#獲取指定索引的元素,index表示索引
lindex key index
#獲取指定索引為3的元素
lindex key 3
#從左邊彈出一個元素[獲取最左邊的元素,再刪除它]
lpop key
#從右邊彈出一個元素
rpop key
#從一個列表的右邊彈出元素,再追到加另一個列表的左邊
rpoplpush 源列表 目標列表
#移除count個的value值
lrem key count value
lrem names 2 tom
#刪除names列表中2個tom【是從左開始移除】
4、set
sadd scard smembers sismember spop sdiff sinter sunion
sdiffstore sinterstore sunionstore smove
#存值
sadd myset aa bb cc
#返回存入的個數
#獲取集合長度
scard myset
#獲取集合元素
smembers myset
#判斷元素是否在集合中。存在:返回1,不存在:返回0
sismember myset cc
#隨機彈出一個元素
spop myset
#隨機彈出指定個數元素
spop myset 2
#差集
sdiff myset1 myset2
#交集
sinter myset1 myset2
#並集
sunion myset1 myset2
#將交集結果存入到另一個集合中
#sdiffstore 存儲結果的集合名 操作的集合一 操作的集合二
sdiffstore myset3 myset1 myset2
#將交集結果存入到另一個集合中
sinterstore myset4 myset1 myset2
#將並集結果存入到另一個集合中
sunionstore myset5 myset1 myset2
#將myset1中的aa元素移動到myset3
smove myset1 myset3 aa
5、zset(sorted set)
zadd zcard zrange zincrby zscore zinterstore zrangebyscore zrevrangebyscore
zrem zrank zremrangebyscore
#向有序集合中增加元素
#zadd 集合名 分數1 名稱1 分數2 名稱2 ...
zadd tuhaobang 10 zhangsan 80 lisi 30 wangwu
#返回插入的數量
#獲取集合中元素的數量
zcard tuhaobang
#獲取集合中指定區間的元素名稱,如果後面的索引是-1,則返回所有元素名稱
zrange tuhaobang 0 -1
1) "zhangsan"
2) "wangwu"
3) "lisi"
#獲取集合所有的元素,包括名稱和分數【是從小到大排序】
zrange tuhaobang 0 -1 withscores
1) "zhangsan"
2) "10"
3) "wangwu"
4) "30"
5) "lisi"
6) "80"
#獲取集合前兩位元素的名稱和分數
zrange tuhaobang 0 1 withscores
1) "zhangsan"
2) "10"
3) "wangwu"
4) "30"
#為集合中指定的名稱的元素增加分數
zincrby tuhaobang 50 zhangsan
#返回增加後的分數
#返回集合中指定名稱的分數
zscore tuhaobang wangwu
#把myzset1和myzset2根據元素名稱求出交集,並把相同名稱的value加在一起,得到元素名稱的新分數,存入到新集合中,成功返回的是交集的個數
#zinterstore 目標集合 操作集合的數量 集合一 集合二 ...
ZINTERSTORE myzset3 2 myzset1 myzset2
#zrangebyscore 集合名稱 小分數 大分數 [withscores] [limit 第幾條開始顯示 顯示數量]
#在不知道當前集合中最大值和最小值的情況下,-inf代表最小值 +inf代表最大值
#獲取tuhaobang集合中所有元素名稱及分數
zrangebyscore tuhaobang -inf +inf withscores
#獲取tuhaobang集合中第一個元素名稱及分數
zrangebyscore tuhaobang -inf +inf withscores limit 0 1
#獲取tuhaobang集合中分數在50-100之間的所有元素名稱及分數
zrangebyscore tuhaobang 50 100 withscores
#獲取tuhaobang集合中分數在50-100之間的前兩位元素名稱及分數
zrangebyscore tuhaobang 50 100 withscores limit 0 2
#按從大到小的順序進行排序,並獲取前2位
zrevrangebyscore tuhaobang +inf -inf withscores limit 0 2
#根據元素名刪除元素
zrem key member [member...]
#獲取集合中指定元素名稱對應的索引
zrank tuhaobang lisi
#刪除指定分數區間的元素[10,20],刪除成功返回刪除的個數,否則返回0
zremrangebyscore tuhaobang 10 20
4、通用命令
- key相關
#查找匹配規則的key, *:代表0到多個字元,?代表一個字元
#查詢所有key
keys *
#查詢keys中第二個字母為a的key
keys ?a*
#判斷key是否存在,存在:返回1,不存在:返回0
exists key
#刪除key,刪除成功返回1,刪除不存在的key返回0
del key
#查看key剩餘有效時間
#ttl key
ttl gender
結果:返回剩餘有效時間,如果已經過期:返回-2,如果沒有設置有效時間:返回-1
#設置已經存在的key的過期時間,單位為秒
expire key seconds
#為已經存在的key設置過期時間,單位是毫秒
pexpire key 毫秒
#查看指定key的剩餘存活時間,單位是毫秒
pttl key
#移除指定key的生存時間,永久的持久化
persist key
#獲取指定的key的value的數據類型
type key
#移動當前資料庫中對應的key到其他資料庫,dbindex是0-15
move key dbindex
- 資料庫相關
#redis預設有16個資料庫,分別是 db0 - db15
#查看當前資料庫下有多少key
dbsize
#切換資料庫,dbindex是0-15
select dbindex
#清空當前資料庫
flushdb
#清空所有資料庫中的數據
flushall
#實時監控Redis服務接收到的命令【其他客戶端的操作,能夠被監控到】
monitor
- 查看redis讀寫性能
#redis寫的性能
redis-benchmark set
#redis讀的性能
redis-benchmark get