运维知识体系

运维知识体系

运维知识体系总结,持续更新,欢迎转载。
缓存知识体系

缓存知识体系

运维知识体系之缓存,分层多级缓存体系。
K8S实践指南

K8S实践指南

Docker和Kubernetes实践指南(每周更新)
新运维课堂

新运维课堂

全新体系化课程,开启运维新征程!

【转载】LevelDb日知录之一:初识LevelDb

赵班长 发表了文章 • 0 个评论 • 2267 次浏览 • 2016-04-23 07:32 • 来自相关话题

郑重声明:本文转载自郎格科技系列博客,原文地址:http://www.samecity.com/blog/Article.asp?ItemID=84     说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级 ...查看全部
郑重声明:本文转载自郎格科技系列博客,原文地址:http://www.samecity.com/blog/Article.asp?ItemID=84

    说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanjay Ghemawat。这两位是Google公司重量级的工程师,为数甚少的Google Fellow之二。Jeff Dean其人:

http://research.google.com/people/jeff/index.html
   Google大规模分布式平台Bigtable和MapReduce主要设计和实现者。

Sanjay Ghemawat其人:

http://research.google.com/people/sanjay/index.html

Google大规模分布式平台GFS,Bigtable和MapReduce主要设计和实现工程师。

    LevelDb就是这两位大神级别的工程师发起的开源项目,简而言之,LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库。正像上面介绍的,这二位是Bigtable的设计和实现者,如果了解Bigtable的话,应该知道在这个影响深远的分布式存储系统中有两个核心 的部分:Master Server和Tablet Server。其中Master Server做一些管理数据的存储以及分布式调度工作,实际的分布式数据存储以及读写操作是由Tablet Server完成的,而LevelDb则可以理解为一个简化版的Tablet Server。

LevelDb有如下一些特点:

首先,LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。

其次,LevleDb在存储数据时,是根据记录的key值有序存储的,就是说相邻的key值在存储文件中是依次顺序存储的,而应用可以自定义key大小比较函数,LevleDb会按照用户定义的比较函数依序存储这些记录。

再次,像大多数KV系统一样,LevelDb的操作接口很简单,基本操作包括写记录,读记录以及删除记录。也支持针对多条操作的原子批量操作。

另外,LevelDb支持数据快照(snapshot)功能,使得读取操作不受写操作影响,可以在读操作过程中始终看到一致的数据。

除此外,LevelDb还支持数据压缩等操作,这对于减小存储空间以及增快IO效率都有直接的帮助。LevelDb性能非常突出,官方网站报道其随机写性能达到40万条记录每秒,而随机读性能达到6万条记录每秒。总体来说,LevelDb的写操作要大大快于读操作,而顺序读写操作则大大快于随机读写操作。

如何有效删除Redis中比较大的Hash Key

赵班长 发表了文章 • 0 个评论 • 4980 次浏览 • 2016-02-15 18:47 • 来自相关话题

    生产上由于业务设计原因,有一些500M的Hash Key,现在已经没有用了,需要删除,如果直接删除会造成Redis的卡顿影响线上正常的业务。那么处理有两个方案:      在一个夜深人静的时刻,流量低点进行操作(运维真是苦逼啊!)     ...查看全部
    生产上由于业务设计原因,有一些500M的Hash Key,现在已经没有用了,需要删除,如果直接删除会造成Redis的卡顿影响线上正常的业务。那么处理有两个方案:
  •      在一个夜深人静的时刻,流量低点进行操作(运维真是苦逼啊!)
  •      写个脚本,把Hash里面的内容一条一条删除(Python大法好啊!)

   
Python脚本:
      于是变有了这个脚本,很Low,很实用:
# -*- coding: UTF-8 -*-
'''
python redis_hash_del.py HASH_KEY_NAME
'''

# Import python libs
import sys
import redis

# Args Input filter
if len(sys.argv) <= 1:
print "python sys.argv[0] HASH_KEY_NAME"
sys.exit()
else:
hashkey = sys.argv[1]

# redis_hash_del online
def redis_hash_del(hashkey):
'''
delete redis hash key
'''
r = redis.Redis(host='192.168.0.118',port=6379,db=0)
if r.exists(hashkey):
hashkey_all = r.hkeys(hashkey)
for i in range(len(hashkey_all)):
r.hdel(hashkey, hashkey_all[i])
print i
else:
print "KEY NOT EXISTS"

if __name__ == "__main__":
redis_hash_del(hashkey)

[/i]

  使用方法:

    手动修改脚本里面的IP地址和端口,然后:
[i]python redis_hash_del.py HASH_KEY_NAME[/i]