七种武器之一口箱子Redis

作者: 采菊东篱下 | 来源:发表于2017-06-28 15:07 被阅读262次
    redis

    Redis是目前最流行的key-value数据库,但是绝不仅限于此。

    江湖传言「在任何规模、任何类型的服务器项目中,都存在一些最适合用Redis存储的数据。」

    Redis上手快

    从下载到安装一个Redis只需要五步,而且每一步都在自己的控制之内,不需要下载任何外部依赖,手写的Makefile,清晰明亮的目录结构。

    redis安装

    可以毫不夸张的说,Redis在任何类linux操作系统上从来就没有安装失败的时候。安装完成后启动只需要运行一个redis-server 命令就可以了。

    Redis命令简单优雅

    一个系统就算功能再丰富,如果使用起来太复杂也很难吸引人。Redis常用的一些命令都很短,格式固定,而且都非常好记,比如SET,GET,LPUSH,RPOP,操作上几次基本就可以裸写Redis常用命令了。

    Redis数据结构丰富

    Redis如此流行的原因之一便是在简单的key value之外还提供了另外四种常见常用的数据类型,而且提供了各种各样在这些数据类型上的原子操作。

    String 字符串,最基础的类型,可以存储字符串,这里的字符串可以是二进制字符串,也就是说可以把整个图片或者整首歌直接存进去。

    List 列表,可以当栈可以当队列,只要几行代码,一个生产者消费者的消息队列就完成了。

    Hash 散列表,可以存储对象的各种属性和值。

    Set 集合,存储不重复的元素,比如博客文章的各种标签就可以存到集合中。

    Sorted Set 有序集合。

    这样Redis就不仅局限于一个普通的Key-Value数据库,还可以当作一个现成的数据结构库来使用,基于Unix Socket接口,接入本地的C程序,性能和直接函数调用差不了太多的。

    虽然目前大部分的高级语言基本都提供了内置的相关数据结构,但是还是可以外接一个Redis,程序挂了之后数据还在,可以保存现场继续运行。

    Redis扩展性好

    嵌入了Lua虚拟机,可以通过lua脚本来定制自己的命令。

    redis-lua

    Redis保证整个lua脚本的执行是原子操作。

    Lua虚拟机给了Redis无限扩展的能力,很多牛逼的小工具都会去裹上一个lua的虚拟机作为自定义扩展的插件机制。

    Redis可控性强

    Redis完全采用ANSI C写成,麻雀虽小,五脏俱全,只有4万行C代码。

    Redis源代码涉及到了网络,文件操作,事务相关,集群功能,单元测试,状态监控,消息队列,缓存机制,还有各种各样的小工具。

    一旦出了问题,可以使用GDB来直接单步跟踪调试,没有出了问题搞不定只能重启机器的问题。

    甚至可以自己修改Redis的源代码来实现自己想要的一些特性或者达到特定应用场景下更高的性能。

    Redis的源代码可以作为linux系统编程的最优秀源代码教材之一,配合着Richard Stevens的《Unix环境高级编程》来看简直不要太酸爽,可以算是《Unix环境高级编程》的最佳实践。

    Redis客户端丰富

    得益于Redis通信协议的简单明了,各种语言的各种风格的Redis客户端不下百个,总有一款适合你。

    哪怕你还在用VB编写程序。

    redis client

    使用lpush和brpop命令十几行代码就可以实现一个阻塞式的生产者消费者队列。

    生产者:每隔2秒忘redis队列中写入一个随机生成的英文名字。

    # -*- coding: utf-8 -*-
    import redis
    import names
    import time
    
    r = redis.StrictRedis(host='localhost', port=6379, db=0)
    
    while True:
        time.sleep(2)
        name = names.get_full_name()
        x = r.lpush('names', name)
        print x, name
    

    消费者:一旦队列中有数据就取出处理,如果没有就阻塞等待。

    # -*- coding: utf-8 -*-
    import redis
    
    r = redis.StrictRedis(host='localhost', port=6379, db=0)
    
    def consume(key):
        while True:
            value = r.brpop(key)
            yield value
    
    for v in consume('names'):
        print v
    

    就是如此简单优雅

    Redis中文资料多

    Redis各种类型的中文资料很多,已经出版的图书质量也都挺不错。

    推荐自己读过的两本。

    redis books

    初学者学习入门《Redis入门指南》,通过各种应用实践案例介绍Redis的典型应用场景,简单朴实,深入浅出,是不可多得的好书。

    针对Redis内部实现的书推荐《Redis设计与实现》,系统全面的介绍了Redis内部的数据结构和各种特性的具体实现方式。可以先读一遍这本书,然后再对照着书去读Redis源代码。


    如果你也欣赏Redis,欢迎留言。

    下一篇会聊聊lua虚拟机,lua虚拟机绝对当得起七种武器中的「孔雀翎」,天下三百六十余种暗器中最成功最可怕的一种。

    关于古龙七种武器中的第七种武器争议一直不断,相对于有点牵强的「拳头」个人更倾向于英雄无泪中另一件无名的奇门神器「一口箱子」

    相关文章

      网友评论

      本文标题:七种武器之一口箱子Redis

      本文链接:https://www.haomeiwen.com/subject/cpqucxtx.html