Redis 1基礎知識

2021-10-23 18:42:28 字數 4147 閱讀 8170

下一節 redis 2 配置檔案redis.conf

select 1	1. redis 有16個資料庫,預設使用第0個,使用select 1/2/3/4.

.. 進行切換

dbsize 2. 檢視當前資料庫大小 dbsize

keys * 3. 檢視所有的key keys *

flushall/flushdb 4. 清除所有庫的key flushall;清除當前庫的key flushdb;

redis是單執行緒的,但效率很高,瓶頸主要是:記憶體和頻寬。redis為什麼快?

# string型別的常用操作

set key value 設定值

get key 獲取

getrange i 0 3 擷取字串(start,end

)閉區間

setrange i 1 xx 替換 abcd-> axxd

exists key 判斷key是否存在

strlen key 獲取字串長度

incr key 變數+1

decr key 標量-1

incrby key 3 變數+3

decrby key 3 變數-3

setex i 20 1 設定i的值1,20s後過期

setnx i 1 i不存在才能設定值

ttl i 檢視key的過期時間

mset user:1:name zhangsan user:1:age 12 批量設定 但是更加靈活

mset k1 v1 k2 v2 k3 v3 批量設定

msetnx k1 v1 k2 v2 批量設定,不存在才能成功,且k1 和 k2是原子操作

mget k1 k2 k3 批量獲取

getset 先獲取再賦值

hset key field value	 	儲存乙個雜湊表的key的鍵和值

hsetnx key field value 儲存乙個不存在的key的鍵和值

hmset user 1:name lisi 1:age 13 批量操作

hmget user 1:name 1:age

hdel user 1 刪除 use的1這個key

hgetail user 檢視元素

hlen user 檢視鍵值對個數

hexists user key 判斷是否存在

hkeys 所有的key

hvals 所有的value

hincrby user age age+1

hash不適合redis集群架構下大規模使用,當數量大時,需要防止大量資料存在同乙個redis中

lpush key value			往起始位置插入資料	

lrange key start

end 從左邊獲取

rpush key value 往末尾插入資料

rrange key start

end 從右邊獲取

lpop key 從左邊移除

rpop key 從右邊移除

lindex key 2 從左表獲取指定下標的元素

rindex key 2 從右表獲取指定下標的元素

llen key 獲取個數

lrem key 1 s 從左邊查詢,移除第乙個s

lrem key 2 s 從左邊查詢,移除兩個s

ltrim key start

end 擷取list[start,end]

,原來的list會改為擷取後的

rpoplpush oldlist newlist 移除oldlist最後乙個元素並放入新列表中

lset key 2 value 覆蓋list的第二個元素為value ,不存在會報錯

linsert

sadd myset hello		存值

smembers myset 檢視內容

sismember myset hello 判斷是否存在

scard myset 個數

srem myset hello 移除

srandmember myset 2 隨機獲取n個

spop myset 2 隨機移除兩個

smove myset myset2 fwef 將fwef重myset移除,新增到myset2

sdiff set1 set2 獲取差集

sinter set1 set2 交集

sunion set1 set2 並集

zadd 	 向集合中新增乙個元素 如果值存在則更新順序號

zrange myset 0 -1 withscores withscores顯示 順序號

zrem 刪除乙個元素

zincrby 對序號進行增加

zrank 按照索引排序 ,返回索引值

zcount myset 2 4 返回score在給定區間的數量

zcard 返回所有元素個數

redis 單條命令是原子性的,但是redis事務不保證原子性(即乙個事務中,有個別指令引數錯誤,其他的正常執行)

乙個事務中的所有命令順序執行

沒有隔離級別的概念

如果是命令錯誤,則所有命令都不執行(編譯錯誤)

如果是語法錯誤,則忽略錯誤行,其他正常執行(執行錯誤)

redis事務三個階段

watch 監控某個key 只有該值沒變時,當前事務才能成功

unwatch

使用 setnx 設定鎖,可以實現分布式鎖,但是應用加上鎖之後出異常,導致死鎖;

在上面程式執行中,應用宕機,導致鎖無法釋放;

在設定鎖和設定超時時間中間,應用宕機,導致鎖無法釋放;

解決方式:採用原子的 設定鎖和超時時間的命名;

有了超時時間,但是在高併發,且應用執行時間長,可能超過了鎖時間,導致第一次上的鎖自動失效,第二把鎖被第乙個執行緒釋放,第三部鎖被第二個執行緒釋放。。。的鎖失效問題;

同上,程式沒有執行完,但鎖已經失效;

如果是主從架構,如果master上鎖,同步到salve前時,master宕機

那如果應用效能要求非常高,用redis集群,但是被redis單執行緒分布式鎖限制了效能

public class redislocktest 

/*** 使用redis做分布式鎖2

* 缺點: 應用在todo宕機,鎖無法釋放

*/ @test

public void locktest2(

)finally

}/**

* 使用redis做分布式鎖3

* 缺點:

* 1 在高併發,且應用執行時間長,可能超過了鎖時間,導致第一次上的鎖自動失效,第二把鎖被第乙個執行緒釋放,第三部鎖被第二個執行緒釋放。。。的鎖失效問題

* 2 程式還沒有執行完,但鎖可能已經失效

* 解決方式: 可以使用 redission 框架,避免重複造輪子

*/ @test

public void locktest3(

)finally

}/**

* 使用redis做分布式鎖4

* 解決locktest3 的缺點 1

*/ @test

public void locktest4(

)finally}}

/*** 使用redis做分布式鎖4

* 解決locktest3 的缺點 2

*/ int state = 0 ;

@test

public void locktest5()}

, timeout / 3, timeout / 3, timeunit.seconds)

;try

finally}}

@test

public void locktest6(

)finally

} private void dobusi(

)catch

(interruptedexception e)

}}

redis 1 基礎命令

查詢單個key keys pattern 獲取所有與pattern 匹配的key。表示任意乙個或多個字元 表示乙個字元 127.0 0.1 6379 keys 1 names 2 hehe 3 hello 4 name 5 status 6 id 127.0 0.1 6379 keys name 1...

Redis基礎知識

1 redis是開源的高效能鍵值對 key value 資料庫 通過提供各種鍵值資料型別來適應不同場景下的儲存需求,並借助許多高層級的介面使其可以勝任如快取 佇列系統等不同的角色。2 remote dictionary server,以字典結構儲存資料,並允許其他應用通過tcp協議讀寫字典中的內容 ...

redis基礎知識

redis是乙個基於記憶體的高效能key value 1.redis五大基本資料型別 字串 string set get 雜湊 hash hmset hmgetall 鍊錶 list 按照插入順序可以新增乙個元素列表的頭部 左邊 和尾部 右邊 lpush rpush lrange 集合 set sa...