1. 程式人生 > 其它 >20192405張紋豪 2021-2022-2 《網路與系統攻防技術》實驗一實驗報告

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