Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 49

0
votes
answers
38 views
+10

Azure Redis緩存授權標頭

0

我正在研究Azure Redis緩存,並且我正在使用REST API來創建緩存。我得到的迴應是:Azure Redis緩存授權標頭

HTTP/1.1 401 Unauthorized 
{ 
    "error": { 
    "code": "AuthenticationFailed", 
    "message": "Authentication failed. The 'Authorization' header is missing." 
    } 
} 

我在文檔中找不到任何Authorization header。有人可以建議生成授權標題的過程嗎?

+0

嘿@Cylian。你可以幫助我與授權頭部分? – badcoder29

+0

我猜你試圖使用此鏈接創建Redis緩存帳戶 - https://docs.microsoft.com/en-us/rest/api/redis/Redis/Create? –

+0

@GauravMantri是的,我使用相同的鏈接。我正在嘗試使API調用來設置緩存。但它要求授權標題。我不知道如何生成它? – badcoder29

沙发
0
0

基本上創建Azure Redis Cache帳戶操作是Azure Resource Manager (ARM)操作。每個ARM操作都需要一個authorization標頭,該標頭必須包含在請求中。由於您未在請求中包含此標頭,因此您收到此錯誤。

有關如何驗證您的ARM API請求的詳細說明,請參閱Resource Manager REST APIs

0
votes
answers
45 views
+10

爲什麼1!= 1返回true?

-5
if (responseEntity.getBody().getMeta().getCode() != ApiExceptionEnum.SUCCESS.code()) { 
    return null; 
} 

這樣的代碼,爲什麼1!= 1返回true?

responseEntity.getBody().getMeta().getCode() -> Integer 1 
ApiExceptionEnum.SUCCESS.code() -> Integer 1 

有時它會返回null!

爲什麼?

的響應是從redis的

+2

使用'equals'來比較對象而不是'=='或'!=' – Jens

+0

出於同樣的原因'新Integer(1)== Integer.valueOf(1)'是'false'。 –

+0

謝謝,最後我用Integer.intValue,但是爲什麼當Integer = 1時,這樣的代碼'Integer!= Integer'返回true? –

沙发
0
0

在這種情況下==!=檢查是否比較的對象是指向存儲器中的同一個地方。要比較存儲在比較對象中的值,請使用由Object類的所有Java對象繼承的方法.equals()

+0

當Interger是1時,爲什麼它不會aotuunboxing? –

+0

@JasonYu因爲equals()方法被對象繼承,所以原始類型不被視爲Java中的對象,它們不會繼承任何東西。如果你調用這個方法,這意味着你想比較對象,而不是原始類型 –

0
votes
answers
46 views
+10

如何在共享主機上安裝Redis?

2

我正在開發一個Laravel項目,我正在使用Predis來緩存數據庫查詢。現在我必須在我的服務器上安裝Redis。是否可以在共享主機上安裝Redis?如何在共享主機上安裝Redis?

0
votes
answers
41 views
+10

如何設置redisearch默認限制的限制是10。我想設置50

1
from redisearch import Client 

client = Client('myIndex') 
res = client.search(search_key) 

我需要50個結果res如何設置redisearch默認限制的限制是10。我想設置50

沙发
0
3

閱讀文檔 - 您需要使用查詢對象的paging方法:http://redisearch.io/python_client/#paging

4
votes
answers
37 views
+10

How can I track/fix memory leak in tornado-redis using pympler?

I've been trying to use tornado-redis (which is basically a fork of brükva slightly modified to work with tornado.gen interface instead of adisp) in order to deliver events by using redis' pubsub.

So I wrote down a little script to test things out inspired by this example.

import os

from tornado import ioloop, gen
import tornadoredis


print os.getpid()

def on_message(msg):
    print msg

@gen.engine
def listen():
    c = tornadoredis.Client()
    c.connect()
    yield gen.Task(c.subscribe, 'channel')
    c.listen(on_message)

listen()

ioloop.IOLoop.instance().start()

Unfortunately, as I PUBLISHed through redis-climemory usage kept on rising.

In order to profile memory usage I first tried to use guppy-pe but it wouldn’t work under python 2.7 (Yes even tried trunk) so I fell back to pympler.

import os

from pympler import tracker
from tornado import ioloop, gen
import tornadoredis


print os.getpid()

class MessageHandler(object):

    def __init__(self):
        self.memory_tracker = tracker.SummaryTracker()

    def on_message(self, msg):
        self.memory_tracker.print_diff()

@gen.engine
def listen():
    c = tornadoredis.Client()
    c.connect()
    yield gen.Task(c.subscribe, 'channel')
    c.listen(MessageHandler().on_message)

listen()

ioloop.IOLoop.instance().start()

Now each time I PUBLISHed I could see that some objects were never released:

                                            types |   # objects |   total size
===================================================== | =========== | ============
                                                 dict |          32 |     14.75 KB
                                                tuple |          41 |      3.66 KB
                                                  set |           8 |      1.81 KB
                                       instancemethod |          16 |      1.25 KB
                                                 cell |          22 |      1.20 KB
                          function (handle_exception) |           8 |    960     B
                                     function (inner) |           7 |    840     B
                                            generator |           8 |    640     B
                             <class 'tornado.gen.Task |           8 |    512     B
                           <class 'tornado.gen.Runner |           8 |    512     B
  <class 'tornado.stack_context.ExceptionStackContext |           8 |    512     B
                                                 list |           3 |    504     B
                                                  str |           7 |    353     B
                                                  int |           7 |    168     B
                           builtin_function_or_method |           2 |    144     B
                                                types |   # objects |   total size
===================================================== | =========== | ============
                                                 dict |          32 |     14.75 KB
                                                tuple |          42 |      4.23 KB
                                                  set |           8 |      1.81 KB
                                                 cell |          24 |      1.31 KB
                                       instancemethod |          16 |      1.25 KB
                          function (handle_exception) |           8 |    960     B
                                     function (inner) |           8 |    960     B
                                            generator |           8 |    640     B
                             <class 'tornado.gen.Task |           8 |    512     B
                           <class 'tornado.gen.Runner |           8 |    512     B
  <class 'tornado.stack_context.ExceptionStackContext |           8 |    512     B
                                               object |           8 |    128     B
                                                  str |           2 |    116     B
                                                  int |           1 |     24     B
                                                types |   # objects |   total size
===================================================== | =========== | ============
                                                 dict |          32 |     14.75 KB
                                                tuple |          42 |      4.73 KB
                                                  set |           8 |      1.81 KB
                                                 cell |          24 |      1.31 KB
                                       instancemethod |          16 |      1.25 KB
                          function (handle_exception) |           8 |    960     B
                                     function (inner) |           8 |    960     B
                                            generator |           8 |    640     B
                             <class 'tornado.gen.Task |           8 |    512     B
                           <class 'tornado.gen.Runner |           8 |    512     B
  <class 'tornado.stack_context.ExceptionStackContext |           8 |    512     B
                                                 list |           0 |    240     B
                                               object |           8 |    128     B
                                                  int |          -1 |    -24     B
                                                  str |           0 |    -34     B

Now that I know there's really a memory leak, how do I track where those objects are created? I guess I should start here?

沙发
+40
+50

Upgrading Tornado to version 2.3 should fix this issue.

I was having the same issue where ExceptionStackContext were leaking very quickly. It was related to this bug report: https://github.com/facebook/tornado/issues/507 and fixed in this commit: https://github.com/facebook/tornado/commit/57a3f83fc6b6fa4d9c207dc078a337260863ff99. Upgrading to 2.3 took care of the issue for me.

非常感謝你指出我這個問題。我升級了,洩漏+減速消失了:) - Simon Charette 12年4月4日3:28

8
votes
answers
33 views
+10

Best solution for a caching system that supports sharding, replication and has low latency

We're in the process of deploying a highly dynamic website. About 20,000 items are processed and updated every minute at peak capacity. Each item can range from a size of 1kb to 500kb. These items needs to be retrieved, processed and updated in cache every minute.

We are expecting a traffic of upto 1000 users in the first two-three months. As each user lands on the website, they can be requesting some popular content, but others may request unpopular content. All content is a higher level processed form of what sits in the persistent store. Hence it is absolutely necessary to have all the processed items sitting in a low-latency store for superb user-experience, be it popular or unpopular.

We've tried Memcache, Redis and Couchbase separately.

Memcache is super fast but we ran into issues where certain slabs ran out of memory and active items started getting evicted.

Redis, relatively slower than Memcache, is great if you want persistence in the items.

However soon we realized we wanted sharding and replication.

Couchbase offered that out of the box.. The Moxi-client that interfaces with the Couchbase server has its own problems of not being able to handle heavy concurrent processes. It will start missing sets and gets every now and then. Moved over to the Python SDK that interfaces with it. It performed poorly in the event when one of the nodes in the cluster went down, it wasn't able to discover the new topology at all. Ended up losing some data in cache and inactivity on the site for several precious hours.

At a point where we realize that there is no perfect product out there that will suite our needs. You have to be aware of all the technologies and your own needs. You have to foresee how your data will evolve and be prepared accordingly. The best solution is probably a hybrid of technologies. However putting this out in the hope that maybe there is something other there. We're approaching the end of 2012. How hard can it be for an out of the box solution backed up with powerful hardware to deliver what we need.

Any thoughts and links to insightful articles would be greatly appreciated. Thanks!

沙发
+80

以下是您在上面提到的一些技術的一些注意事項。

Memcached的:

Memcached只是一個緩存系統,不會為您提供任何數據持久性。如果您選擇使用memcached,則需要選擇其他類型的持久性存儲來保存所有數據。Memcached也是一個非常簡單的緩存系統,並沒有為您提供複製,但它們是不同的項目(如repcache),它們為memcached添加了這樣的功能。如果我想使用關係數據庫作為我的持久層,我只會使用memcached。

Redis的:

Redis是一個數據結構服務器,只能用於此目的。Redis的缺點是你只能在一台服務器上運行它,如果你想擁有Redis的多個服務器,那麼你需要進行應用程序分片。我見過的Redis大部分部署都是另一種數據庫技術。

Couchbase:

Couchbase 2.0將把產品變成文檔數據庫。該產品內置了memcached技術,因此您可以開箱即用memcached,這意味著亞毫秒的延遲。除此之外,您還可以獲得複制,跨數據中心複製和查詢支持。另請注意,大多數Couchbase SDK不使用moxi,並且Python SDK仍處於測試階段。

您可能有用的一件事是查看YCSB基準測試項目以及已發布的一些結果。該項目將使您能夠很好地了解這些數據庫和其他數據庫在負載下的性能。然後,一旦你找到了一些你喜歡的東西,你就可以查看它們的功能列表,並找出產品具有最適合你開發的應用程序的功能。

另外,如果我的任何有關上述數據庫的信息不正確,請告訴我。這些項目正在迅速發展,有時很難跟上。

編輯:我還應該提到Couchbase是列出的唯一提供複製,分片和低延遲的數據庫。我想redis將允許你有一個副本服務器,因此復制,但你要做的任何分片必須在應用程序層完成。

0
votes
answers
46 views
+10

Redis處理排隊管理機制

1

在使用Redis處理排隊系統時,我可能會用錯誤的思維方式,這就是爲什麼我需要你們爲此提供幫助。Redis處理排隊管理機制

所以,我有這個相當簡單的隊列,負責將電子郵件堆疊到一個集合上,然後檢索堆棧的可用電子郵件並分發它。

該系統是在NodeJS中構建的,因此我正在使用node-redis lib。

隊列(堆棧)應該是不斷可用的,一個點在其上添加(推送)新的電子郵件,另一個則彈出第一個被推入的項目。

對於這種方法,我可能會想到JavaScript'ish,以及我在Redis文檔中發現的內容,可能不太合適,所以在這裏我來找你們來幫助我在談論Redis時獲得正確的思維方式語言。

用一個簡單的例子,在JSON,這裏是我的隊列堆:

queue = [ 
{ 
    _id: 5a05eec08a7e66eb10ad6361, 
    email: "some html content in here", 
    domain: "domain.com" 
}, 
{ 
    _id: 5a05eb785710017b7d7a0243, 
    email: "some more html content here", 
    domain: "domain.com" 
}, 
... 
] 

而且通過看Redis Documentation 我發現我可以做這樣的事情每個電子郵件推入堆棧:

HMSET queue:5a05eec08a7e66eb10ad6361 email "some html content in here" domain "domain.com" 
HMSET queue:5a05eb785710017b7d7a0243 email "some more html content here" domain "domain.com" 

,而我可以明確地檢索一個 '集' 是這樣的:

HMGET queue:5a05eec08a7e66eb10ad6361 email 
HMGET queue:5a05eec08a7e66eb10ad6361 domain 
HMGET queue:5a05eb785710017b7d7a0243 email 
HMGET queue:5a05eb785710017b7d7a0243 domain 

直到這一點,一切都非常香草。但問題在於,當它涉及到一個排隊系統時,必須使用語言/數據庫爲您提供的PUSH和POP功能。

我確實能夠找到Redis提供的PUSH和POP機制,但我只能在處理單個尺寸的KEY時使用它。

所以,在我的情況,而不是彈出一個單一的項目,如:

RPOP email 

我真正需要的是這樣的:

RPOP queue //see the abstraction here? calling the stack and not a single item? 

隨着又將回到我 - 在同時間刪除 - 此隊列集合中的最後一個項目。

所以,

RPOP queue //or whatever other command I couldn't find 

應該給我

{ 
    _id: 5a05eec08a7e66eb10ad6361, 
    email: "some html content in here", 
    domain: "domain.com" 
} 

...然後,用另一個

RPOP queue 

回我

{ 
    _id: 5a05eb785710017b7d7a0243, 
    email: "some more html content here", 
    domain: "domain.com" 
} 

等等,直到它呈現這個「隊列」爲空。

我希望自己清楚自己的心態,以及問題本身。

我不能使用HMGET機制,對於任何隊列,而一端可能會從底部彈出的項目,另一端可能被堆放在它之上的新項目中的代碼進行迭代。所以,通過編寫一些「重組索引」機制來保持一定程度的黑客行爲。

至此,我開始相信Redis不會爲我提供必要的工具來支持這種「多維」堆棧方法。不錯,恕我直言,Redis可能不是我需要的答案。

但是我知道我現在可能會有錯誤的觀念,可能Redis提供了一種優雅的方式來處理這個問題,但是從完全不同的方法來看。我不會僅僅使它與RPUSH和LPOP一起工作,因爲正如我已經提到的那樣,它只是爲我提供了一種處理簡單的單維KEY VALUEs的方法。

如果Redis沒有爲此提供某些支持,我已經在NodeJS端點實施了一種解決方法。但是你知道,更多的代碼意味着更多的潛在錯誤。

和平

沙发
0
1

你並不需要打破你的隊列中的內容轉換成離散的哈希值,除非你打算訪問他們的子元素。如果你我理解正確,你需要的是經典的LPUSH/RPOP列表隊列模式。在該列表中的成員可以是任何東西,但在你的情況下,最簡單的是隻存儲每個元素的原始序列化JSON,如:

LPUSH queue '{_id: 5a05eec08a7e66eb10ad6361, email: "some html content in here", domain: "domain.com"}' 
+0

謝謝@埃文 - 哈伯,這是一個非常簡單的事情,但我看不到它,因爲我在考慮對於Popping/Pushing對象,我需要像LMHPUSH/RMHPOP那種奇怪的東西。 這解決了我的疑問,並解決了暴露問題的思維。 –

+1

太棒了 - 隨時可以回來進行進一步的思維調整;) –

0
votes
answers
38 views
+10

使用默認隊列時,類型不包含方法

0

我試圖排隊或安排作業(例如發送郵件)。以下是我在試用/錯誤過程中觀察到的情況:使用默認隊列時,類型不包含方法

  • 在開發和生產環境中,我們使用的是相同的redis服務器。 Redis配置相同,雙方僅使用一個隊列:default。因此,當其他開發人員正在調試代碼時,他們將成爲正在偵聽默認隊列的服務器。
  • 當我試圖排隊或安排一項工作,我最近在我的機器上開發並進行調試時,它不會執行,它在'Retries'部分中看到。方法根本找不到。重試10次後,失敗。 (順便說一句,我使用Enqueue<T>Schedule<T>方法。)
  • 當我介紹一個新的隊列(如測試)在Startup.cs,並與BackgroundJobClientEnqueuedState("test")排隊的新工作,並指定隊列名稱,會立即執行。

在所有這些之後,我沒有得到作業(函數)和隊列之間的關係。有人可以解釋爲什麼我的作業在「默認」隊列中執行時失敗,以及爲什麼他們在不同隊列中執行時成功?

另外,有人可以解釋我爲什麼當我嘗試運行一項工作時遇到「找不到方法」的問題嗎?

我在問這些問題,因爲我想了解所有這些問題背後的真正原因,而不是進行推理。

沙发
0
0

不知道這是否會回答,但我有同樣的問題,並發現了幾件事情,當你使用Schedule(或重複的作業)

  • 隊列名稱的arent支持,只有當你直接Enqueue他們(除非你自定義創建一個系統來支持它)。 See this,這是舊的,但應該仍然有效。

  • 如果你有多個運行hangfire的服務來管理不同類型的作業,一定要給他們每個人一個不同的hangfire數據庫來存儲他們的數據。如果你把他們全部放在同一個數據庫上,當一個工作需要時啓動HF將搜索一個默認隊列來運行它(除非你指定了隊列名稱,但是......見上)。

  • 但是每個服務都會有一個HF服務器,它有一個默認隊列,並且沒有指出哪一個是正確的......所以HF可能會結束嘗試在另一個服務的服務器上運行它,那不會有任何想法因爲它沒有鏈接到正確的代碼庫(again,see this)。另一方面,如果您指定隊列的名稱,並且該名稱只在服務器上「鏈接」到正確的代碼上,那麼HF將在該隊列上運行該作業(同樣,只要您不安排它) ,找到它需要什麼,這樣就可以了

希望這有助於有點

0
votes
answers
40 views
+10

的多模式獲取密鑰在Redis的

1

我想所有的鍵啓動與460或45412.的多模式獲取密鑰在Redis的

keys 460* combine keys 45412*

我嘗試的方法在此鏈接:https://redis.io/commands/keys,但未能

沙发
0
1

我終於可以用Jedis通過設置數據結構

Set<String> FirstSet = js.keys("460*"); 
Set<String> SecondSet = js.keys("45412*"); 
SecondSet.addAll(FirstSet); 

讓所有結果第二組就是我想要的。

板凳
0
1

有沒有combine Redis中的選項。

keys命令不應該在應用程序級別使用,它很慢。相反,你可以使用合適的類型(hashzset或其組合,這取決於你的需要)

無論如何,如果你想獲得兩個模式鍵,你可以叫keys幾次,合併的結果:

cat <(redis-cli -n 0 keys "460*") <(redis-cli -n 0 keys "45412*") > keys.txt 
4
votes
answers
32 views
+10

Solutions for a secure distributed cache

Problem: I want to cache user information such that all my applications can read the data quickly, but I want only one specific application to be able to write to this cache.

I am on AWS, so one solution that occurred to me was a version of memcached with two ports: one port that accepts read commands only and one that accepts reads and writes. I could then use security groups to control access.

Since I'm on AWS, if there are solutions that use out-of-the box memcached or redis, that'd be great.

沙发
+30

我建議你在11211(Memcached)上使用ElastiCache和一個開放端口,然後創建一個EC2實例,設置你的安全組,這樣只有這個服務器才能訪問你的ElastiCache集群。使用此服務器過濾應用程序,因此只有一個特定的應用程序可以寫入它。您可以使用安全組,腳本或iptable控制訪問。如果您不使用VPC,則可以使用緩存安全組

那麼它沒有分發:它有一個單點故障 - 一個訪問服務器。 - 傑米於2014年10月14日22:03

使用自動縮放和負載均衡器,問題解決了。 - 凱文2014年10月15日3:23

好吧,如果我要設置自動縮放,負載均衡器並構建一個應用程序,我可以跳過內存緩存部分並自己構建整個內容,不過在這一點上,只需將它固定在發電機上看起來相當不錯。速度是個問題:APP-> Memcache vs APP-> ELB-> SVC-> Memcache。 - 傑米於2014年10月15日20:29

那麼你無法比較數據庫系統和緩存系統。一開始它可能看起來很好,當你的流量上升時,dynamodb的性能會下降或者以後會花費成本。這將花費您更多的金錢和時間來遷移系統。請第一時間做對。根據AWS Document,ElasticCache將數據“保存在內存中以實現低延遲訪問”,而將dynamodb保存到硬盤。硬盤vs內存,我會選擇內存。 - 凱文2014年10月17日7:01

板凳
+10

我相信你可以使用Redis(而不是Memcached)來實現這一點,Redis也可以通過ElastiCache獲得。創建實例後,您將需要創建一個複制組並將其與已啟動的緩存集群相關聯。

然後,您可以將實例添加到復制組。複製組中的實例只是從主緩存集群(單個Redis實例)複製,因此(默認情況下)是只讀的。

因此,在此設置中,您可以根據需要編寫可以寫入的主節點(單個端點)和多個讀取節點(多個端點)。

您可以進一步採取安全措施,並為複制組分配不同的路由規則(通過VPC),以便讀取數據的應用程序無法訪問主節點(唯一可以寫入數據的節點)。

技術上仍然是一個單點故障(主人),但一個整潔的想法。 - 傑米於2014年10月14日22:06

此外,這可能是一個問題:“目前,ElastiCache支持單節點Redis緩存集群。” - 傑米於2014年10月14日22:23