EchoDemo's Blogs

初识Redis

你身体里的每一粒原子都来自一颗爆炸了的恒星。形成你左手的原子和形成你右手的原子也许来自不同的恒星。这是我所知的物理学中最富有诗意的事情:你们都是星辰。—-劳伦斯·克劳斯《一颗原子的时空之旅》

1,盛赞Redis

Redis(REmote Dictionary Server)的前身是一个叫做LLOOGG的网站,在2008年,Redis的作者在开发该网站时,需要实现一个高性能的队列功能,最开始是使用MySQL来实现的, 但后来发现无论如何优化SQL语句都无法使网站的性能提高上去,他决定做一个专属于LLOOGG的数据库 。

Redis是一种基于键值对(key-value)的NoSQL数据库。NoSQL(NoSQL = Not Only SQL )。是对不同于传统的关系型数据库的数据库管理系统的统称。高可扩展性,分布式计算,低成本,架构的灵活性等特性。

"NoSQL数据库分类"

国外的Twitter、 Instagram、Stack Overflow、GitHub,国内像新浪微博、阿里巴巴、腾讯、百度、搜狐、优酷土豆、美团、小米、唯品会等公司都是 Redis的使用者。

2,Redis特性

1、速度快
2、基于键值对的数据结构服务器
3、丰富的功能
4、简单稳定
5、客户端语言多
6、持久化
7、主从复制
8、高可用和分布式

(1)速度快

Redis的所有数据都是存放在内存当中。它是完全基于内存,其绝大部分请求是纯粹的内存操作。

Redis使用了单线程架构。避免了不必要的上下文切换和竞争条件,从而不存在多进程或者多线程切换导致的CPU消耗问题,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。

采用了非阻塞I/O多路复用机制。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,此时程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流。阻塞式I/O如果要接收更多的连接,就必须创建更多的线程。在I/O复用模式下大量的连接统统都可以过来直接注册到Selector复用器上面,同时只要单个或者少量的线程来循环处理这些连接事件就可以了,一旦达到“就绪”的条件,就可以立即执行真正的I/O操作。这就是I/O复用与传统的阻塞式I/O最大的不同。也正是I/O复用的精髓所在。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗)。具体的关于I/O多路复用可以查看我的这篇文章:I/O多路复用

Redis是用C语言实现的。一般来说C语言实现的程序“距离”操作系统更近,执行速度相对会更快。

(2)基于键值对的数据结构服务器

与很多键值对数据库不同的是,Redis中的值不仅可以是字符串,而且还可以是具体的数据结构,Redis它主要提供了5种数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set),同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的“数据结构”,并且随着 LBS(Location Based Service,基于位置服务)的不断发展,Redis3.2版本中加入有关GEO(地理信息定位)的功能,在这些数据结构的帮助下,不仅提高了开发的效率,而且适用于更多的应用场景。

(3)丰富的功能

1、提供了键过期功能,可以用来实现缓存。
2、提供了发布订阅功能,可以用来实现消息系统。
3、支持Lua脚本功能,可以利用Lua创造出新的Redis命令。
4、提供了简单的事务功能,能在一定程度上保证事务特性。
5、提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到 Redis,减少了网络的开销。

(4)简单稳定

Redis的源码很少,早期版本的代码只有2万行左右,3.0版本以后由于添加了集群特性,代码增至5万行左右,也就意味着普通的开发和运维人员完全可以“吃透”它。

Redis使用单线程模型,这样不仅使得Redis服务端处理模型变得简单,而且也使得客户端开发变得简单。

Redis不需要依赖于操作系统中的类库(例如Memcache需要依赖 libevent这样的系统类库),Redis自己实现了事件处理的相关功能。

(5)客户端语言多

Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到 Redis,几乎涵盖了主流的编程语言,例如Java、PHP、 Python、C、C++、Nodejs等。

(6)持久化

我们都知道的是:将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失。Redis提供了两种持久化方式用来将内存的数据保存到硬盘:RDB和 AOF。

RDB(Redis DataBase)是在某个时间点将数据(Database中的key-value的二进制形式数据)写入一个临时的rdb文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。它是通过配置Redis在n秒内如果超过m个key被修改就执行一次RDB操作,这中持久化的方式也叫做snapshots。RDB是间隔一段时间进行持久化,如果在持久化之间发生故障,会发生数据的丢失,所以这种方式更适合数据要求不严谨的时候。

AOF(Append Only File)把数据的每一条修改命令都追加到aof文件。该“日志文件”保存了历史所有的操作过程,虽然可以保证数据的不易丢失,但是这样也造成了其文件势必会比rdb文件大很多,且aof文件中存储的是命令,导致其恢复的速度变慢。

(7)主从复制

Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础。

(8)高可用和分布式

Redis从2.8版本正式提供了高可用实现Redis Sentinel,它能够保证Redis 节点的故障发现和故障自动转移。Redis从3.0版本正式提供了分布式实现 Redis Cluster,它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展性。

3,Redis使用场景

(1)缓存

Redis提供了键值过期时间设置,也提供了灵活控制最大内存和内存溢出后的淘汰策略。

(2)排行榜系统

Redis提供了列表和有序集合数据结构。

(3)计数器应用

传统关系型数据库如果并发量很大,为了保证数据的实时性,对其性能是一种很大的挑战。Redis天然支持计数功能而且计数的性能也非常好。

(4)社交网络

由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存点赞,推送,下拉刷新等类型的数据,而Redis提供的数据结构可以相对比较容易地实现这些功能。

(5)消息队列系统

Redis提供了发布订阅功能和阻塞队列的功能。

(6)Redis不适合的场景

不适合存储大规模的数据和冷数据。

4,安装Redis

(1)在Linux上安装Redis

$ wget http://download.redis.io/releases/redis-3.0.7.tar.gz 
$ tar xzf redis-3.0.7.tar.gz 
$ ln -s redis-3.0.7 redis 
$ cd redis 
$ make 
$ make install


1、下载Redis指定版本的源码压缩包到当前目录。
2、解压缩Redis源码压缩包。
3、建立一个redis目录的软连接,指向redis-3.0.7。这是为了不把redis目录固定在指定版本上,有利于Redis未来版本升级, 是安装软件的一种好习惯。
4、进入redis目录。
5、编译(编译之前确保操作系统已经安装gcc)。
6、安装。将Redis的相关运行文 件放到/usr/local/bin/下,这样就可以在任意目录下执行Redis的命令。

(2)在Windows上安装Redis

5,启动、操作、关闭Redis

启动Redis服务

(1)默认配置

$ redis-server

(2)运行启动

$ redis-server --configKey1 configValue1 --configKey2 configValue2

(3)配置文件启动

$ redis-server /opt/redis/redis.conf

Redis命令行客户端

(1)交互式方式

$ redis-cli -h 127.0.0.1 -p 6379 
$ 127.0.0.1:6379> set hello world
$ OK
$ 127.0.0.1:6379> get hello
$ "world"

(2)命令方式

$ redis-cli -h 127.0.0.1 -p 6379 get hello
$ "world"

注:如果没有-h参数,那么默认连接127.0.0.1;如 果没有-p,那么默认6379端口,也就是说如果-h和-p都没写就是连接 127.0.0.1:6379这个Redis实例。

停止Redis服务

Redis提供了shutdown命令来停止Redis服务,如果要停掉127.0.0.1上 6379端口上的Redis服务:

$ redis-cli shutdown
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------