20192405張紋豪 2021-2022-2 《網路與系統攻防技術》實驗一實驗報告
Redis基礎知識
redis瞭解
redis:redis是單執行緒的。基於記憶體操作。cpu並不是影響redis的效能瓶頸,redis的瓶頸是機器的記憶體和網路頻寬。
redis單執行緒快的原因:redis將所有資料放在記憶體中,多執行緒(cpu會上下文切換。會有一定的延遲)。
啟動redis服務: redis-server redisconfig/redis.conf
啟動redis程式:redis-cli -p 6379
關閉redis服務:shutdown
檢視有哪些redis服務:ps -ef|grep redis
基礎知識: 1. redis預設有16個數據庫,預設使用第0個,可以用select 2 命令切換使用第2個數據庫
2. DBSIZE 檢視資料庫大小
3. keys * 檢視所有的key
4.flushdb 清除當前資料庫所有資訊 flushall 清除全部資料庫內容
5.move 移除當前資料庫 move name 1
6.expire name 10 設定資訊過期時間 10為10秒,根據需要自行設定
redis五大資料型別
Redis-key
1. keys * 檢視所有的key
2. set name lili 設定一個name 的key 值為lili
3. get name 獲取name這個key的值
4. move name 1 移除name這個key
5. expire name 100 設定name這個key的過期時間為100秒
6. ttl name 檢視name這個key的有效時間
7. type name 檢視name這個key的資料型別
8. exists name 判斷name這個key是否存在
String
可以做計數器等
1.append 向字串後新增資料 append key1 tiantian ,如果key1不存在則會自動建立一個key1
2.strlen 檢視字串長度
3. incr key執行一次數值加1 decr key執行一次數值減1
或者 incrby key 10 執行一次數值加10 ,decrby同理 適用於瀏覽量等需要自增自減的資料
4.getrange key1 0 3 獲取字串key1的0-3個字元,如果獲取全部就是0 -1,因為預設是從0下標開始的
setrange key2 1 xxx 將字串key2從下標1開始將其替換成xxx
5. setex 命令為指定的 key 設定值及其過期時間。如果 key 已經存在, SETEX 命令將會替換舊的值。 setex key3 60 hello 設定key3過期時間問60秒,值為hello
setnx 如果這個key不存在,則為這個key設定一個value (適用於樂觀鎖)
6. mset 批量設定 mset k1 v1 k2 v2 k3 v3 設定了k1 k2 k3三個key 他們的值分別是v1 v2 v3
mget 批量獲取值 mget k1 k2 k3 獲取k1 k2 k3 的值
msetnx k1 v1 k4 v4如果這個些key不存在,則為這個key設定一個value
7. getset 先get值再set值
List
可以當棧和佇列
所有命令以L開頭
1. lpush 將一個或多個值插入列表的頭部(左) rpush將一個或多個值插入列表的尾部(右邊)
2.lrange 通過區間獲取具體的值 lrange keylist 0 -1
3.lpop 一出列表的第一個值(左),rpop移除列表的最後一個值(右)
4.lindex 通過下標獲取值 lindex list 1 獲得list下標為1的值
5. llen 獲取列表的長度
6. lrem 移除列表中指定個數的值 lrem list 1 three 移除list中的兩個three 或者 lrem list 1 three移除list中的1個three 數值可以自己規定
7.ltrim 截斷列表中指定下標長度的值 ltrim mylist 1 2 移除mylist中下標1-2的值 ,執行後表中只有下標1-2的值還存在。保留的是擷取的。
8.rpoplpush 移除列表的最後一個元素,並將它移動到一個新的列表中 rpoplpush mylist otherlist
9.lset 將列表中指定下標的值替換 lset otherlist 0 hello 將otherlist中下標問0 的值替換為Hello
10.linsert 可以向某一個元素的前面或者後面插入一個指定的值
linsert mylist before hello hahaha 向mylist中的hello元素前面插入hahaha
linsert mylist afterhello hahaha 向mylist中的hello元素後面插入hahaha
Set
set中的值不能重複
所有指令開頭都是s
1.sadd 新建 sadd myset hello 新建一個myset集合,並新增一個元素為hello
2.smemebrs 檢視指定set集合的所有值 smembers myset 檢視myset集合中的所有元素
3.sismember 判斷某一個值是不是在set集合中 sismembers mylist hello 判斷hello是否在myset集合中
3.scard 獲取集合中的元素個數 scard myset
4.srem 移除set集合中的元素 srem myset hello移除myset集合中的hello元素
5.srandmember 隨機抽出指定個數元素 srandmember myset 1 在myset集合中隨機抽出1元素,也可抽出多個元素(可做抽獎系統)
6.spop 隨機移除集合中的元素
7.將指定的值移動到另外一個set集合中 smove myset otherset nihao 將myset集合中的的nihao元素移動到集合otherset中
8. 差集:sdiff set1 set2 以set1為參照找出set2中沒有的元素
交集:sinter set1 set2 找出set1和set2中都有的元素 (可以實現使用者的共同關注,推薦好友等)
並集:sunion set1 set2 將set1和set2取並集
Hash
適合於物件的儲存
hash值以key-value形式存在 ,在redis中就是 key-hash(map)集合 --> key --(key--value)
命令以H開頭
1.hset 新建一個hash集合 hset myhash field1 hello 新建一個myhash集合,向key為field1下新增元素hello
hmset 同事新建多個
2.hget 獲取hash集合中的值 hget myhash field1 獲取myhash集合中field1下的值
hmget同時獲取多個
3.hgetall獲取所有hash集合中的值
4.hdel 刪除一個指定的欄位field hdel myhash field1
5. hlen myhash 獲取myhash集合的欄位長度
6.hexists myhash field1判斷欄位field1是否存在
7.hkeys myhash 獲取myhash集合中所有field
8.hvals myhash獲取myhash集合中所有value
Zset
各種資料排序,工資成績等等,排行榜
給資料資訊帶權重執行
命令以Z開頭
一個有序集合,在set的基礎上增加了一個值
1.zadd 新增 zadd myset 1 one 2 two 3 three 新增一個myset集合1,2,3是他的排序資訊,one ,two,three是這個有序集合的值
2.zrange myset 0 -1 檢視集合所有值
3.zrangebyscore salary -inf +inf withscore將salary集合按從負無窮到正無窮排序,並加上score資訊
zrevrange salary 0 -1從大到小排序
4.zrem 移除元素 rem myset hello移除myset集合中的hello元素
5.zcard 獲取有序集合中元素個數
6.zcount 獲取區間的元素數量 zcount myset 1 20 獲取myset有序集合中 1- 20 區間的元素數量
三種特殊資料型別
geospatial
它可以根據錄入的經緯度判斷兩地之間的距離,方圓半徑內的人
地理位置(朋友定位,附近的人)
1.geoadd 新增地理位置資訊 ,geoadd 表名 經度 緯度 地點名稱 ,注意:顯示經度再是緯度,不要寫反了
2.geopos 根據地點名稱獲取經度緯度 geopos china chongqing (獲得座標)
3.geodist china:city shanghai beijing km 獲取上海跟北京之間的直線距離 單位是km
4.附近的人,獲得所有附近的人的地址
georadius 以給定的經緯度為中心,找出某一半徑內的元素
指定地址:georadius china:city 110 30 500 km withdist withcoord count 2以110 30 經度緯度為中心尋找方圓500km內的其他元素城市,並顯示其直線 距離 經緯度 count 2可以限制查詢數量為2。
指定元素:georadiusbymembers china:city beijing 500 km withdist withcoord count 2 以城市北京為中心查詢
5.geohash 將指定城市的二維經緯度轉換為一維的字串 geohash china:city chongqing
6.zrange 檢視所有元素
Hyperloglog
基數統計演算法,頁面統計,數量統計(如果允許容錯)有0.081的錯誤率
1.pfadd 增添 pfadd mykey a b c d e
2.pfcount 統計key的元素數量 pfcount mykey
2.pfmerge 合併key pfmerge mykey2 mykey mykey2 將mykey和mykey1的資料合併到mykey2中
Bitmap
位儲存
bitmap點陣圖,操作二進位制操作,只有0和1兩個狀態
只要只有兩個狀態的資料,就可以用bitmap
比如用bitmap記錄週一到週末的打卡
setbit sign 0 1 代表打卡,前面0-6為星期1到6 ,後面0為未打卡 1為打卡
getbit sign 3 代表檢視星期四是否打卡 ,返回0 未打卡 1 打卡
bitcount sign 統計打卡的總天數
Redis事務
redis單條命令保證原子性,redis事務不保證原子性,redis沒有隔離級別的概念。
redis事務的本質: 一組命令的集合。一個事務中所有命令都會被序列化,在事務執行中,按順序執行。 一次性,順序性,排他性。
redis事務流程: 開啟事務(multi)——命令入隊——執行事務(exec)
127.0.0.1:6379> multi # 開啟事務 OK 127.0.0.1:6379(TX)> set k1 vi # 命令入隊 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> get k2 QUEUED 127.0.0.1:6379(TX)> set k3 v3 QUEUED 127.0.0.1:6379(TX)> exec #exec 執行事務 1) OK 2) OK 3) "v2" 4) OK
127.0.0.1:6379(TX)> discard # discard 取消事務
OK
Redis監視測試
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money # watch監視 樂觀鎖
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> decrby money 20
QUEUED
127.0.0.1:6379(TX)> incrby out 20
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 80
2) (integer) 20
127.0.0.1:6379>
Jedis
匯入依賴:
<dependencies> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.1.1</version> </dependency> <!--fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.56</version> </dependency> </dependencies>
Redis主從複製
主機負責寫。從機負責讀。
1.info replication 檢視當前埠資料庫角色
2. slaveof 127.0.0.1 6379 當前埠資料庫認定 主機為127.0.0.1 埠號為6379 的庫為 主機
程式碼認定的主機是暫時的,永久性的認定主機要在redis.conf檔案中配置
3.如果主機斷開可以使用slaveof no one讓自己成為主機
哨兵模式
1. 新建一個 配置檔案並進入 vim sentinel.conf
2.新增配置
3. 啟動哨兵 redis-sentinel redisconfig/sentinel.conf