Redis開發、管理實戰

来源:https://www.cnblogs.com/hwlong/archive/2018/07/18/9331029.html
-Advertisement-
Play Games

一、數據類型 二、全局Key操作 例子 三、String(字元串) 應用場景 String類型有如下基本操作 普通鍵值對操作 計數器 詳細示例 增 刪 改 查 四、Hash(字典) 應用場景 示例 存數據 取數據 詳細示例 增 刪 改 查 五、LIST(列表) 應用場景 簡單示例 更多示例 增 刪 ...


一、數據類型

String :       字元類型
Hash:         字典類型
List:           列表     
Set:           集合 
Sorted set: 有序集合

二、全局Key操作

KEYS *                 查看KEY支持通配符
DEL                    刪除給定的一個或多個key
EXISTS                 檢查是否存在
RENAME                 變更KEY名
SORT                 鍵值排序,有非數字時報錯
TYPE                    返回鍵所存儲值的類型
DUMP RESTORE            序例化與反序列化
EXPIRE\ PEXPIRE         以秒\毫秒設定生存時間
TTL\ PTTL                 以秒\毫秒為單位返回生存時間
PERSIST                 取消生存實現設置
RANDOMKEY             返回資料庫中的任意鍵

例子

127.0.0.1:6379> set name zhangsan 
127.0.0.1:6379> EXPIRE name 60
(integer) 1
127.0.0.1:6379> ttl name
(integer) 57
127.0.0.1:6379> set a b ex 60
OK
127.0.0.1:6379> ttl a
127.0.0.1:6379> PERSIST a
(integer) 1
127.0.0.1:6379> ttl a
(integer) -1

三、String(字元串)

string是redis最基本的類型,一個key對應一個value。一個鍵最大能存儲512MB。

應用場景

常規計數:微博數、粉絲數等。

String類型有如下基本操作

set
get
incr
incrby
decr
decrby
mset
mget
append
getset
setex
setnx
del
setrange
strlen
getrange 

普通鍵值對操作

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> mset id 101 name zhangsan age 20 gender m
OK
127.0.0.1:6379> keys *
1) "name"
2) "id"
3) "xyz"
4) "jishu"
5) "age"
6) "gender"
127.0.0.1:6379> mget id name age gender
1) "101"1set name zhangsan     
(2)
 MSET id 101 name zhangsan age 20 gender m
 等價於以下操作:
 SET id 101 
 set name zhangsan 
 set age 20 
 set gender m

計數器

每點一次關註,都執行以下命令一次
127.0.0.1:6379> incr num
顯示粉絲數量:
127.0.0.1:6379> get num

暗箱操作:
127.0.0.1:6379> INCRBY num 10000
(integer) 10006
127.0.0.1:6379> get num
"10006"
127.0.0.1:6379> DECRBY num 10000
(integer) 6
127.0.0.1:6379> get num
"6"

詳細示例

set mykey "test"                  為鍵設置新值,並覆蓋原有值
getset mycounter 0                設置值,取值同時進行
setex mykey 10 "hello"            設置指定 Key 的過期時間為10秒,在存活時間可以獲取value
setnx mykey "hello"               若該鍵不存在,則為鍵設置新值
mset key3  "zyx"  key4 "xyz"      批量設置鍵

del mykey                           刪除已有鍵

append mykey "hello"              若該鍵並不存在,返回當前 Value 的長度
                                  該鍵已經存在,返回追加後 Value的長度
incr mykey                        值增加1,若該key不存在,創建key,初始值設為0,增加後結果為1
decrby  mykey  5                  值減少5
setrange mykey 20 dd              把第21和22個位元組,替換為dd, 超過value長度,自動補0

exists mykey                      判斷該鍵是否存在,存在返回 1,否則返回0
get mykey                         獲取Key對應的value
strlen mykey                      獲取指定 Key 的字元長度
ttl mykey                         查看一下指定 Key 的剩餘存活時間(秒數)
getrange mykey 1 20               獲取第2到第20個位元組,若20超過value長度,則截取第2個和後面所有的
mget key3 key4                    批量獲取鍵

四、Hash(字典)

 我們可以將Redis中的Hashes類型看成具有String Key和String Value的map容器。
 所以該類型非常適合於存儲值對象的信息。如Username、Password和Age等。如果Hash中包含很少的欄位,那麼該類型的數據也將僅占用很少的磁碟空間。每一個Hash可以存儲4294967295個鍵值對。

hset
hsetnx
hmset
hdel
del
hincrby
hget
hmget
hlen
hexists
hgetall
hkeys
hvals

應用場景

存儲部分變更的數據,如用戶信息等。最接近MySQL表結構的一種類型

示例

存數據

hmset stu  id 101 name zhangsan age 20 gender m
hmset stu1 id 102 name zhangsan1 age 21 gender f

取數據

HMGET stu id name age gender
HMGET stu1 id name age gender

詳細示例

hset myhash field1 "s"    
若欄位field1不存在,創建該鍵及與其關聯的Hashes, Hashes中,key為field1 ,並設value為s ,若存在會覆蓋原value
hsetnx myhash field1 s    
若欄位field1不存在,創建該鍵及與其關聯的Hashes, Hashes中,key為field1 ,並設value為s, 若欄位field1存在,則無效
hmset myhash field1 "hello" field2 "world       一次性設置多個欄位

hdel myhash field1                       刪除 myhash 鍵中欄位名為 field1 的欄位
del myhash                          刪除鍵

hincrby myhash field 1                  給field的值加1

hget myhash field1                       獲取鍵值為 myhash,欄位為 field1 的值
hlen myhash                           獲取myhash鍵的欄位數量
hexists myhash field1                     判斷 myhash 鍵中是否存在欄位名為 field1 的欄位
hmget myhash field1 field2 field3              一次性獲取多個欄位
hgetall myhash                           返回 myhash 鍵的所有欄位及其值
hkeys myhash                          獲取myhash 鍵中所有欄位的名字
hvals myhash                           獲取 myhash 鍵中所有欄位的值

五、LIST(列表) 

LIST類型是按照插入順序排序的字元串鏈表。和數據結構中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。在插入時,如果該鍵並不存在,Redis將為該鍵創建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那麼該鍵也將會被從資料庫中刪除。List中可以包含的最大元素數量是4294967295。

lpush
lpushx
linsert
rpush 
rpushx
rpoplpush
del
lrem
ltrim
lset
rpoplpush
lrange
lpop 
lindex

應用場景

消息隊列系統
比如sina微博: 在Redis中我們的最新微博ID使用了常駐緩存,這是一直更新的。但是做了限制不能超過5000個ID,因此獲取ID的函數會一直詢問Redis。只有在start/count參數超出了這個範圍的時候,才需要去訪問資料庫。 系統不會像傳統方式那樣“刷新”緩存,Redis實例中的信息永遠是一致的。SQL資料庫(或是硬碟上的其他類型資料庫)只是在用戶需要獲取“很遠”的數據時才會被觸發,而主頁或第一個評論頁是不會麻煩到硬碟上的資料庫了。

簡單示例

127.0.0.1:6379> LPUSH wechat "today is nice day !"

127.0.0.1:6379> LPUSH wechat "today is bad day !"

127.0.0.1:6379> LPUSH wechat "today is good  day !"

127.0.0.1:6379> LPUSH wechat "today is rainy  day !"

127.0.0.1:6379> LPUSH wechat "today is friday !"

[e,d,c,b,a]
0 1 2 3  4

127.0.0.1:6379> lrange wechat  0 0
1) "today is friday !"
127.0.0.1:6379> lrange wechat  0 1
1) "today is friday !"
2) "today is rainy  day !"
127.0.0.1:6379> lrange wechat  0 2
1) "today is friday !"
2) "today is rainy  day !"
3) "today is good  day !"
127.0.0.1:6379> lrange wechat  0 3
lrange wechat  0 -1
127.0.0.1:6379> lrange wechat  -2 -1
1) "today is bad day !"
2) "today is nice day !"

更多示例

lpush mykey a b              若key不存在,創建該鍵及與其關聯的List,依次插入a ,b, 若List類型的key存在,則插入value中
lpushx mykey2 e              若key不存在,此命令無效, 若key存在,則插入value中
linsert mykey before a a1      在 a 的前面插入新元素 a1
linsert mykey after e e2       在e 的後面插入新元素 e2
rpush mykey a b             在鏈表尾部先插入b,在插入a
rpushx mykey e              若key存在,在尾部插入e, 若key不存在,則無效
rpoplpush mykey mykey2       將mykey的尾部元素彈出,再插入到mykey2 的頭部(原子性的操作)

del mykey                  刪除已有鍵 
lrem mykey 2 a               從頭部開始找,按先後順序,值為a的元素,刪除數量為2個,若存在第3個,則不刪除
ltrim mykey 0 2              從頭開始,索引為0,1,2的3個元素,其餘全部刪除

lset mykey 1 e               從頭開始, 將索引為1的元素值,設置為新值 e,若索引越界,則返回錯誤信息
rpoplpush mykey mykey          將 mykey 中的尾部元素移到其頭部

lrange mykey 0 -1          取鏈表中的全部元素,其中0表示第一個元素,-1表示最後一個元素。
lrange mykey 0 2            從頭開始,取索引為0,1,2的元素
lrange mykey 0 0            從頭開始,取第一個元素,從第0個開始,到第0個結束
lpop mykey                  獲取頭部元素,並且彈出頭部元素,出棧
lindex mykey 6              從頭開始,獲取索引為6的元素 若下標越界,則返回nil 

六、SET(集合)

Set類型看作為沒有排序的字元集合。Set可包含的最大元素數量是4294967295。如果多次添加相同元素,Set中將僅保留該元素的一份拷貝。

sadd
spop
srem
smove
sismember
smembers 
scard
srandmember
sdiff
sdiffstore
sinter
sinterstore
sunion
sunionstore

 應用場景

案例: 在微博應用中,可以將一個用戶所有的關註人存在一個集合中,將其所有粉絲存在一個集合。Redis還為集合提供了求交集、並集、差集等操作,可以非常方便的實現如共同關註、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。
127.0.0.1:6379> sadd lxl jnl pgone ms mr lxlmami lxlbb baoqiang
(integer) 7
127.0.0.1:6379> sadd jnl lxl baoqiang huangbo xuzheng baodi
(integer) 5
127.0.0.1:6379> smembers lxl
1) "jnl"
2) "baoqiang"
3) "lxlbb"
4) "lxlmami"
5) "mr"
6) "pgone"
7) "ms"
127.0.0.1:6379> smembers jnl
1) "baoqiang"
2) "xuzheng"
3) "huangbo"
4) "lxl"
5) "baodi"
127.0.0.1:6379> SINTER lxl jnl
1) "baoqiang"
127.0.0.1:6379> SUNION lxl jnl
 1) "xuzheng"
 2) "mr"
 3) "ms"
 4) "pgone"
 5) "jnl"
 6) "baoqiang"
 7) "lxlbb"
 8) "huangbo"
 9) "baodi"
10) "lxlmami"
11) "lxl"
127.0.0.1:6379> Sdiff  lxl jnl
1) "pgone"
2) "lxlmami"
3) "lxlbb"
4) "mr"
5) "ms"
6) "jnl"
127.0.0.1:6379> Sdiff  jnl  lxl 
1) "baodi"
2) "xuzheng"
3) "huangbo"
4) "lxl"

簡單示例

更多示例

sadd myset a b c  
若key不存在,創建該鍵及與其關聯的set,依次插入a ,b,若key存在,則插入value中,若a 在myset中已經存在,則插入了 d 和 e 兩個新成員。

spop myset              尾部的b被移出,事實上b並不是之前插入的第一個或最後一個成員
srem myset a d f          若f不存在, 移出 a、d ,並返回2

smove myset myset2 a        將a從 myset 移到 myset2,

sismember myset a            判斷 a 是否已經存在,返回值為 1 表示存在。
smembers myset            查看set中的內容
scard myset                獲取Set 集合中元素的數量
srandmember myset          隨機的返回某一成員
sdiff myset1 myset2 myset3      1和2得到一個結果,拿這個集合和3比較,獲得每個獨有的值
sdiffstore diffkey myset myset2 myset3      3個集和比較,獲取獨有的元素,並存入diffkey 關聯的Set中
sinter myset myset2 myset3               獲得3個集合中都有的元素
sinterstore interkey myset myset2 myset3  把交集存入interkey 關聯的Set中
sunion myset myset2 myset3               獲取3個集合中的成員的並集
sunionstore unionkey myset myset2 myset3  把並集存入unionkey 關聯的Set中

七、SortedSet(有序集合)

Sorted-Sets中的每一個成員都會有一個分數(score)與之關聯,Redis正是通過分數來為集合中的成員進行從小到大的排序。成員是唯一的,但是分數(score)卻是可以重覆的。

zadd 
zrem 
zincrby
zrange
zrank
zcard
zcount
zscore
zrangebyscore
zremrangebyscore
zremrangebyrank
zrevrange
zrevrangebyscore 
zrevrangebyscore

應用場景

排行榜應用,取TOP N操作 這個需求與上面需求的不同之處在於,前面操作以時間為權重,這個是以某個條件為權重,比如按頂的次數排序,這時候就需要我們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只需要執行一條ZADD命令即可。

簡單示例

127.0.0.1:6379> ZADD phb 1000 timian 2000 "thatgirl" 3000 "nida" 4000 "dawang"
(integer) 4
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> ZREVRANGE phb 0 -1 
1) "dawang"
2) "nida"
3) "thatgirl"
4) "timian"
127.0.0.1:6379> ZREVRANGE phb 0 -1  withscores
1) "dawang"
2) "4000"
3) "nida"
4) "3000"
5) "thatgirl"
6) "2000"
7) "timian"
8) "1000"

127.0.0.1:6379> ZINCRBY phb 100000 timian 
"101000"
127.0.0.1:6379> ZREVRANGE phb 0 -1  withscores
1) "timian"
2) "101000"
3) "dawang"
4) "4000"
5) "nida"
6) "3000"
7) "thatgirl"
8) "2000"

127.0.0.1:6379> ZINCRby    phb  1 nida 
示例

更多示例

zadd myzset 2 "two" 3 "three"           添加兩個分數分別是 23 的兩個成員

zrem myzset one two                  刪除多個成員變數,返回刪除的數量

zincrby myzset 2 one                  將成員 one 的分數增加 2,並返回該成員更新後的分數

zrange myzset 0 -1 WITHSCORES          返回所有成員和分數,不加WITHSCORES,只返回成員
zrank myzset one                   獲取成員one在Sorted-Set中的位置索引值。0表示第一個位置
zcard myzset                        獲取 myzset 鍵中成員的數量
zcount myzset 1 2                   獲取分數滿足表達式 1 <= score <= 2 的成員的數量
zscore myzset three                  獲取成員 three 的分數
zrangebyscore myzset  1 2               獲取分數滿足表達式 1 < score <= 2 的成員
#-inf 表示第一個成員,+inf最後一個成員
#limit限制關鍵字
#2  3  是索引號
zrangebyscore myzset -inf +inf limit 2 3  返回索引是2和3的成員
zremrangebyscore myzset 1 2           刪除分數 1<= score <= 2 的成員,並返回實際刪除的數量
zremrangebyrank myzset 0 1              刪除位置索引滿足表達式 0 <= rank <= 1 的成員
zrevrange myzset 0 -1 WITHSCORES           按位置索引從高到低,獲取所有成員和分數
#原始成員:位置索引從小到大
      one  0  
      two  1
#執行順序:把索引反轉
      位置索引:從大到小
      one 1
      two 0
#輸出結果: two  
       one
zrevrange myzset 1 3                  獲取位置索引,為1,2,3的成員
#相反的順序:從高到低的順序
zrevrangebyscore myzset 3 0              獲取分數 3>=score>=0的成員並以相反的順序輸出
zrevrangebyscore myzset 4 0 limit 1 2      獲取索引是1和2的成員,並反轉位置索引

八、生產消費模型

消息模型

Redis發佈消息通常有兩種模式:
一、隊列模式(queuing)
二、發佈-訂閱模式(publish-subscribe)
任務隊列:故名思義,就是"傳遞消息的隊列"。與任務隊列進行交互的實體有兩類,一類是生產者(producer),另一類則是消費者(consumer)。生產者將需要處理的任務放入任務隊列中,而消費者則不斷地從任務獨立中讀入任務信息並執行。
任務隊列的好處:
一、松耦合。
生產者和消費者只需要按照約定的任務描述格式,進行編寫代碼。
二、易於擴展
多消費者模式下,消費者可以分佈在多個不同的伺服器中,由此降低單台伺服器的負載。

Redis發佈訂閱

其實從Pub/Sub的機制來看,它更像是一個廣播系統,多個Subscriber可以訂閱多個Channel,多個Publisher可以往多個Channel中發佈消息。可以這麼簡單的理解:
一、Subscriber:收音機,可以收到多個頻道,並以隊列方式顯示
二、Publisher:電臺,可以往不同的FM頻道中發消息
三、Channel:不同頻道的FM頻道

發佈訂閱實踐

PUBLISH channel msg
    將信息 message 發送到指定的頻道 channel 
SUBSCRIBE channel [channel ...]
    訂閱頻道,可以同時訂閱多個頻道
UNSUBSCRIBE [channel ...]
    取消訂閱指定的頻道, 如果不指定頻道,則會取消訂閱所有頻道
PSUBSCRIBE pattern [pattern ...]
    訂閱一個或多個符合給定模式的頻道,每個模式以 * 作為匹配符,比如 it* 匹配所    有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有    以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類
PUNSUBSCRIBE [pattern [pattern ...]]
    退訂指定的規則, 如果沒有參數則會退訂所有規則
PUBSUB subcommand [argument [argument ...]]
    查看訂閱與發佈系統狀態
註意:使用發佈訂閱模式實現的消息隊列,當有客戶端訂閱channel後只能收到後續發佈到該頻道的消息,之前發送的不會緩存,必須Provider和Consumer同時線上。

發佈訂閱例子

視窗1:

127.0.0.1:6379> SUBSCRIBE baodi 

視窗2:

127.0.0.1:6379> PUBLISH baodi "jin tian zhen kaixin!"

訂閱多頻道:
視窗1:
127.0.0.1:6379> PSUBSCRIBE wang*
視窗2:
127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou "

消息隊列系統對比

客戶端在執行訂閱命令之後進入了訂閱狀態,只能接收 SUBSCRIBE 、PSUBSCRIBE、 UNSUBSCRIBE 、PUNSUBSCRIBE 四個命令。 開啟的訂閱客戶端,無法收到該頻道之前的消息,因為 Redis 不會對發佈的消息進行持久化。 和很多專業的消息隊列系統(例如Kafka、RocketMQ)相比,Redis的發佈訂閱略顯粗糙,例如無法實現消息堆積和回溯。但勝在足夠簡單,如果當前場景可以容忍的這些缺點,也不失為一個不錯的選擇。 

九、Redis事務管理

redis中的事務跟關係型資料庫中的事務是一個相似的概念,但是有不同之處。關係型資料庫事務執行失敗後面的SQL語句不在執行,而redis中的一條命令執行失敗,其餘的命令照常執行。
redis開始一個事務使用multi,相當月begin\start transaction,exec提交事務,discard取消隊列命令(非回滾操作)。

 

MySQL

Redis

開啟

start transaction/begin

multi

語句

普通SQL

普通命令

失敗

rollback 回滾

discard 取消(不叫回滾,是隊列裡面的命令不執行,隊列裡面的任務根本就沒有執行。而不是執行了也可以撤回來)

成功

commit

exec

事務命令

  • DISCARD
取消事務,放棄執行事務塊內的所有命令。
  • EXEC
執行所有事務塊內的命令。
  • MULTI
標記一個事務塊的開始。
  • UNWATCH
取消WATCH命令對所有key的監視。
  • WATCH key [key ...]
監視一個(或多個)key,如果在事務執行之前這個(或這些)key被其他命令所改動,那麼事務將被打斷。

示例

開啟事務功能時(multi)
multi 
command1      
command2
command3
command4

4條語句作為一個組,並沒有真正執行,而是被放入同一隊列中。
如果,這是執行discard,會直接丟棄隊列中所有的命令,而不是做回滾。

exec
當執行exec時,對列中所有操作,要麼全成功要麼全失敗


----------
127.0.0.1:6379> set a b
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set a b
QUEUED
127.0.0.1:6379> set c d
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK

Redis中事務中的鎖機制

舉例:我正在買票
Ticket -1,money -100
而票只有1張,如果在我multi之後,和exec之前,票被別人買了---即ticket編程0了.
我該如何觀察這種情景,並不在提交
悲觀的想法:
世界充滿危險,肯定有人和我搶,給ticket上鎖,只有我能操作.[悲觀鎖]
樂觀的想法:
沒有那麼多人和我搶,因此,我只需要註意,--有沒有人更改ticket的值就可以了[樂觀鎖]
Redis的事務中,啟用的是樂觀鎖,只負責監測key沒有給改動。

watch命令

具體的命令----  watch命令
例: 
redis 127.0.0.1:6379> watch ticket
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
//現在已經對ticket進行了監控,另外一個視窗將ticket改動了
另一個視窗:> decr ticket    
redis 127.0.0.1:6379> exec
(nil)   // 返回nil,說明監視的ticket已經改動了,事務就取消了.隊列就不執行了。
redis 127.0.0.1:6379>mget ticket money
"0"
"200"

watch key1 key2  ... keyN
作用:監聽key1 key2..keyN有沒有變化,如果任意一個有變, 則事務取消
unwatch 
作用: 取消所有watch監聽

十、伺服器管理命令

Info
Clinet list
Client kill ip:port
config get *
CONFIG RESETSTAT 重置統計
CONFIG GET/SET 動態修改
Dbsize
FLUSHALL 清空所有數據 
select 1
FLUSHDB 清空當前庫
MONITOR 監控實時指令
SHUTDOWN 關閉伺服器
save將當前數據保存
SLAVEOF host port 主從配置
SLAVEOF NO ONE
SYNC 主從同步
ROLE返回主從角色

十一、慢日誌查詢

Slow log 是 Redis 用來記錄查詢執行時間的日誌系統。
slow log 保存在記憶體裡面,讀寫速度非常快
可以通過改寫 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令對它們動態地進行修改
slowlog-log-slower-than 10000 超過多少微秒
CONFIG SET slowlog-log-slower-than 100
CONFIG SET slowlog-max-len 1000 保存多少條慢日誌
CONFIG GET slow*
SLOWLOG GET
SLOWLOG RESET

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 線程介紹 Intro 20世紀60年代人們提出了進程的概念,到20世紀80年代中期人們提出了比進程更小的能獨立運行的基本單位——線程,試圖用它來提高系統內程式併發執行的程度從而進一步提高系統的吞吐量。 線程具有傳統進程所具有的特征,所以稱之為輕型進程或進程元,相應的把傳統進程稱之為重型進程。 一個進 ...
  • 進程是操作系統為了提高系統的併發處理能力,為瞭解決可以“同時”運行多個程式且為了對併發執行的程式加以描述和控制而提出來的。 ...
  • ElasticSearch 學習筆記 Near Realtime(NRT):近實時,先說實時就是數據創建到查詢時間在毫秒級或更少; 和實時不一樣的是近實時數據在創建到查詢最多需要n秒時間,n秒是索引刷新周期(假如設置n為5秒,若你在2秒的時候插入了一條數據,那麼你還需要等3秒才能查詢到這條數據,... ...
  • 占座 ...
  • 一、ORC File文件結構 ORC的全稱是(Optimized Row Columnar),ORC文件格式是一種Hadoop生態圈中的列式存儲格式,它的產生早在2013年初,最初產生自Apache Hive,用於降低Hadoop數據存儲空間和加速Hive查詢速度。和Parquet類似,它並不是一個 ...
  • SQL ROUND函數是對數據進行制定精度的取值。 第一個參數是取值的數據,第二個參數是精度,第三個參數是數據取值模式(四捨五入還是截斷),其中第三個參數是可選參數,預設是四捨五入模式。 從上面結果可以看出,數據並非只保留兩位小數,而是保留兩位有效小數。 從上面兩次可以看出,預設不使用第三個參數是四 ...
  • mysql資料庫是一個常用的關係型資料庫 關係型資料庫核心元素有哪些? 主鍵:特殊欄位,用來唯一標識記錄的唯一性 欄位:數據列 記錄:數據行 數據表:數據行的集合 資料庫:數據表的集合 安裝、啟動、停止、重啟mysql伺服器的命令 安裝:sudo apt-get install mysql-serv ...
  • 一、主從複製 使用非同步複製 一個伺服器可以有多個從伺服器 從伺服器也可以有自己的從伺服器 複製功能不會阻塞主伺服器 可以通過服務功能來上主伺服器免於持久化操作,由從伺服器去執行持久化操作即可。 以下是關於Redis複製功能的幾個重要方面: Redis使用非同步複製。從Redis 2.8開始,從伺服器會 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...