NoSQL浅尝:Redis

几乎是在本人从事开头(大约11年),就直接听我们在座谈Redis,平昔听我们谈谈哪些安排/使用,怎么样在MySQL前边放了Redis提高了略微性能。不言而喻Redis像神一样的存在,近年来我要一窥神的真容(好激动)!

Redis是典型的NoSQL数据库,是一个in-memory数据库,是一个面向数据结构的数据库。引用官网的一段介绍:

Redis is an open source (BSD licensed), in-memory data structure
store
, used as database, cache and message broker. It supports data
structures such as
strings,
hashes,
lists,
sets,sorted
sets

with range queries,
bitmaps,
hyperloglogs
and geospatial
indexes

with radius queries. Redis has built-in
replication,
Lua
scripting
,
LRU
eviction
,
transactions
and different levels of on-disk
persistence
,
and provides high availability via Redis
Sentinel

and automatic partitioning with Redis
Cluster
.

显而易见用起来就像使用Map/List等语言自带的数据结构,可是还要又是一个按照内存的仓储系统。一般在后台架构中的地位是如此的:

redis

为啥会有这般的计划性吧?这是因为DB所属的储存层一般是把数量持久化到磁盘上的,这样每便读数据都亟需从磁盘中去摸索,IO是相当慢的操作,所以一个简约的想法是把数据缓存在内存中,这样下次读数据的时候就足以先看看内存中有没有,没有的话再去DB中搜寻,这样效能自然就进步了。

那种缓存结构并不是Redis才有的,其实在此以前取代Redis地位的是Memcached。

Memcached


Memcached
最早(2003,6年之后Redis诞生)是 Danga
Interactive

LiveJournal
开发的。在Redis没有流行以前,常用的有始有终层架构之一就是:Memcached +
MySQL。可是Redis出现之后,Memcached就逐渐萎缩了,Memcached是一个的确的缓存系统而不是一个存储系统,Memcached只好存储字符串型的数据,帮助多线程查找。关于Memcached和Redis的比较有很多,相同点首要有:

  • 都是内存型的数据库,都是面向KV的存储
  1. 都是NoSQL数据库,使用类似的KV数据模型
  2. 都是把具有数据都存储在内存中,适合做高速缓存

不同点有:

  • Redis有加上的数据类型和操作指令
  1. Redis能够持久化到磁盘
  2. Redis协助乐观锁的事务
  3. Redis补助Pub/Sub能够看做信息系统利用
  4. Redis帮助单个值到512M,而Memcached仅扶助1M
  5. Redis内建了集群,主从复制功效
  6. Redis补助Lua脚本,可以经过脚本间接在Redis服务器上做复杂的数量操作
  7. Redis相当的快、分外的平安

诸如此类相比较对Memcached是可怜不利于的,确切的说Redis的支付是借鉴了Memcached的经验,它是Memcached的一个超集。在很少的场面比如只需要仓储一些简易的字符串,否则Redis都会是最好的选料。

行使情形


作为DB前置的缓存系统,使用境况是内需专门关爱的,虽然大家都通晓使用缓存来加强整个系统的特性和吞吐能力,可是缓存的宏图反复需要过多经验的累积。在有的时候,缓存设计的糟糕,命中率低,对全连串统影响都会分外大。所以下边搜集了一些独立的行使情状作为参考,或许可以启发自己在做缓存系统时的思路。

除此之外Git用的是队列系统,Weibo和Instagram的用法类似,存储的都是相比较简单的关联消息,这类信息一旦用关系型数据库存储,会促成大气的行和分库分表的暴发,假诺一向存储在内存中,用很少的内存即可存储大量的关系数据。而时间连串的例子谈谈的更常见一些,对于这类应用还亟需细致的阅读著作,体味其中的筹划!

注:这个事例都是在infoQ上找到的 – 关键词:Redis

Try it!!!


在Redis的官方网站提供了一个很好的交互性体验窗口:http://try.redis.io/
。可以平昔感受用命令的法门操作Redis的内存数据结构。

redis tuturial

即使如此如此,这里仍然打算从头到尾的装置两遍Redis,在该地机械上体验一下。整个经过万分简单,现在
http://redis.io/download
下载一份源码(只有源码分发的法门),解压后:

➜  redis-3.0.7 ls
00-RELEASENOTES  MANIFESTO        runtest          tests
BUGS             Makefile         runtest-cluster  utils
CONTRIBUTING     README           runtest-sentinel
COPYING          deps             sentinel.conf
INSTALL          redis.conf       src

接下去照着 “README” 文件操作即可:

  1. ➜ redis-3.0.7 sudo make
    编译源码,编译完成后会在src目录下转移相关命令

  2. ➜ src ./redis-server 命令启动Redis服务,假若见到下图恭喜了!!

    ➜  src ./redis-server 
    8413:C 23 Mar 23:21:58.064 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
    8413:M 23 Mar 23:21:58.067 * Increased maximum number of open files to 10032 (it was originally set to 2560).
                    _._                                                  
               _.-``__ ''-._                                             
          _.-``    `.  `_.  ''-._           Redis 3.0.7 (00000000/0) 64 bit
      .-`` .-```.  ```\/    _.,_ ''-._                                   
     (    '      ,       .-`  | `,    )     Running in standalone mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
     |    `-._   `._    /     _.-'    |     PID: 8413
      `-._    `-._  `-./  _.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |           http://redis.io        
      `-._    `-._`-.__.-'_.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |                                  
      `-._    `-._`-.__.-'_.-'    _.-'                                   
          `-._    `-.__.-'    _.-'                                       
              `-._        _.-'                                           
                  `-.__.-'                                               
    
    8413:M 23 Mar 23:21:58.069 # Server started, Redis version 3.0.7
    8413:M 23 Mar 23:21:58.069 * The server is now ready to accept connections on port 6379
    
  3. ./redis-cli 命令进入Redis控制台

➜  src ./redis-cli 
  127.0.0.1:6379> ping
  PONG
  127.0.0.1:6379> set message "helloworld"
  OK
  127.0.0.1:6379> get message
  "helloworld"
  127.0.0.1:6379> 

Redis的源码很简单,代码也不多(几万行左右)很符合学习。即便眼前早已把Redis服务起来了,不过在真正的生育条件中,可能要部署的是一组Redis集群,在Redis集群方面,相比知名的方案就是
Twemproxy

  • Twitter开源的一套Redis集群方案。官方对此的牵线是:

A fast, light-weight proxy for memcached and redis

Twemproxy使用分片代理的法子实现了Redis集群,豌豆荚也开源了一个好像的成品

Codis,它在一部分地方弥补了Twemproxy的供不应求。官方的牵线是:

Proxy based Redis cluster solution supporting pipeline and scaling
dynamically

客户端 – Client


差点忘了最要紧的一些 –
客户端,在生产条件肯定不会打开一个极端去存数据的,一般各个语言都有Redis的客户端。Redis官网有个页面列举了几乎绝大部分言语实现的Redis客户端:http://redis.io/clients

TODO: 有时间再补充用Java和Spring访问Redis的代码\_

更多

网站地图xml地图