## 1. String (字符類型)
```
set key 1
get key
INCR key
DECR key
追加
append key 33 4
字符長度
strlen key
```
使用場景 使用的是最多的, 像保存登錄人信息, 保存驗證碼, 保存流水號, 像字符串的遞增數值 INCR key 和 遞減數值 DECR key 可以用來做 播放量 閱讀量等
## 2. Hash (散列類型)
```
結構類似 Map<String, Map<Object, Object>>
多個的時候 有個m
hset name key1 value1
hget name key2 獲取key中的一個值
hmset name key1 value1 key2 value2
hmget name key1 key2 獲取key中的多個值
hgetall name 獲取key的所有值
hdel name key1
hlen name 獲取key的全部數量
hdel name
增量是1
hset age 張三 18
hincrby age 張三 1 就從18變成19了
hincrby age 張三 -1 就從19變回18了
```
使用場景:購物車
shopCar:uid + 用戶id 做key
新增商品:hset shopCar:uid111 555 1
再新增商品:hset shopCar:uid111 556 1
購物車現有商品數量增加1個: hincrby shopCar:uid111 555 1
總數: hlen shopCar:uid111
全選: hgetall shopCar:uid111
## 3. List (列表類型)
按照添加順序保存, 可做排序的業務, 相當于按照添加時間倒序保存的
盡量不要做分頁, 因為當添加的數據過快, 原來是在第一頁顯示, 后來有添加了數據, 就會導致之前第一頁顯示的, 又在第二頁 或第n頁再顯示。后面的數據一直在添加, 這樣原來是最新的數據, 就變成舊數據了, 頁碼里的數據也就會重復了
```
在 key 對應 list 的頭部添加字符串元素
lpush name value
在 key 對應 list 的尾部添加字符串元素
rpush name value
返回 key 對應 list 的長度
llen name
讀取列表
lrange name 0 9
```
使用場景: 商品足跡
lpush 商品足跡:userId 商品id1 商品id2
使用場景:訂閱號
lpush likeArticle:userId 文章id1 文章id2 文章id3
// 前 10 條
lrange likeArticle:userId 0 9
## 4. Set (集合類型)
```
集合差集 屬于A但不屬于B
SDIFF keyA keyB [key...]
集合交集 屬于A同時也屬于B
SINTER keyA keyB [key...]
集合并集 屬于A或者屬于B的元素合并后的集合
SUNION keyA keyB [key...]
添加
SADD name value
移除集合中一個或多個成員
SREM name value[value2]
獲取key 的全部成員
smembers name
獲取key 的總數
scard key
隨機選擇n個元素, 元素不刪除
srandmember key n
隨機選擇n個元素, 元素會刪除
spop key n
判斷 value 元素是否是集合 key 的成員
SISMEMBER key value
```
使用場景:抽獎
srandmember key n 和 spop key n 用作抽獎 如 獎品是一個手機 則key是手機id, value 則是一個個用戶id
使用場景:點贊
sadd like:videoId userId1 userId2 userId3 新增點贊
srem like:videoId userId3 刪除點贊
smembers like:videoId 點贊用戶列表
scard like:videoId 點贊總數
sismember like:videoId userId2 判斷某個用戶是否點贊
使用場景:關注
sadd follow:meFollow:11 2 3 5 6 19 我關注的
sadd follow:followMe:11 5 14 16 9 關注我的
sadd follow:followMe:2 15 14 36 19 關注用戶 2 的
sadd follow:meFollow:2 5 33 45 99 用戶 2 關注的
SINTER follow:meFollow:11 follow:followMe:11 我關注他, 他也關注我
SINTER follow:meFollow:11 follow:meFollow:2 11和 2 共同關注的
SINTER follow:meFollow:11 follow:followMe:2 我關注的人, 同時也關注他 (用戶11 關注用戶19 和 用戶2, 同時用戶19也關注 用戶2)
使用場景:qq 內推 可能認識的人 使用 SDIFF keyA keyB 或者 SDIFF keyB keyA 互相取差集
## 5. SortedSet(有序集合 簡稱 zset)
做排序分頁
```
添加一個元素和該元素的分數 分數在前(score)
zadd key score member
zadd code 1 java
zadd code 2 css
zadd code 3 html
按照分數從小到大的順序 返回索引從start 到 stop之間的元素
zrange key start stop [WITHSCORES]
zrange code 0 2 WITHSCORES
獲取元素的分數
zscore key member
刪除 元素
zrem key member
獲取指定分數范圍的元素
zrangebyscore key min max [WITHSCORES] [limit offset count]
獲取指定分數范圍的元素 前5個
zrangebyscore key min max limit 0 5
增加某個元素的分數
zincrby key increment member
zincrby key 5 member 增加5分
獲取集合中元素的數量
zcard key
獲取指定分數范圍內的元素個數
zcount key min max
按照排名范圍刪除元素
zremrangebyrank key start stop
從小到大排名
zrank key member
從大到小排名
zrevrank key member
```
使用場景: 排行榜 熱搜
zadd goods:sell 20 1111 50 2222 商品 1111 售出20 , 商品2222 售出 50
zrange goods:sell 0 9 withscores 前10
zincrby goods:sell 3 1111 商品 1111 又售出3
實戰: 抖音面試題=> 獲取抖音視頻最新評論留言
涉及排序 分頁 高并發
可以使用 list 和 zset
list 做分頁可能會導致分頁數據重復, 因為每次添加都會頂到最前面
zset 把時間戳到分數, 視頻id 做值 zadd 抖音視頻最新評論 時間戳 視頻id 時間戳 視頻id
zrank zrevrank 進行從小到大和從大到小排序
## 6. Bigmap(位圖)
```
給指定 key 的值 的第 offset 賦值val
setbit key offset val
獲取指定 key 的第offset位
getbit key offset
返回指定 key 中 [start, end] 中為1的數量
bitcount key start end
對不同的二進制存儲數據進行位運算(AND OR NOT XOR)
bigop operation destkey key
```
bigmap 支持位數是2的32次方位, 512m大小
由0和1狀態表現的二進制位的big數組 , 從0開始
底層是用String實現, get 命令也能獲取, 獲取道德是 ascii碼
strlen 獲取長度時, 每8位是一個長度
setbit key 6 0 使用 strlen key 獲取的長度是1
setbit key 23 0 使用 strlen key 獲取的長度是3
setbit key 364 0 使用 strlen key 獲取的長度是46
場景: 用于狀態統計, 用戶是否登錄過, 如京東每日簽 到送京豆, 電影、廣告是否被點擊播放過
釘釘打卡上下班, 簽到統計
日活統計
連續簽到打卡
最近一周的活躍用戶
統計指定用戶一年中的登錄天數
某用戶按照一年365天, 哪幾天登陸過
簽到:mysql 也能做, 數據量小可以用,數據量大了就算了。
按月=> key =>業務前綴:用戶id:年月 , 從0開始
0 未簽到, 1簽到了
setbig sign:uid1:202101 0 1 2021年1月1日 簽到了
setbig sign:uid1:202101 1 1 2021年1月2日 簽到了
setbig sign:uid1:202101 20 1 2021年1月21日 簽到了
getbit sign:uid1:202101 0 判斷 2021年1月1日 是否簽到 這個返回1
getbit sign:uid1:202101 10 判斷 2021年1月11日 是否簽到 這個返回0
bigcount sign:uid1:202101 2021年1月簽到總數
bigcount sign:uid1:202101 0 9 2021年1月1日到10日 簽到總數
按年=> key =>業務前綴:用戶id:年 , 從0開始
setbig sign:uid1:2021 0 1 2021年第一天 簽到了
setbig sign:uid1:2021 364 1 2021年第365天 簽到了
其他和按月的一樣, 就是key變了
## 7. HyperLogLog(統計)
1\. 去重復
2\. 不直接存儲數據本身
3\. 通過犧牲準確率來換取空間, 它不準確
UV(Unique visitor):指通過互聯網訪問、瀏覽這個網頁的自然人。00:00-24:00 同一個訪客多次訪問算一次
PV(Page View):瀏覽量或點擊量
VV(Visit View):訪客1天內訪問網站的次數。
DAU:daily active user(日活躍用戶)
MAU:monthly active user(月活躍用戶)
PV與VV區別:PV是指頁面的瀏覽次數,VV是指你訪問網站的次數。
統計某個網站的UV 統計某個文章的UV
用戶搜索網站關鍵詞的數量
統計用戶每天搜索不同詞條個數
基數統計:統一一個集合中不重復的元素個數
基數:是一種數據集,去重復后的真實個數
```
將所有元素添加到 key 中
pfadd key element1 element2 element3
統計 key 的估算值(不精確)
pfcount key
合并去重 key 至新key
pgmerge new_key key1 key2
```
8. GEO(地理)
geo 本質是 zset
type key 會返回zset
```
添加地理位置的坐標
geoadd key longitude latitude member [longitude latitude member ...]
獲取地理位置的坐標
geopos key member [member ...]
計算兩個位置之間的距離
geodist key member1 member2 [m|km|ft|mi]
根據用戶給定的經緯度坐標來獲取指定范圍內的地理位置集合,用的最多,
像外賣平臺的 查找多少km內的的商家
georadius key longitude latitude radius m|km|ft|mi [WITHCOORD]
[WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
根據儲存在位置集合里面的某個地點獲取指定范圍內的地理位置集合
georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST]
[WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
返回一個或多個位置對象的 geohash 值
geohash key member [member ...]
```
[https://www.runoob.com/redis/redis-geo.html](https://www.runoob.com/redis/redis-geo.html) geo 命令
- 學習地址
- MySQL
- 查詢優化
- SQL優化
- 關于or、in、not in、!=等走不走索引的說明
- 千萬級數據查詢優化
- MySQL 深度分頁問題
- 嵌套循環 Block Nested Loop 導致索引查詢慢
- MySQL增加日志統計表優化各種日志表的統計功能
- MySQL單機讀寫QPS(性能)優化
- sqlMode 置 select 的值可以比 group 里的多
- drop、delete、truncate的區別
- 尚硅谷MySQL數據庫高級學習筆記
- MySQL架構
- 事務部分
- MySQL知識點
- mysql索引
- Linux docker安裝 mysql 8.0.25
- docker 安裝mysql 5.7
- mysql Field ‘xxx’ doesn’t have a default value
- mysql多實例
- docker中的sql文件導入
- mysql進階知識
- mysql字符集
- 連接的原理
- redo日志
- InnoDB存儲引擎
- InnoDB的數據存儲結構
- B+樹索引
- 文件系統-表空間
- Buffer Pool
- 億級數據導入到es
- MySQL數據復制
- MySQL缺少主鍵的表數據
- mysql update 其中更新的字段根據另一個更新字段作為條件去更新
- MySQL指定字段值排序(將指定值排在前面)
- 設置MySQL連接數、時區
- Navicat15右鍵刪除數據刷新就又恢復了
- MySQL替換字段部分內容
- Java和MySQL統計本周本月本季和年
- 分頁時order by 排序數據重復,丟失
- mysql同一張表根據某個字段刪除重復數據
- mysqldump定時全量熱備
- 專題總結
- 事務
- MySQL事務
- spring事務
- spring事務本類調用
- spring事務傳播行為
- spring事務失效問題
- 鎖和Transactional注解一塊使用的問題
- 數據安全
- 敏感數據
- SQL注入
- 數據源
- XSS
- 接口設計
- 緩存設計
- 限流
- 自定義注解實現根據用戶做QPS限流
- 架構
- 高可用
- Java
- Unsatisfied dependency expressed through field ‘baseMapper‘
- mybatisplus多數據源
- 單個字母前綴的java變量
- spring
- spring循環依賴解決
- 事務@Transactional
- yml 文件配置信息綁定到java工具類的靜態變量上
- @Configuration @Component 區別
- springboot啟動yml文件報錯
- spring方法重試注解Retryable
- spring讀取yml集合數據
- spring自定義注解
- 獲取resource下的圖片資源
- 手機號和電話號的正則驗證
- 獲取字符串中的數字
- mybatis
- mybatis多參數添加數據并返回主鍵
- 統一異常處理
- 分組校驗
- Java讀取Python json.dumps 函數保存的redis數據
- springboot整合springCache
- 若依mybatis值為null的字段沒有返回
- 若依
- 接口白名單
- @JsonFormat時區問題
- RequestParam.value() was empty on parameter 0
- jdk8和hutool請求第三方的https報錯
- springMVC
- springMVC與vue使用post傳數組
- elementUI 時間組件報錯問題
- vue具名插槽slot
- springboot配置maven的profiles(配置微服務多環境切換打包)
- resources 配置文件讀取順序
- Windows的cmd部署jar注意事項
- Java基礎
- JUC(鎖-并發-線程池)
- CAS
- Java 鎖簡介
- synchronized和Logk有什么區別?用新的ock有什么好處
- synchronized鎖介紹
- CompletableFuture
- 多線程
- 線程池
- 集合類
- map見過的小問題
- 退出雙層循環
- StringBuilder和StringBuffer核心區別
- 日志打印
- 打印log日志
- log日志文件生成配置
- 日期時間
- 時間戳轉為時間
- 并發工具
- 連接池
- http調用
- 內網訪問天地圖
- 判等問題
- 數值計算
- null問題
- 異常處理
- 文件IO
- 序列化
- 內存溢出OOM
- Double轉String出現E的問題
- springboot接收前端表單提交多字段和上傳文件
- 子線程的錯誤, 全局異常處理捕獲不到
- vue同一個項目訪問多個不同ip地址接口
- Autowired注解導入為null
- shiro
- UnavailableSecurityManagerException錯誤
- Windows服務器80端口被占用
- java圖片增加水印
- springcloud
- Feign方法配置錯誤導致jar包啟動失敗
- feign調用超時
- Springcloud從Nacos的yml文件讀取出錯
- 定時任務quartz
- JavaPOI導出Excel
- 合并行和列
- 設置樣式
- 設置背景色
- docker
- Linux 安裝
- docker命令
- docker網絡
- docker數據卷
- dockerfile
- docker安裝ping命令
- docker-compose
- docker-compose文件內容介紹
- Linux關閉docker開機啟動
- jar打包為鏡像
- 遷移docker容器存儲位置
- Nginx
- Linux在線安裝Nginx
- nginx.conf 核心配置文件
- vue 和 nginx 刷新頁面會報404
- nginx 轉發給三個集群的tomcat
- ServerName匹配規則
- Nginx負載均衡策略
- location 匹配規則
- Nginx 搭建前端調用后臺接口的集群
- alias與root
- nginx 攔截 post 請求, 帶參數轉發到前端頁面
- 防盜鏈配置
- Nginx的緩存
- 通用Nginx配置
- nginx配置文件服務器
- 后臺jar包得不到正確ip,nginx代理時要處理
- 升級使用websocket協議
- 設置IP黑/白名單
- vue項目get請求Nginx返回html頁面post返回405錯誤
- Nginx限制所有接口流量
- Redis
- 緩存數據一致性
- 內存淘汰策略
- Redis數據類型
- gmt6
- Linux安裝GMT6
- GMT6配置中文
- GMT文件修改Windows版本到Linux版本
- 注意GMT不同字體導致符號不同的問題
- GMT繪制南海諸島小圖
- GMT生成中文圖例
- elasticsearch
- 安裝配置
- Linux安裝配置elasticsearch7.6.2
- Linux 安裝 kibana 7.6.2
- 安裝7.6.2中文分詞器
- docker 安裝elasticsearch7.6.2
- 安裝Logback7.6.2
- springboot使用
- 0. elasticsearch賬號密碼模式訪問
- 1. 配置連接
- 2. 索引
- 3. 批量保存更新
- Result window is too large 10000
- elasticsearch 分詞的字段做排序 fielddata, 設置fielddata=true 無效果
- elasticsearch 完全匹配查詢(精確查詢)
- 模糊搜索
- 日期區間查詢
- 6.x基礎知識
- 自定義詞庫
- elasticsearch集群
- 搜索推薦Suggester
- 查詢es保存的數組
- 億級mysql數據導入到es
- es 報錯 ORBIDDEN/12/index read-only
- es核心概念
- es的分布式架構原理
- 優化大數據量時的ES查詢性能
- canal
- 1. mysql的Binlog
- 2. Canal 的工作原理
- 3. canal同步es
- JVM
- 1 類的字節碼
- 2. 類的加載
- JVM知識點
- Maven
- 依賴沖突
- xxl-job
- docker 安裝配置 xxl-job
- idea
- springboot啟動報錯命令過長
- services統一啟動微服務各模塊
- 云服務器安裝寶塔面板
- 突然出現啟動或者運行特別慢
- 有導入依賴但是顯示紅色同時點擊進去也有依賴
- Linux
- sh文件執行報錯: command not found
- 使用vagrant安裝虛擬機
- Linux 開啟端口
- 開放端口
- 復制文件夾及其文件到另一個文件夾
- 兩個服務器之間映射端口
- TCP協議
- 分層模型
- TCP概述
- 支撐 TCP 協議的基石 —— 首部字段
- 數據包大小對網絡的影響 —— MTU 與 MSS 的奧秘
- 端口號
- 三次握手
- TCP 自連接
- 四次揮手
- TCP 頭部時間戳
- 分布式
- 分布式腦裂問題
- 分布式事務
- 基礎知識
- 實現分布式事務的方案
- 阿里分布式事務中間件seata
- 冪等性問題
- 其他工具
- webstorm git提交代碼后project目錄樹不顯示
- 消息隊列
- 如何保證消費的順序
- 數據結構
- 漫畫算法:小灰的算法之旅
- oracle