背景:
偽**實現與內容剖析:
public
class
continue
break;}
system.out.
println
("連續簽到的天數:"
+ continuousday)
;// 方案二:
// redis key的存在過期值,
// 分析發現,需要統計的是使用者連續簽到,所以給使用者簽到的key設定過期時間,直接記錄連續簽到的次數,免去了計算的麻煩和時間消耗
// 過期值為本次簽到到下一使用者可以連續簽到的時間,
// 注意這裡的連續簽到,連續簽到指的是使用者每次可簽到的日期內都完成了簽到,
// 採用和上述方案不同的儲存結構,直接採用 key-val的形式,呼叫jedis的 set api
// 使用者水滴簽到資料:
// key val(連續簽到的天數) expire(修改本次簽到到下次可以簽到為止)
// water:uid:$ 3 24 * 60 * 60s
// 使用者油滴簽到資料:
// key val(連續簽到的天數) expire(修改本次簽到到下次可以簽到為止)
// oil:uid:$ 3 24 * 60 * 60s
///**
redis.call("incr",keys[1])
if redis.call("get", keys[1]) == ar**[1] then
return redis.call("del", keys[1])
else
return 0
end*/
string waterkey =
"water:uid:"+1
; string oilkey =
"oil:uid:"+1
; jedis jedis=
newjedis()
;// 簽到動作觸發後,寫入資料
// 執行lua指令碼
stringbuilder luascript =
newstringbuilder()
; luascript.
("redis.call('incr',keys[1])").
("redis.call('expire', keys[1], ar**[1])");
list
keys =
newarraylist
<
>()
; keys.
add(waterkey)
; list
ar**s =
newarraylist
<
>()
; localdatetime now = localdatetime.
now();
// 計算過期時間
int expire =(48
- localdatetime.
now().
gethour()
)*3600
; ar**s.
add(string.
valueof
(expire));
jedis.
eval
(luascript.
tostring()
, keys, ar**s)
;// 讀取簽到天數
string continuewaterdays = jedis.
get(waterkey)
; string continueoildays = jedis.
get(oilkey);}
}
上述的偽**只是簡單的過程計算,在這個過程中,並沒有使用到持久化儲存,redis的高併發效能,以及內容儲存的特點,可以快速地完成資料的獲取和計算,相比於讀取磁碟中(例如:mysql)的資料,更加的快速與高效。當然我們需要對每乙個使用者的領取記錄,連簽天數,領取時間,獎勵資料等都需要持久備份,以便於後續業務中的問題篩查與追溯。 關於流暢使用者體驗的思考
週末無事做了個簡單的 ocr小工具 從文字截圖中提取和識別字元。處理物件是標準字型的影象,沒有ocr 通常要面對的光照,破損,扭曲等問題,幾乎不用任何預處理,因此演算法是簡單明瞭的 先二值化,橫向縱向投影分割字元,再用模板匹配進行字元識別。因為打算做成乙個可用的工具而不僅僅是演算法 所以沒用 mat...
業務功能設計時關於擴充套件性和最小功能原則的思考
最近遇到乙個迷惑,產品的需求是已配貨,已發貨,已簽收的訂單可以售後退款,在實現介面的時候,我做了check,只能是已配貨,已發貨,已簽收的才能退款,後來又在思考,這樣寫死,shib是不是沒有擴充套件性,雖然符合了最小功能設計了,但是有一天產品說,配貨中的也能退貨,是不是就是需求修改 擴充套件性就不好...
有關於使用者體驗的一些總結
首先分享一句話 使用者是沒有錯的,如果使用者在使用某物品的時候遇到麻煩,那是因為設計出了問題。諾曼 設計心理學 認識使用者 使用者永遠都沒有錯。使用者都是特別忙,特別沒有耐心的人。使用者永遠都比你想象的聰明。使用者體驗對產品的重要性 不論使用者訪問的是什麼型別產品,都是乙個自助的行為。他們所能依靠的...