diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,10 @@
 The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html)
 
+## 0.52.7
+### Fixed
+- Fix cache bug when too many transactions in mempool.
+
 ## 0.52.6
 ### Changed
 - Use rationals for Blockchain.info export-history endpoint arithmetics.
diff --git a/haskoin-store.cabal b/haskoin-store.cabal
--- a/haskoin-store.cabal
+++ b/haskoin-store.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 716fc679461e0323aa97a2801b87331bbf5e45555a85e85a844b5a6f553e61ac
+-- hash: 5f0ea1670ea6d31290e445fbdbf155ec7d7383d84e5ba559c87dfb3fbf14266a
 
 name:           haskoin-store
-version:        0.52.6
+version:        0.52.7
 synopsis:       Storage and index for Bitcoin and Bitcoin Cash
 description:    Please see the README on GitHub at <https://github.com/haskoin/haskoin-store#readme>
 category:       Bitcoin, Finance, Network
diff --git a/src/Haskoin/Store/Cache.hs b/src/Haskoin/Store/Cache.hs
--- a/src/Haskoin/Store/Cache.hs
+++ b/src/Haskoin/Store/Cache.hs
@@ -372,16 +372,16 @@
 cacheGetXPubTxs xpub limits =
     case start limits of
         Nothing ->
-            go Nothing
+            go1 Nothing
         Just (AtTx th) -> lift (getTxData th) >>= \case
-            Just TxData {txDataBlock = b@BlockRef {}} ->
-                go $ Just (blockRefScore b)
-            Nothing ->
-                return []
+            Just TxData {txDataBlock = b@BlockRef{}} ->
+                go1 $ Just (blockRefScore b)
+            _ ->
+                go2 th
         Just (AtBlock h) ->
-            go (Just (blockRefScore (BlockRef h maxBound)))
+            go1 (Just (blockRefScore (BlockRef h maxBound)))
   where
-    go score = do
+    go1 score = do
         xs <- runRedis $
             getFromSortedSet
                 (txSetPfx <> encode xpub)
@@ -390,6 +390,21 @@
                 (limit limits)
         touchKeys [xpub]
         return $ map (uncurry f) xs
+    go2 hash = do
+        xs <- runRedis $
+            getFromSortedSet
+                (txSetPfx <> encode xpub)
+                Nothing
+                0
+                0
+        touchKeys [xpub]
+        let xs' = if any ((== hash) . fst) xs
+                  then dropWhile ((/= hash) . fst) xs
+                  else []
+        return
+            $ map (uncurry f)
+            $ take (fromIntegral (limit limits))
+            $ drop (fromIntegral (offset limits)) xs'
     f t s = TxRef {txRefHash = t, txRefBlock = scoreBlockRef s}
 
 cacheGetXPubUnspents ::
@@ -400,16 +415,16 @@
 cacheGetXPubUnspents xpub limits =
     case start limits of
         Nothing ->
-            go Nothing
+            go1 Nothing
         Just (AtTx th) -> lift (getTxData th) >>= \case
-            Just TxData {txDataBlock = b@BlockRef {}} ->
-                go (Just (blockRefScore b))
-            Nothing ->
-                return []
+            Just TxData {txDataBlock = b@BlockRef{}} ->
+                go1 (Just (blockRefScore b))
+            _ ->
+                go2 th
         Just (AtBlock h) ->
-            go (Just (blockRefScore (BlockRef h maxBound)))
+            go1 (Just (blockRefScore (BlockRef h maxBound)))
   where
-    go score = do
+    go1 score = do
         xs <-
             runRedis $
             getFromSortedSet
@@ -419,6 +434,21 @@
                 (limit limits)
         touchKeys [xpub]
         return $ map (uncurry f) xs
+    go2 hash = do
+        xs <- runRedis $
+            getFromSortedSet
+                (utxoPfx <> encode xpub)
+                Nothing
+                0
+                0
+        touchKeys [xpub]
+        let xs' = if any ((== hash) . outPointHash . fst) xs
+                  then dropWhile ((/= hash) . outPointHash . fst) xs
+                  else []
+        return
+            $ map (uncurry f)
+            $ take (fromIntegral (limit limits))
+            $ drop (fromIntegral (offset limits)) xs'
     f o s = (scoreBlockRef s, o)
 
 redisGetXPubBalances :: (Functor f, RedisCtx m f) => XPubSpec -> m (f [XPubBal])
@@ -469,7 +499,13 @@
         ys <- map (\(x, s) -> (, s) <$> decode x) <$> xs
         return (rights ys)
 getFromSortedSet key (Just score) off 0 = do
-    xs <- zrangebyscoreWithscoresLimit key score (1 / 0) (fromIntegral off) (-1)
+    xs <-
+        zrangebyscoreWithscoresLimit
+            key
+            score
+            (1 / 0)
+            (fromIntegral off)
+            (-1)
     return $ do
         ys <- map (\(x, s) -> (, s) <$> decode x) <$> xs
         return (rights ys)
