日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis 实战案例总结

發布時間:2023/12/9 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

不存在,則創建
存在,則失敗

> setnx address guangdong # address鍵 不存在,則創建 (integer) 1 > get address "guangdong" > setnx address beijing # address鍵 存在,則失敗 (integer) 0 > get address "guangdong"

(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}

> mset user:1:name lisi user:1:age 25 OK > mget user:1:name user:1:age 1) "lisi" 2) "25"

(12) 先 get 后 set
語法:getset
先取到原來的值,然后再把新值覆蓋,如果原先沒有值返回 nil

> getset addr beijing # 原先沒有值,返回 nil (nil) > get addr "beijing" > getset addr guangdong # 原先有值,返回原先的值,然后覆蓋新值 "beijing" > get addr "guangdong"

列表類型 - list

(1) 添加
A:從左或從右添加元素

lpush key value:將元素添加到列表左邊
Rpush key value:將元素添加到列表右邊

> lpush list1 A (integer) 1 > lpush list1 B (integer) 2 > lpush list1 C (integer) 3 > lrange list1 0 -1 1) "C" 2) "B" 3) "A"

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:刪除列表最右邊的元素,且返回元素

> lrange list1 0 -1 1) "D" 2) "C" 3) "B" 4) "A"> lpop list1 # 刪除列表最左邊的元素,且返回元素 "D" > rpop list1 # 刪除列表最右邊的元素,且返回元素 "A"> lrange list1 0 -1 1) "C" 2) "B"

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

> exists list1 # 判斷是否存在此list (integer) 0 > lset list1 0 beijing # 不存在,替換報錯 (error) ERR no such key> lpush list1 guangdong # 創建一個list (integer) 1 > lindex list1 0 "guangdong"> lset list1 0 beijing # 存在,替換成功 OK > lindex list1 0 "beijing"

集合類型 - 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) 3

C:隨機獲取元素

語法: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:差集

> sadd set1 A (integer) 1 > sadd set1 B (integer) 1 > sadd set1 C (integer) 1> sadd set2 B (integer) 1 > sadd set2 C (integer) 1 > sadd set2 D (integer) 1 > sadd set2 E (integer) 1> sinter set1 set2 # 交集 1) "B" 2) "C" > sunion set1 set2 # 并集 1) "D" 2) "E" 3) "C" 4) "B" 5) "A" > sdiff set1 set2 # 差集 1) "A"

有序集合類型 - 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:從大到小

> zrangebyscore sortedset1 -inf +inf # 從小到大 1) "lisi" 2) "zhangsan" 3) "wangwu"> zrevrange sortedset1 0 -1 # 從大到小 1) "wangwu" 2) "zhangsan" 3) "lisi"

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) 2

E:獲取指定區間成員數量

語法: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) 1

B:不存在才可以添加

語法: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) 2

D:只獲取所有 field 或 value

hkeys hash:獲取所有 field 字段
hvals hash:獲取所有 value 值

> hkeys hash1 # 獲取所有 field 字段 1) "username" 2) "password"> hvals hash1 # 獲取所有 value 值 1) "admin" 2) "admin"

(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 表示單位為英尺

> geodist china:city guangzhou taiyuan "1641074.3783" > geodist china:city guangzhou taiyuan km "1641.0744"

(4) 查找附近的元素(給定經緯度和長度)
含義:以給定的經緯度為中心, 返回集合包含的位置元素當中

語法:georadius key longitude latitude radius m|km|mi|ft [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count]

與中心的距離不超過給定最大距離的所有位置元素
通過georadius就可以完成 附近的人功能(例如這個位置我們輸入的是人當前的位置)
withcoord:帶上坐標
withdist:帶上距離,單位與半徑單位相同
count :只顯示前n個(按距離遞增排序)

> georadius china:city 113.582555 22.276565 500 km 1) "zhuhai" 2) "guangzhou" > georadius china:city 113.582555 22.276565 500 km withdist withcoord count 1 1) 1) "zhuhai"2) "0.0002"3) 1) "113.58255296945571899"2) "22.27656546780746538"> georadius china:city 113.582555 22.276565 500 km withdist withcoord count 2 1) 1) "zhuhai"2) "0.0002"3) 1) "113.58255296945571899"2) "22.27656546780746538" 2) 1) "guangzhou"2) "100.7111"3) 1) "113.27143281698226929"2) "23.13533660075498233"

(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…]

> pfadd test1 A B C D E F G (integer) 1 > pfadd test2 C C C D E F G (integer) 1

(2) 估算myelx的基數
含義:返回給定 HyperLogLog 的基數估算值
語法:PFCOUNT key [key]

> pfcount test1 (integer) 7 > pfcount test2 (integer) 5

(3) 合并
含義:將多個 HyperLogLog 合并為一個 HyperLogLog
語法:PFMERGE destkey sourcekey [sourcekey…]

> pfmerge test test1 test2 OK > pfcount test (integer) 9

BitMaps(位圖)

BitMaps 使用位存儲,信息狀態只有 0 和 1

Bitma p是一串連續的2進制數字(0或1),每一位所在的位置為偏移(offset),在bitmap上可執行AND,OR,XOR,NOT以及其它位操作
這種類型的應用場景很多,例如統計員工是否打卡,或者登陸未登錄,活躍不活躍,都可以考慮使用此類型

(1) 設置值

含義:為指定key的offset位設置值
語法:setbit key offset value

> setbit sign 0 1 (integer) 0 > setbit sign 1 0 (integer) 0 > setbit sign 2 0 (integer) 0 > setbit sign 3 0 (integer) 0 > setbit sign 4 1 (integer) 0 > setbit sign 5 1 (integer) 0 > setbit sign 6 1 (integer) 0

(2) 獲取

含義:獲取offset位的值
語法:getbit key offset

> getbit sign 4 (integer) 1 > getbit sign 2 (integer) 0

(3) 統計

含義:統計字符串被設置為1的bit數,也可以指定統計范圍按字節
語法:bitcount key [start end]

> bitcount sign (integer) 4

批量刪除

scan 0 match keys* count 10000
DEL 123456

總結

以上是生活随笔為你收集整理的Redis 实战案例总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。