redis基本技術總結
1 redis 簡介
基於內存、分布式、可選持久性的鍵值對(Key-Value)存儲數據庫
redis是一個高性能的key-value存儲系統。它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sortedset--有序集合)和hash(哈希類型)
存儲值類型:
- string
- list
- set
- zset
- hash
1.1 nosql 與 sql 區別
1.1.1 存儲方式
-
sql: 數據存儲在表結構中,需要先定義表和字段結構才能存儲數據。
-
nosql:存儲的數據格式可以是json、hash等鍵值對, 不需要定義表,隨時可以存儲
1.1.2 join查詢
-
sql: 支持join操作、使用一條SQL語句可以關聯多張表將數據查詢出來
-
nosql:不支持SQL語句,更不支持join操作
1.1.3 數據耦合性
-
sql: SQL 中不允許刪除已經被使用的外部數據以保證數據完整性,數據耦合性高
-
nosql:沒有強耦合的概念,數據可以隨時刪除
1.1.4 事務
-
sql: SQL具有事務的概念,如果對多張表數據進行更新操作,要么都成功,要么回退數據不更改。
-
nosql:nosql沒有事務概念,數據的操作都是原子級的
1.1.5 查詢性能
在相同水平的系統設計的前提下, 因為 NoSQL 中省略了 JOIN 查詢的消耗, 故理論上性能上是優於 SQL 的
1.2 Redis 優勢
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
- 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
2 redis 基本操作
2.1 string (重點)
2.1.1 添加修改數據
# 添加一個值
set key value
# 添加多個
mset key1 value1 key2 value2
2.1.2 獲取數據
# 獲取一個
get key
# 獲取多個值
mget key1 key2
2.1.3 刪除
# 刪除值
del key
2.1.4 獲取字符串的長度
strlen key
2.1.5 追加信息到原字符串之后
append key value
2.1.6 incr , incrby和 incrbyfloat
# 數值 + 1, 每次只增加1
incr key
# 指定 數值增加10, 只能增加整數值
incrby key 10
# 指定數值增加10.5, 可以增加整數或小數
incrbyfloat key 10.5
2.1.7 decr , decrby
# 數值 - 1, 每次只能減1
decr key
# 指定 數值減去10, 只能減整數值
decrby key 10
2.1.8 設置數據有效期
為指定的 key 設置值及其過期時間。如果 key 已經存在, SETEX 命令將會替換舊的值
# 格式: setex key seconds value
# 設置 code=3920且有效期等於60s的數據
setex code 60 3920
# 查看有效時期
ttl code
2.1.9 查看字段
keys *
2.2 哈希(Hash)
hash 是一個 string 類型的 field(字段) 和 value(值) 的映射表,hash 特別適合用於存儲對象。
Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)
2.2.1 hset 和 hset
-
增加修改數據
格式:
hset key field value
格式:
hmset key field value
# 添加一個hash數據 hset user name "張三" # 會覆蓋name字段值 hmset user name "lisi" name "wangwu" # 添加多了字段 hset user age 20 hight 175
2.2.2 hget和hmget
-
查看字段
格式:
hget key field
格式:
hmget key field
# 查看一個字段值 hget user name # 查看多個字段值 hmget user name age hight
2.2.3 hlen和hexists
-
查看hash表中字段的數量
格式:
hlen key
hlen user
-
hash表中是否存在指定的字段
格式:
hexists key field
hexists user gender
2.2.4 hkeys和hvals
-
查看hash表中的字段和值
格式:
hkeys key
格式:
hvals key
# 查看hash表中的所有字段 hkeys user # 查看hash表中的所有值 hvals user
格式:
hgetall key
hgetall user
2.2.5 hincrby和 hincrbyfloat
格式:hincrby key field incrment
格式:hincrbyfloat key field incrment
# 指定 數值增加10, 只能增加整數值
hincrby user age 1
# 指定數值增加10.5, 可以增加整數或小數
hincrbyfloat user age 1.5
2.2.6 hsetnx 命令
hsetnx 命令用於為哈希表中不存在的的字段賦值
# 格式: hsetnx key field value
hsetnx user gender nan
2.3 列表(list)
Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
2.3.1 添加數據
格式:
lpush key vuale1 value2 或 rpush key vuale1 value2
# 從左邊添加一個或多個數據
lpush list1 1 2 3 4 5 6
# 從尾部添加一個或多個數據
rpush list2 1 2 3 4 5 6
2.3.2 查看數據
格式: lrange key start stop
格式: lindex key index
格式: llen key
# 通過索引范圍查看數據
lrange list2 0 -1
# 查看指定索引位置的數據
lindex list2 0
# 查看list 的長度
llen list2
2.3.3 獲取並刪除數據
格式: lpop key 或 rpop key
2.3.4 規定時內獲取並刪除數據
格式: blpop key 或 brpop key
2.3.5 lrem 刪除命令
格式: lrem key count value
count 的值可以是以下幾種:
- count > 0 : 從表頭開始向表尾搜索,移除與 VALUE 相等的元素,數量為 count 。
- count < 0 : 從表尾開始向表頭搜索,移除與 VALUE 相等的元素,數量為 count 的絕對值。
- count = 0 : 移除表中所有與 VALUE 相等的值。
2.4 集合(set)
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重復的數據。
Redis 中集合是通過哈希表實現的。
-
添加數據
格式: sadd key member [member ...]
# 添加集合成員 sadd city beijing shanghai xian tianjin wuhan zhengzhou
-
獲取數據
格式: smembers key
-
刪除成員
格式: srem key member [member ...]
srem city beijing
-
查看集合成員數量
格式: scard key
scard city
-
判斷是否是集合中的成員
格式:
sismember key member
sismember city beijing
-
隨機獲取指定數量的成員數據
格式:
srandmember key count
# 隨機獲取2個成員數據 srandmember city 2
-
隨機獲取集合中的成員數據並刪除該數據
格式:
spop key
spop city
-
交集,並集,差集
格式:
sinter key1 [key2]
交集格式:
sunion key1 [key2]
並集格式:
sdiff key1 [key2]
差集 -
將兩個交集,並集,差集的結果集存儲到指定集合中
格式:
sinterstore destination key1 [key2]
交集格式:
sunionstore destination key1 [key2]
並集格式:
sdiffstore destination key1 [key2]
差集 -
將指定元素從原集合移動到目標集合中
格式:
smove source destination member
# 將集合成員1從集合set5中移動到集合set6中 smove set5 set6 1
2.5 有序集合(sorted set)
Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個 double 類型的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重復
-
添加數據
格式:
zadd key score1 member1 [score2 member2 ...]
# 添加數據 zadd zset1 10 ls # 添加多個數據 zadd zset1 10 ww 30 zs 25 zl
-
獲取有序集合中的數據
格式:
zrange key start stop [withscores]
或zrevrange key start stop [withscores]
zrange 和 zrevrange 互為逆序
zrange zset1 0 -1 withscores zrevrange zset1 0 -1 withscores
-
刪除數據
格式:
zrem key member [member]
-
按條件查詢
格式:
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
格式:
zrevrangebyscore key min max [WITHSCORES] [LIMIT offset count]
備注: min和max 查詢條件范圍,指向的是有序集合排序的數值
-
按條件刪除
格式:
zremrangebyrank key start stop
格式:
zremrangebyscore key min max
備注: min和max 查詢條件范圍,指向的是有序集合排序的數值;start 和 stop作用於索引
-
獲取有序集合中的數量
格式:
zcard key
格式:
zcount key min max
-
有序集合的交集和並集
格式:
zinterstore destination numkeys key [key ...]
格式:
zunionstore destination numkeys key [key ...]
備注: 類似無序集合的操作, numkeys 含義是表示后面有幾個集合進行操作
-
獲取數據對應的索引
格式:
zrank key member
格式:
zrevrank key member
-
score值的獲取與修改
格式:
zscore key member
格式:
zincrby key increment member
3 redis key基本指令
3.1 刪除key
del key
3.2 判斷key是否存在
exists key
3.2 獲取key所儲存的值的類型
type key
3.3 設置key的有效期
# 設置過期時間,以秒計
expire key seconds
# 設置過期時間,以毫秒計
pexpire key milliseconds
# 設置過期時間的時間戳,以秒計
expireat key timestamp
# 設置過期時間的時間戳,以毫秒計
pexpireat key milli-timestamp
# 移除 key 的過期時間,key 將持久保持
persist key
3.4 查看剩余的過期時間
-
ttl key
: 以秒為單位,返回給定 key 的剩余生存時間 -
pttl key
: 以毫秒為單位,返回給定 key 的剩余生存時間
3.5 查找所有符合給定模式( pattern)的 key
-
keys pattern
- 匹配規則:
- * 匹配0或多個任意字符
- ? 匹配一個任意字符
- [] 匹配一個指定的字符
- 匹配規則:
3.6 修改key的名稱
# 修改key的名稱,新的名稱存在,則值就會被覆蓋
rename key newkey
# 修改key的名稱,僅當 newkey 不存在時,將 key 改名為 newkey
renamenx key newkey
3.7 切換數據庫
select index
3.8 數據移動
# 將數據移動到其他庫中
move key db
3.9 數據清理
- 查看數據量:
dbsize
- 清理當前數據庫數據:
flushdb
- 清理所有數據:
flushall