小编Dhr*_*hak的帖子

如果redis已经是堆栈的一部分,为什么Memcached仍然与Redis一起使用?

Redis可以完成Memcached提供的所有内容(LRU缓存,项目到期,现在在版本3.x +中进行集群,目前处于测试阶段)或者使用twemproxy等工具.性能也类似.更重要的是,Redis增加了持久性,因此在服务器重启时您不需要进行缓存加温.

参考比较Redis和Memcache的一些旧答案,其中一些支持Redis作为Memcache的替代(如果已经存在于堆栈中):

尽管如此,在研究Instagram,Pinterest,Twitter等大型网络规模公司的堆栈时,我发现他们将Memcached和Redis用于不同目的,而不是使用Redis进行主要缓存.主缓存仍然是Memcached,Redis用于基于数据结构的逻辑缓存.

截至2014年,为什么memcached仍然值得将其作为附加组件添加到堆栈中,当你已经有一个可以完成memcached可以做的所有事情的Redis组件时?除了现有的Redis之外,建筑师/工程师还有哪些优点还包括memcached?

更新:

对于我们的平台,我们已经完全丢弃了Memcached,并将redis用于简单和逻辑缓存要求.高性能,灵活可靠.

一些示例场景:

  • 按特定模式列出所有缓存的密钥,并读取或删除它们的值.在redis中很容易,在memcached中不容易(很容易).
  • 存储超过1mb的有效负载,在redis中很容易,需要在memcached中调整slab大小,这会产生自身的性能副作用.
  • 轻松快照当前缓存内容
  • Redis集群以及语言驱动程序也可以生产,因此集群部署也很容易.

memcached caching redis

81
推荐指数
2
解决办法
1万
查看次数

如何更改可序列化python对象的json编码行为?

很容易更改不是JSON可序列化的对象的格式,例如datetime.datetime.

出于调试目的,我的要求是改变一些自定义对象从基本对象扩展的方式,dictlist以json格式进行序列化.代码:

import datetime
import json

def json_debug_handler(obj):
    print("object received:")
    print type(obj)
    print("\n\n")
    if  isinstance(obj, datetime.datetime):
        return obj.isoformat()
    elif isinstance(obj,mDict):
        return {'orig':obj , 'attrs': vars(obj)}
    elif isinstance(obj,mList):
        return {'orig':obj, 'attrs': vars(obj)}
    else:
        return None


class mDict(dict):
    pass


class mList(list):
    pass


def test_debug_json():
    games = mList(['mario','contra','tetris'])
    games.src = 'console'
    scores = mDict({'dp':10,'pk':45})
    scores.processed = "unprocessed"
    test_json = { 'games' : games , 'scores' : scores , 'date': datetime.datetime.now() }
    print(json.dumps(test_json,default=json_debug_handler))

if __name__ == '__main__':
    test_debug_json()
Run Code Online (Sandbox Code Playgroud)

演示:http …

python json

58
推荐指数
4
解决办法
1万
查看次数

在Python中检查存在于较长字符串中的模糊/近似子字符串?

使用像leveinstein(leveinstein或difflib)这样的算法,很容易找到近似匹配.

>>> import difflib
>>> difflib.SequenceMatcher(None,"amazing","amaging").ratio()
0.8571428571428571
Run Code Online (Sandbox Code Playgroud)

可以通过根据需要确定阈值来检测模糊匹配.

当前要求:根据较大字符串中的阈值查找模糊子字符串.

例如.

large_string = "thelargemanhatanproject is a great project in themanhattincity"
query_string = "manhattan"
#result = "manhatan","manhattin" and their indexes in large_string
Run Code Online (Sandbox Code Playgroud)

一个强力解决方案是生成长度为N-1到N + 1(或其他匹配长度)的所有子串,其中N是query_string的长度,并且逐个使用levenstein并查看阈值.

python中是否有更好的解决方案,最好是python 2.7中包含的模块,或外部可用的模块.

更新:Python正则表达式模块工作得很好,虽然它比re模糊子字符串情况的内置模块慢一点,由于额外的操作,这是一个明显的结果.期望的输出是良好的,并且可以容易地定义对模糊度的控制.

>>> import regex
>>> input = "Monalisa was painted by Leonrdo da Vinchi"
>>> regex.search(r'\b(leonardo){e<3}\s+(da)\s+(vinci){e<2}\b',input,flags=regex.IGNORECASE)
<regex.Match object; span=(23, 41), match=' Leonrdo da Vinchi', fuzzy_counts=(0, 2, 1)>
Run Code Online (Sandbox Code Playgroud)

python fuzzy-search python-2.7

40
推荐指数
5
解决办法
1万
查看次数

为什么使用Celery运行计划任务优于crontab?

考虑到Celery已经是运行任务队列的堆栈的一部分(即它不仅仅是为了运行crons而添加,这似乎是一种矫枉过正的恕我直言).

它的"周期性任务"功能如何作为crontab的替代品有益?专门寻找以下几点.

  • crontab的主要优点/缺点
  • 使用芹菜比crontab更好的选择
  • Django特定用例:Celery vs crontab运行基于django的周期性任务,当芹菜已被包含在堆栈中时django-celery,就像排队django任务一样.

python django celery django-celery

40
推荐指数
2
解决办法
1万
查看次数

Facebook访问令牌无效,消息"会话与当前存储的会话不匹配"?

我最近在发布到应用程序用户的facebook新闻源流时遇到此错误,我确实拥有访问令牌的离线访问权限,并且之前工作正常.30-40%的用户会遇到此错误.

"Error validating access token: Session does not match current stored session.
This may be because the user changed the password since the time the session
was created or may be due to a system error."
Run Code Online (Sandbox Code Playgroud)

facebook facebook-graph-api

33
推荐指数
1
解决办法
7万
查看次数

什么是深度复制python dict或列表中的数据的快速pythonic方法?

当我们需要从包含原始数据类型的字典中复制完整数据时(为简单起见,让我们忽略数据类型的存在,比如datetime等),我们最明显的选择是使用deepcopy,但深度复制比其他一些实现的hackish方法要慢相同的,例如使用序列化 - 非序列化,例如json-dump-json-load或msgpack-pack-msgpack-unpack.效率的差异可以在这里看到:

>>> import timeit
>>> setup = '''
... import msgpack
... import json
... from copy import deepcopy
... data = {'name':'John Doe','ranks':{'sports':13,'edu':34,'arts':45},'grade':5}
... '''
>>> print(timeit.timeit('deepcopy(data)', setup=setup))
12.0860249996
>>> print(timeit.timeit('json.loads(json.dumps(data))', setup=setup))
9.07182312012
>>> print(timeit.timeit('msgpack.unpackb(msgpack.packb(data))', setup=setup))
1.42743492126
Run Code Online (Sandbox Code Playgroud)

json和msgpack(或cPickle)方法比普通的深度复制更快,这很明显,因为深度复制在复制对象的所有属性方面也会做得更多.

问题:是否有一种更加pythonic /内置的方式来实现字典或列表的数据副本,而没有深度复制所具有的所有开销?

python

25
推荐指数
2
解决办法
4491
查看次数

使用MongoDB与MySQL有很多JSON字段?

有一种微博类型的应用程序.默认的两个主要基本数据库存储是:MySQL或MongoDB.

我计划对大量数据进行反规范化即将对帖子进行的投票存储在投票表中,同时计数也会在主帖子表中递增.该帖还涉及其他行动(例如,喜欢,投票放弃).

如果我使用MySQL,一些数据更适合作为JSON而不是固定模式,以便更快地进行查找.

例如

POST_ID   |  activity_data

213423424 | { 'likes': {'count':213,'recent_likers' :
             ['john','jack',..fixed list of recent N users]} , 'smiles' : 
             {'count':345,'recent_smilers' :
             ['mary','jack',..fixed list of recent N users]}  }
Run Code Online (Sandbox Code Playgroud)

该应用程序还有其他组件,其中提出了JSON的使用.因此,要更新JSON字段,序列为:

  1. 阅读python脚本中的JSON.

  2. 更新JSON

  3. 将JSON存储回MySQL.

这本来是MongoDB中单次操作与像原子操作$push,$inc,$pull等等.同样的MongoDB的文档结构适合我的数据很好.

我在选择数据存储时的注意事项.

关于MySQL:

  1. 稳定而熟悉.
  2. 备份和恢复很容易.
  3. 使用某些字段作为无模式JSON可以避免某些未来的模式更改.
  4. 可能要早点使用memcached层.
  5. JSON blobs在一些表中将是静态的,例如主帖,但是在其他一些表中会更新,比如Post投票和喜欢.

关于MongoDB:

  1. 更适合将架构较少的数据存储为文档.
  2. 可以避免缓存直到稍后阶段.
  3. 有时应用程序可能会变得更加密集,MongoDB可以在不安全写入不成问题的那些点上表现更好.
  4. 不确定稳定性和可靠性.
  5. 不确定备份和恢复有多容易.

问题:

  1. 如果有一半数据是无模式的,我们应该选择MongoDB吗?如果使用MySQL,我们是否存储为JSON?
  2. 一些数据如主帖是关键的,所以它将使用安全写入保存,计数器等将使用不安全写入保存.此政策是否基于数据的重要性,写密集性是否正确?

  3. 与MySQL相比,监控,备份和恢复MongoDB有多容易?我们需要计划定期备份(比如每天),并在发生灾难时轻松恢复.我与MongoDB有什么最好的选择,使它成为应用程序的安全赌注.

稳定性,备份,快照,恢复,更广泛的采用Iedatabase持久性是指向我使用MySQL作为RDBMS + NoSql的原因,即使NoSQL文档存储可以更好地服务于我的目的.

考虑到我想到的数据库设计,请关注MySQL和MongoDB之间的选择.我知道可以有更好的方法来使用RDBMS或MongoDB文档来规划数据库设计.但这不是我问题的当前焦点.

更新:从MySQL 5.7开始,MySQL支持丰富的本机JSON数据类型,它提供了数据灵活性以及丰富的JSON查询.

https://dev.mysql.com/doc/refman/5.7/en/json.html

mysql mongodb nosql

22
推荐指数
3
解决办法
1万
查看次数

django日志记录根据请求全局设置上下文?

可以说我想像这个格式化字符串一样记录:

%(levelname)s %(asctime)s %(module)s %(funcName)s %(message)s %(user_id)
Run Code Online (Sandbox Code Playgroud)

可以使用这种类型的日志记录命令来完成:

logging.error('Error fetching information', extra = { 'user_id': 22 } )

这会将当前用户ID添加到当前请求的日志消息中.

但额外的dict需要添加到每个日志记录调用.

是否有一种很好的方法可以在django中的公共函数中添加此上下文(例如,中间件或视图的索引函数),以便设置具有用户ID的额外字典,并且当前请求中的所有进一步日志记录调用也会记录当前用户.

python django logging

22
推荐指数
1
解决办法
1677
查看次数


为什么在Python中捕获组时正则表达式搜索速度较慢?

我有一个应用程序代码,可以从配置中动态生成正则表达式以进行一些解析.当两个变化的定时性能时,正被捕获的OR正则表达式的每个部分的正则表达式变化明显慢于正常正则表达式.原因是regex模块内部某些操作的开销.

>>> import timeit
>>> setup = '''
... import re
... '''   

#no capture group 
>>> print(timeit.timeit("re.search(r'hello|bye|ola|cheers','some say hello,some say bye, or ola or cheers!')", setup=setup))
0.922958850861

#with capture group
>>> print(timeit.timeit("re.search(r'(hello)|(bye)|(ola)|(cheers)','some say hello,some say bye, or ola or cheers!')", setup=setup))
1.44321084023

#no capture group
>>> print(timeit.timeit("re.search(r'hello|bye|ola|cheers','some say hello,some say bye, or ola or cheers!')", setup=setup))
0.913202047348

# capture group
>>> print(timeit.timeit("re.search(r'(hello)|(bye)|(ola)|(cheers)','some say hello,some say bye, or ola or cheers!')", setup=setup))
1.41544604301
Run Code Online (Sandbox Code Playgroud)

问题:使用捕获组时,导致性能大幅下降的原因是什么?

python regex

18
推荐指数
2
解决办法
1542
查看次数