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用于简单和逻辑缓存要求.高性能,灵活可靠.
一些示例场景:
很容易更改不是JSON可序列化的对象的格式,例如datetime.datetime.
出于调试目的,我的要求是改变一些自定义对象从基本对象扩展的方式,dict
并list
以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)
使用像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) 考虑到Celery已经是运行任务队列的堆栈的一部分(即它不仅仅是为了运行crons而添加,这似乎是一种矫枉过正的恕我直言).
它的"周期性任务"功能如何作为crontab的替代品有益?专门寻找以下几点.
django-celery
,就像排队django任务一样.我最近在发布到应用程序用户的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) 当我们需要从包含原始数据类型的字典中复制完整数据时(为简单起见,让我们忽略数据类型的存在,比如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 /内置的方式来实现字典或列表的数据副本,而没有深度复制所具有的所有开销?
有一种微博类型的应用程序.默认的两个主要基本数据库存储是: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字段,序列为:
阅读python脚本中的JSON.
更新JSON
将JSON存储回MySQL.
这本来是MongoDB中单次操作与像原子操作$push
,$inc
,$pull
等等.同样的MongoDB的文档结构适合我的数据很好.
我在选择数据存储时的注意事项.
关于MySQL:
关于MongoDB:
问题:
一些数据如主帖是关键的,所以它将使用安全写入保存,计数器等将使用不安全写入保存.此政策是否基于数据的重要性,写密集性是否正确?
与MySQL相比,监控,备份和恢复MongoDB有多容易?我们需要计划定期备份(比如每天),并在发生灾难时轻松恢复.我与MongoDB有什么最好的选择,使它成为应用程序的安全赌注.
稳定性,备份,快照,恢复,更广泛的采用Iedatabase持久性是指向我使用MySQL作为RDBMS + NoSql的原因,即使NoSQL文档存储可以更好地服务于我的目的.
考虑到我想到的数据库设计,请关注MySQL和MongoDB之间的选择.我知道可以有更好的方法来使用RDBMS或MongoDB文档来规划数据库设计.但这不是我问题的当前焦点.
更新:从MySQL 5.7开始,MySQL支持丰富的本机JSON数据类型,它提供了数据灵活性以及丰富的JSON查询.
可以说我想像这个格式化字符串一样记录:
%(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的额外字典,并且当前请求中的所有进一步日志记录调用也会记录当前用户.
可能重复:
window.location.href = window.location.href和window.location.reload()之间的区别
这两行代码有什么区别,如果有,请赐教.
1.
window.location.reload();
Run Code Online (Sandbox Code Playgroud)
2.
window.location = document.URL;
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序代码,可以从配置中动态生成正则表达式以进行一些解析.当两个变化的定时性能时,正被捕获的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)
问题:使用捕获组时,导致性能大幅下降的原因是什么?