運行Redis的3.2.1和最新HEDIS庫,我有以下出版商計劃:如何在同一功能中訂閱多個Redis頻道?
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Database.Redis
import Control.Monad
import Control.Concurrent
import Control.Monad.Trans
import Data.ByteString as BS
import System.Posix.Process
import Data.String.Conv
main :: IO()
main = do
conn <- connect defaultConnectInfo
runRedis conn run
run = do
liftIO $ threadDelay $ 1000 * 1000
pid <- liftIO getProcessID
publish "chan1" (toS $ show pid)
publish "chan2" (toS $ show pid)
liftIO $ Prelude.putStrLn "\n\n%%%%%%%\n\nnext\n\n%%%%%%%%\n\n"
run
的用戶看起來是這樣的:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Database.Redis
main :: IO()
main = do
conn <- connect defaultConnectInfo
runRedis conn $ do
pubSub (subscribe ["chan1"]) $ \msg -> do
putStrLn $ "chan1 " ++ show (msgChannel msg) ++ ": " ++ show (msgMessage msg)
return mempty
pubSub (subscribe ["chan2"]) $ \msg -> do
putStrLn $ "chan2" ++ show (msgChannel msg) ++ ": " ++ show (msgMessage msg)
return mempty
輸出是:
%%%%%%%
next
%%%%%%%%
chan1 "chan1": "21542"
%%%%%%%
next
%%%%%%%%
chan1 "chan1": "21542"
%%%%%%%
next
%%%%%%%%
chan1 "chan1": "21542"
%%%%%%%
next
%%%%%%%%
現在看來,只要用戶讀取第一個通道,就不會讀取發送到第二個通道的消息。換句話說,看起來簡單地忽略了訂閱chan2
的命令。
爲了完整起見,這裏是我的Cabal
文件:
name: pub-sub-exp
version: 0.1.0.0
synopsis: Simple project template from stack
description: Please see README.md
homepage: https://github.com/githubuser/pub-sub-exp#readme
license: BSD3
license-file: LICENSE
author: Author name here
maintainer: [email protected]
copyright: 2016 Author name here
category: Web
build-type: Simple
cabal-version: >=1.10
executable pub
hs-source-dirs: src
main-is: Pub.hs
default-language: Haskell2010
build-depends: base >= 4.7 && < 5,
hedis,
mtl,
bytestring,
unix,
string-conv
executable sub
hs-source-dirs: src
main-is: Sub.hs
default-language: Haskell2010
build-depends: base >= 4.7 && < 5,
hedis,
mtl,
bytestring
我使用stack-lts-6.6
。
爲了清楚起見,我想訂戶,以指示消息被髮送到兩個信道1和2
這是Redis的的公知的特性?我是否錯過了一些Haskell的疑難雜症?
嗯...所以這是'hedis'實現的一個未記錄的特徵?或者它是從'redis'繼承的東西? – Zyxoas
有點A列,有點B列。它實際上有文檔記錄(只是不在'pubSub'函數本身中),並且是給定Redis的PubSub語義的有意行爲。查看[Hackage上的''hedis'包](http://hackage.haskell.org/package/hedis)的描述中的** Enforced Pub/Sub語義**部分。 –
雖然@ ErikR的答案是正確的 - 因爲它解釋了使用源代碼爲什麼這種行爲是如此 - 這個答案實際上解釋了更高級別的行爲,並給出了代碼片段以獲得期望的結果。所以我會接受這個。 謝謝。 – Zyxoas