網站首頁 編程語言 正文
redis運行原理
redis有很多的客戶端連接進來,站在redis所在機器的角度來說,就是有很多socket的連接,并且是打在內核
上面的,redis是一個進程,進程可以調用內核上的epoll,來遍歷尋找哪一個客戶端發送數據過來了(這里是單進程單線程來處理用戶數據的)。
redis使用
redis默認有16個庫
輸入:
進入基本分組
keys * 查詢所有的key
FLUSHDB 清除所有的key
對于如上nx的命令是我當前的key如果沒有被設置則把ooxx給設置成功,如果設置的key已經有value了,
則返回nil (多用于分布式鎖的獲取,只能有一個獲取成功)
對于xx命令,只有存在的時候才能進行操作。
mset命令(設置多個key和value)
append命令以及getrange命令
redis正反向索引
前面是從0,1,2開始的,后面則是從-1開始遞減的,所以也可以按照下面方式寫
SETRANGE 在給定范圍設置字符串:
獲取字符串長度:
獲取key所對應的value類型(主要是看set命令分組是在string上面的)
再來看一下object命令
它可以查看value的編碼類型(面向 redis string類型,除了字符串操作還有計算的操作【計算的操作面向數值的】)
incr和decr相關命令【可用于搶購,秒殺,點贊,評論數,詳情頁(比如說淘寶詳情頁,一定會后端發起一個異步查詢購買數等,查redis,可以規避并發下,對數據庫的事務操作,
完全由redis內存操作代替)】
redis二進制安全
redis進程與外界交互的時候,面向流我們有字節流,以及字符流,那么redis客戶端
訪問的時候,從socket里面拿到的是字節流的數據,只要未來的雙方客戶端和服務端有同樣的
編解碼方式,數據就不會被破壞。
如 set k1 = 9999,執行strlen 輸出4,redis里面存這個數據是按照一個字符一個字節來存入的,直接
向字符流去寫,執行incr之后是先把字節流拿出來轉換成數值的,轉換成數值之后會更新key的encoding
編碼,只要加成功就更新成int了,如果下次加的話就可以直接檢查這個encoding類型了,如果加的數
不是int類型則報錯
另一種如 set k2 中,是占3個字節的(軟件和redis通信用的utf-8)
我們再設置一個k3占2個字節(gbk編碼)
然后退出用redis-cli --raw來登錄,會觸發一個格式化(如果不帶上–raw是只會識別ascii碼的,超出部分則按照16進制來展示的,如果加上raw則會觸發編碼集的格式化)
key上有encoding的話,就相當于做了一個優化,來判斷我當前這個操作是否是可行的
getset命令
getset命令是將舊的值返回并將新的值給設置進去,(相對于get 和set單獨執行的話,要發兩個單獨
的命令過去,IO通信兩次,而這種方式只通信了一次【節省資源】)
mset 設置多個key多個value
msetnx (設置多個key對應的value保證原子性)下面的圖中msetnx 在設置k3的時候失敗了
位圖(bitmap)
setbit 方法,在對應的bit位上面設置值
bitpos命令:
找到第一個字節 中第一個1出現的位置
找到第二個字節出現1的第一個位置
統計1在字節范圍出現了幾次:
bitop 命令可以按位對value進行與和或等運算
場景題
1、公司有用戶系統,統計用戶的登錄天數,且窗口隨機(某天往前推一周,以及往后推一周,用戶登錄的天數統計一下)
一年設置為400天,可以使用50個字節存用戶全年的登錄狀態
-2 和-1為最后兩個字節(查詢300天到第400天)登錄多少次。【讓用戶為key登錄天數為value】
當然如果覺得用戶量特別大的話可以考慮一部分用戶存一個redis,另一部分
存另一個redis【注:1個用戶50個字節,那么20個用戶存1k的空間,20000個用戶越需要1MB的空間
2000000個用戶則需要100M的空間】
2、京東618做活動送禮物,大庫備貨多少個禮物?假設有2E用戶
1、對用戶做分類(分為僵尸用戶 冷熱用戶/忠誠用戶)
所以需要做活躍用戶統計,
什么是活躍用戶:
比如說 1號-3號 連續登錄 對重復登錄的去重
redis如何做
首先在2022年1月1日id為1的用戶登錄了 給bit位的1位上設置1
在2022年1月2日id為1和id為7的用戶登錄了分別在bit位1和bit位7上設置1
總結
key的type類型,是用于判斷訪問的方法是不是具備這個類型的操作,可以快速返回錯誤,可以規避
異常。
encoding是可以規避同一種type類型但是根據不同的表現形式做計算這件事,
還有length屬性,如果數據未發生改變可以直接返回長度
原文鏈接:https://blog.csdn.net/lsdstone/article/details/125982812
相關推薦
- 2022-04-10 Git常用命令介紹_其它綜合
- 2022-05-31 如何使用yolov5輸出檢測到的目標坐標信息_python
- 2022-11-01 Android串口通訊SerialPort的使用詳情_Android
- 2022-08-21 golang類型推斷與隱式類型轉換_Golang
- 2022-09-20 ?C++模板template原理解析_C 語言
- 2022-09-29 Python組合數據類型詳解_python
- 2022-06-28 python神經網絡使用tensorflow構建長短時記憶LSTM_python
- 2022-04-08 WPF布局及布局容器介紹_基礎應用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支