在 用 Sinatra 實作簡單的夢幻筆名 API 這一篇,
每次query原網站來回應的方式,有點辛苦了原網站,
所以改良成,也可存在自己的 redis 裡,
而從自己的網站來查詢。
這次改良的目標是,
平常存取夢幻筆名在自己的redis,
若覺得自己存的筆名不夠多,再向原網站抓一些回來。
先做一個摘要目前本地存有多少筆名,
就是計算novelname裡有多少個元素。
def summary
nnames = ($redis.scard 'novelname')
"本地夢幻筆名有 #{nnames} 筆"
end
而原來存取原筆名網站的程式,
本來是直接回應,而改為存到redis裡,
而每次存取的筆名可能會有重覆,
存在集合裡就不用管重覆的問題。
def more_novel_name
url = "http://www.richyli.com/name/novel.asp"
body = get_utf8_body(url)
names = (body.split("\r\n")[52]).strip.gsub(/。/,'').split('、')
names.each{|n| push_to_sets('novelname', n)}
return names
end
什麼是 push_to_sets?
def push_to_sets(key,value)
$redis.sadd key,value
end
只是把值加到redis的key裡。
而要查取筆名,改為從本地的redis來抓,
並且可指定抓幾個,每次都重新排列抓取
沒指定就只抓五個:
def rand_novelname(n=5)
($redis.smembers 'novelname').shuffle[0..n-1]
end