Redis 实战案例总结
Redis實用場景
Redis的n種妙用,不僅僅是緩存
Redis只能做緩存?太out了!
Redis 幾種數據類型及應用場景
redis實現存取json格式對象/集合數據
多線程實現項目初始化完成大規模數據寫入redis緩存
16個Redis常見使用場景總結
Redis 實戰篇:巧用數據類型實現億級數據統計
使用Redis的有序集合實現排行榜功能
點贊模塊設計 - Redis緩存 + 定時寫入數據庫實現高性能點贊功能
緩存與數據庫一致性
分布式緩存與DB秒級一致的靈活設計實踐
集群配置
redis 集群配置實現
Redis 數據類型:
字符串類型 String
1.存儲:
set key value time
2.查詢:
get key
3.刪除:
del key
4.遞增或遞減:
遞增語法:incr key
遞增語法(指定步長):incrby key step
遞減語法:decr key
遞減語法(指定步長):decrby key step
5.追加內容
set ideal hello OK append ideal ,ideal-20 # 追加內容 (integer) 14 get ideal "hello,ideal-20"6.截取部分字符串:
> get ideal "hello,ideal-20" > getrange ideal 0 3 "hell" > getrange ideal 0 -1 "hello,ideal-20"(7) 替換部分字符串
語法:setrange key start
> get ideal "hello,ideal-20" > setrange ideal 6 bwh # 從下標為6的位置開始替換 (integer) 14 > get ideal "hello,bwhal-20"(8) 獲取值的長度
語法:strlen key
> strlen addr1 (integer) 7(9) 不存在的時候才設置
語法:setnx key value
不存在,則創建
存在,則失敗
(10) 同時存儲獲取多個值
同時存儲多個值:mset key1 value1 key2 value2 …
同時獲取多個值:mget key1 key2
同時存儲多個值(保證不存在):msetnx key1 value1 key2 value2 …
此操作為原子性操作,要失敗全部失敗
> mset addr1 beijing addr2 guangdong addr3 shanghai # 同時存儲多個值 OK > keys * 1) "addr3" 2) "addr2" 3) "addr1"> mget addr1 addr2 addr3 # 同時獲取多個值 1) "beijing" 2) "guangdong" 3) "shanghai"> msetnx age1 20 age2 25 age3 30 # 第一次同時存儲多個值(保證不存在) (integer) 1 > msetnx age4 35 age5 40 age1 45 # 第二次同時存儲多個值(保證不存在),失敗了 (integer) 0 >(11) 設置對象
語法:key value (key 例如:user:1 ,value為一個json字符串)
> set user:1 {name:zhangsan,age:20} # 存一個對象 OK > keys * 1) "user:1" > get user:1 "{name:zhangsan,age:20}"以上這種 user:1 的設計在 Redis 中是允許的,例子如下
語法:對象名:{id}:{filed}
(12) 先 get 后 set
語法:getset
先取到原來的值,然后再把新值覆蓋,如果原先沒有值返回 nil
列表類型 - list
(1) 添加
A:從左或從右添加元素
lpush key value:將元素添加到列表左邊
Rpush key value:將元素添加到列表右邊
B:插入新值到某個值前后
語法:linsert list before/after value newvalue
> lrange list1 0 -1 1) "A" 2) "B" 3) "C"> linsert list1 before C XXX # 在 C 前插入 XXX (integer) 4> lrange list1 0 -1 1) "A" 2) "B" 3) "XXX" 4) "C"(2) 獲取:
A:根據區間獲取值
語法:lrange key start end
> lrange list1 0 -1 # 獲取所有值 1) "C" 2) "B" 3) "A"> lrange list1 0 1 # 獲取指定區間的值 1) "C" 2) "B"B:根據下標獲取值
語法:lindex list 下標
> lrange list1 0 -1 1) "C" 2) "B > lindex list1 0 "C" > lindex list1 1 "B"C:獲取列表的長度
語法 llen list
> llen list1 (integer) 1(3) 刪除
A:移除最左或最右的元素
lpop key:刪除列表最左邊的元素,且返回元素
rpop key:刪除列表最右邊的元素,且返回元素
B:移除指定的值
語法:lrem list num value
> lrange list1 0 -1 1) "C" 2) "C" 3) "B" 4) "A"> lrem list1 1 A # 刪除1個A (integer) 1 > lrange list1 0 -1 1) "C" 2) "C" 3) "B"> lrem list1 2 C # 刪除2個C (integer) 2 > lrange list1 0 -1 1) "B" >C:移除最后一個元素且添加到另一個list
rpoplpush list1 list2
> lrange list1 0 -1 1) "A" 2) "B" 3) "C"> rpoplpush list1 list2 # 移除 list1 中最后一個元素,且添加到list2 中去 "C"> lrange list1 0 -1 1) "A" 2) "B" > lrange list2 0 -1 1) "C"(4) 根據下標范圍截取 list
語法:ltrim list start end
> rpush list1 A (integer) 1 > rpush list1 B (integer) 2 > rpush list1 C (integer) 3 > rpush list1 D (integer) 4> ltrim list1 1 2 # 截取下標為1到2的值 OK> lrange list1 0 -1 1) "B" 2) "C"(5) 替換指定下標的值
語法:lset list 下標 value
集合類型 - set
set:一種無序(不保證有序)集合,且元素不能重復
(1) 添加
語法:sadd key value
> sadd set1 A (integer) 1 > sadd set1 B (integer) 1 > sadd set1 C (integer) 1 > sadd set1 C # set的值不能重復 (integer) 0 > smembers set1 # 查詢指定set的所有值,亂序 1) "B" 2) "A" 3) "C"(2) 獲取
A:獲取set集合中的所有元素
語法:smembers key
> smesmbers set1 # 查詢指定set的所有值,亂序 1) "B" 2) "A" 3) "C"B:獲取元素的個數
語法:scard set
> scard set1 (integer) 3C:隨機獲取元素
語法:sembers set [num]
默認獲取一個隨機元素,后跟數字,代表隨機獲取幾個元素
> smembers set1 1) "D" 2) "B" 3) "A" 4) "C"> srandmember set1 # 獲取一個隨機元素 "D" > srandmember set1 # 獲取一個隨機元素 "B"> srandmember set1 2 # 獲取兩個隨機元素 1) "A" 2) "D"(3) 刪除
A:刪除set集合中某元素
語法:srem key value
> srem set1 C # 刪除 C 這個元素 (integer) 1> smembers set1 1) "B" 2) "A"B:隨機刪除一個元素
語法:spop set
> smembers set1 1) "D" 2) "B" 3) "A" 4) "C" > spop set1 # 隨機刪除一個元素 "A" > spop set1 # 隨機刪除一個元素 "B" > smembers set1 1) "D" 2) "C"(4) 移動指定值到另一個set
語法:smove set1 set2 value
> smembers set1 1) "D" 2) "C"> smove set1 set2 D # 從 set1 移動 D 到 set2 (integer) 1> smembers set1 1) "C" > smembers set2 1) "D"(5) 交集 并集 差集
sinter set1 set2:交集
sunion set1 set2:并集
sdiff set1 set2:差集
有序集合類型 - sortedset/zset
此類型和 set 一樣也是 string 類型元素的集合,且不允許重復的元素
不同的是每個元素都會關聯一個double類型的分數,redis正是通過分數來為集合中的成員進行從小到大的排序
有序集合的成員是唯一,但分數(score)卻可以重復
(1) 添加
語法:zadd key score value [score value … …]
> zadd sortedset1 20 zhangsan # 添加一個 (integer) 1 > zadd sortedset1 10 lisi 60 wangwu # 添加多個 (integer) 2(2) 獲取
A:獲取所有值(默認排序)
語法:zrange sortedset start end [withscores]
根據那個值的大小進行了排序,例如上面的 10 20 60
> zrange sortedset1 0 -1 1) "lisi" 2) "zhangsan" 3) "wangwu"B:獲取所有值(從小到大和從大到小)
zrangebyscore sortedset -inf +inf:從小到大
zrevrange sortedset 0 -1:從大到小
C:獲取值且附帶數值
zrangebyscore sortedset -inf +inf withscores:從小到大且附帶值
> zrangebyscore sortedset1 -inf +inf withscores # 顯示從小到大且附帶值 1) "lisi" 2) "10" 3) "zhangsan" 4) "20" 5) "wangwu" 6) "60"> zrangebyscore sortedset1 -inf 20 withscores # 顯示從小到大,且數值小于20的 1) "lisi" 2) "10" 3) "zhangsan" 4) "20" >D:獲取有序集合中的個數
語法:zcard sortedset
> zcard sortedset1 (integer) 2E:獲取指定區間成員數量
語法:zcount sortedset start end (strat 和 end是指那個數值,而不是什么下標)
> zcount sortedset1 10 60 (integer) 3(2) 刪除
zrem key value
> zrange sortedset1 0 -1 1) "lisi" 2) "zhangsan" 3) "wangwu"> zrem sortedset1 wangwu # 刪除 wangwu 這個元素 (integer) 1> zrange sortedset1 0 -1 1) "lisi" 2) "zhangsan"哈希類型 - hash
(1) 添加
A:普通添加
語法:hset hash field value
> hset hash1 username admin (integer) 1 > hset hash1 password admin (integer) 1B:不存在才可以添加
語法:hsetnx hash filed value
> hsetnx hash1 username admin888 # 已存在,失敗 (integer) 0> hsetnx hash1 code 666 # 不存在,成功 (integer) 1(2) 獲取
A:獲取指定的field對應的值
語法:hget hash field [ key field … …]
> hget hash1 password "admin"B:獲取所有的field和value
語法:hgetall hash
> hgetall hash1 1) "username" 2) "admin" 3) "password" 4) "admin"C:獲取 hash 的字段數量
語法:hlen hash
> hlen hash1 (integer) 2D:只獲取所有 field 或 value
hkeys hash:獲取所有 field 字段
hvals hash:獲取所有 value 值
(3) 刪除
語法:hdel hash field
> hdel hash1 username (integer) 1(4) 自增自減
hincrby hash field 增量
> hsetnx hash1 code 666 (integer) 1 > hincrby hash1 code 2 (integer) 668 > hincrby hash1 code -68 (integer) 600三種特殊數據類型
Geospatial(地理位置)
使用經緯度,作為地理坐標,然后存儲到一個有序集合 zset/sortedset 中去保存,所以 zset 中的命令也是可以使用的
特別是需要刪除一個位置時,沒有GEODEL命令,是因為你可以用ZREM來刪除一個元素(其結構就是一個有序結構)
Geospatial 這個類型可以用來實現存儲城市坐標,一般都不是自己錄入,因為城市數據都是固定的,所以都是通過 Java 直接導入的,下面都是一些例子而已
Geospatial 還可以用來實現附近的人這種概念,每一個位置就是人當前的經緯度,還有一些能夠測量距離等等的方法,后面都會提到
命令列表:
(1) 存儲經緯度
語法:geoadd key longitud latitude member […]
longitud——經度、 latitude——緯度
有效的經度從-180度到180度。
有效的緯度從-85.05112878度到85.05112878度。
> geoadd china:city 116.413384 39.910925 beijing (integer) 1 > geoadd china:city 113.271431 23.135336 guangzhou (integer) 1 > geoadd china:city 113.582555 22.276565 zhuhai (integer) 1 > geoadd china:city 112.556391 37.876989 taiyuan (integer) 1(2) 獲取集合中一個或者多個成員的坐標
語法:geopos key member [member…]
> geopos china:city beijing zhuhai 1) 1) "116.41338318586349487"2) "39.9109247398676743" 2) 1) "116.41338318586349487"2) "39.9109247398676743"(3) 返回兩個給定位置之間的距離
語法:geodist key member1 member2 [unit]
單位默認為米,可以修改,跟在 member 后即可,例如 km
指定單位的參數 unit 必須是以下單位的其中一個:
m 表示單位為米
km 表示單位為千米
mi 表示單位為英里
ft 表示單位為英尺
(4) 查找附近的元素(給定經緯度和長度)
含義:以給定的經緯度為中心, 返回集合包含的位置元素當中
語法:georadius key longitude latitude radius m|km|mi|ft [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count]
與中心的距離不超過給定最大距離的所有位置元素
通過georadius就可以完成 附近的人功能(例如這個位置我們輸入的是人當前的位置)
withcoord:帶上坐標
withdist:帶上距離,單位與半徑單位相同
count :只顯示前n個(按距離遞增排序)
(5) 查找附近的元素(指定已有成員和長度)
含義:5 與 4 相同,給定的不是經緯度而是集合中的已有成員
語法:GEORADIUSBYMEMBER key member radius…
> georadiusbymember china:city zhuhai 500 km 1) "zhuhai" 2) "guangzhou"(6) 返回一個或多個位置元素的Geohash表示
語法:geohash key member1 [member2…]
> geohash china:city zhuhai 1) "weby8xk63k0"Hyperloglog(基數統計)
HyperLogLog 是用來做**基數(數據集中不重復的元素的個數)**統計的算法,其底層使用string數據類型
HyperLogLog 的優點是:
在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、并且是很小的
花費 12 KB 內存,就可以計算接近 2^64 個不同元素的基數
因為 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個元素
一個常見的例子:
傳統實現,存儲用戶的id,然后每次進行比較。當用戶變多之后這種方式及其浪費空間,而我們的目的只是計數,Hyperloglog就能幫助我們利用最小的空間完成。
(1) 添加
含義:添加指定元素到 HyperLogLog 中
語法:PFADD key element1 [elememt2…]
(2) 估算myelx的基數
含義:返回給定 HyperLogLog 的基數估算值
語法:PFCOUNT key [key]
(3) 合并
含義:將多個 HyperLogLog 合并為一個 HyperLogLog
語法:PFMERGE destkey sourcekey [sourcekey…]
BitMaps(位圖)
BitMaps 使用位存儲,信息狀態只有 0 和 1
Bitma p是一串連續的2進制數字(0或1),每一位所在的位置為偏移(offset),在bitmap上可執行AND,OR,XOR,NOT以及其它位操作
這種類型的應用場景很多,例如統計員工是否打卡,或者登陸未登錄,活躍不活躍,都可以考慮使用此類型
(1) 設置值
含義:為指定key的offset位設置值
語法:setbit key offset value
(2) 獲取
含義:獲取offset位的值
語法:getbit key offset
(3) 統計
含義:統計字符串被設置為1的bit數,也可以指定統計范圍按字節
語法:bitcount key [start end]
批量刪除
scan 0 match keys* count 10000
DEL 123456
總結
以上是生活随笔為你收集整理的Redis 实战案例总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 提取数据库(Postgre
- 下一篇: 海量数据和高并发下的 Redis 业务优