下一節 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...