Redis官网对Redis的定义是:“Redis is an open source, BSD licensed, advanced key-value cache and store”,可以看出,Redis是一种键值系统,可以用来缓存或存储数据。Redis是“Remote Dictionary Server”(远程字典服务)的缩写,提供了字符串(string),列表(list),哈希(hash),集合(set)和有序集合(sorted set)等5种数据结构,这些数据结构使它成为一种便于使用的键值系统。

作为Redis提供的最简单的数据结构,字符串示意图及其常用命令如下图所示:

图1

可见,Redis字符串类型实际上类似于C++中的map,一个键对应一个值。列表类型则是一种相对高级的数据结构,其示意图和常用命令如下图所示:

图2

列表实际上由一个双向链表实现,所以在列表两端插入或删除数据效率极高,可以用于实现类似于微博、人人网上的“新鲜事”功能。 Redis提供的一个更有趣的结构称为哈希,其示意图和常用命令如下图所示:

图3

一个哈希实际上是一组键值对的集合,哈希本身的键是“父键”,哈希中包含的若干字段是“子键”,每个“子键”都有相应的值。“子键”之间并没有一定的联系,但是它们共同组成了一个完整的哈希结构。我们可以把一个哈希看做关系数据库中的一行,哈希的每个子键对应行的一个字段。因此,当把关系数据库中的数据缓存至Redis时,使用哈希结构可能会带来方便。需要注意的是,哈希结构内部的子键之间是没有顺序关系的。Redis提供的另一个无顺序关系的结构是集合,其示意图和常用命令如下图所示:

图4

集合中的数据满足唯一性和无序性。集合在Redis内部是用哈希表实现的,所以插入和删除操作的时间复杂度均为O(1)。Redis为集合提供了求交并差等运算命令,使用起来非常方便。与集合密切相关的另一个数据结构是有序集合,其示意图和常用命令如下图所示:

图5

有序集合与集合的最大差异在于有序集合中的每个数据都有一个对应的分数,集合中的元素就是按照这些分数进行排序的。从结构功能和使用方法上来看,有序集合可能是Redis提供的5种数据结构中最高级的一种。

Redis是一种内存数据库,这使其在数据存取效率方面表现突出。由于内存中的数据时刻面临丢失的危险,Redis提供了两种持久化机制,及时将内存中的数据写入硬盘。第一种机制为RDB,利用存储快照的方式把内存数据定期写入硬盘;第二种机制为AOF,利用写日志的方式,每执行一条更改Redis数据的命令,就在日志里附加上该命令并保存在硬盘上。Redis默认开启RDB模式,关闭AOF模式,这是因为AOF更加耗时。但是,如果对数据安全要求极高,无法承担任何数据丢失的后果,AOF模式就变成了持久化的首选。

当然,即使Redis具备持久化机制,但是一旦本地硬盘损坏,数据丢失依然在所难免。所以,Redis又提供了复制功能,作用是将一个主数据库(master)的数据自动同步到多个从数据库(slave),从而尽可能防止数据丢失。Redis主从机制可以简单描述为:从数据库启动后,先向主数据库发送SYNC命令;主数据库接到SYNC命令后就开始保存快照,在此期间,所有发给主数据库的命令都被缓存起来;快照保存完成后,主数据库把快照和缓存的命令一起发给从数据库;从数据库保存主数据库发来的快照文件,并依次执行主数据库发来的缓存命令。在同步过程中,从数据库不会阻塞,它默认使用同步之前的数据继续响应客户端发来的命令。

事务是Redis提供的特性之一。首先利用MULTI命令通知Redis,接下来的若干命令属于同一事务;然后输入若干命令,这些命令都被放入命令队列而不会被立即执行;最后,利用EXEC命令通知Redis,属于同一事务的所有命令均已输入完成,现在开始执行该事物。属于同一个事务的所有有效命令或者全部被执行,或者全部不执行,且在执行过程中不会插入其他命令。管道(pipeline)是Redis提供的另一个特性。该特性使Redis能够一次性接收多个命令,执行之后再一次性返回结果。这样能够减少客户端与Redis服务器的通信次数,从而降低往返时延。

除事务和管道以外,Redis还提供了很多其他特性,如设置键的过期时间,利用BLPOP/BRPOP命令实现优先级队列,利用PUBLISH/SUBSCRIBE命令实现消息订阅和发布等,这里不再赘述。

Redis由ANSI C写成,能够运行在包括Linux和OS X在内的大部分POSIX系统上,官方推荐的操作系统为Linux。Redis没有官方的Windows版本,但是微软移植并维护了一个能够运行在Windows上的Redis并放在github上(https://github.com/MSOpenTech/redis)。

Redis的编程接口被称为客户端(clients),绝大部分主流编程语言都有官方推荐的客户端。下图中,具有Redis官方推荐客户端的语言标为绿色,没有官方推荐客户端的标为蓝色:

图6

由于Redis没有官方推荐的C++客户端,因此可以使用C客户端予以代替。官方推荐的C客户端是hiredis,可以从github上找到(https://github.com/redis/hiredis)。

作为一款功能强大,效率极高的NoSQL数据库,Redis已被包括新浪微博,知乎,Stackoverflow,暴雪和Flickr在内的多家公司成功用于实战。

注:图1-5均来自《Redis in Action》,Josiah L.Carlson, Manning Publications, 2013

参考文献:

1. 李子骅,Redis入门指南,人民邮电出版社,2013年5月第1版

2.Josiah L.Carlson, Redis in Action, Manning Publications, 2013

3. Redis官方网站http://www.redis.io

初学Redis(1)——认识Redis的更多相关文章

  1. window下使用Redis Cluster部署Redis集群

    日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...

  2. 4、解析配置文件 redis.conf、Redis持久化RDB、Redis的主从复制

    1.Units单位 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 对大小写不敏感 2.INCLUDES包含 和我们的Struts2配置文件类似,可以通过includes包 ...

  3. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  4. Redis学习笔记~Redis主从服务器,读写分离

    回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...

  5. redis如何执行redis命令

    Redis 命令 Redis 命令用于在 redis 服务上执行操作.所以我们必须要启动Redis服务程序,也就是redis安装目录下的redis-server.exe,你可以双击执行,也可以打开cm ...

  6. redis+Keepalived实现Redis主从复制

    redis+Keepalived实现Redis主从复制: 环境:CentOs6.5Master: 10.10.10.203Slave:   10.10.10.204Virtural IP Addres ...

  7. Redis-cluster集群【第一篇】:redis安装及redis数据类型

    Redis介绍: 一.介绍 redis 是一个开源的.使用C语言编写的.支持网络交互的.可以基于内存也可以持久化的Key-Value数据库. redis的源码非常简单,只要有时间看看谭浩强的C语言,在 ...

  8. Redis系列-远程连接redis并给redis加锁

    假设两台redis服务器,ip分别为:192.168.1.101和192.168.1.103,如何在101上通过redis-cli访问103上的redis呢?在远程连接103之前,先讲下redis-c ...

  9. Redis配置文件之————redis.conf配置及说明

    基本设置 1. 备释当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写):1k =< 1000 bytes1kb =< 1024 by ...

  10. spring data redis RedisTemplate操作redis相关用法

    http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...

随机推荐

  1. 在WebAPI使用Session

    最近在改写WebApp时要将以前用泛型处理例程写的Captcha 改成使用WebApi 来实作机制,在实作的过程中发现使用IRequiresSessionState session也无法使用(cont ...

  2. Java 基础【13】 文件(文件夹) 创建和删除

    使用 java.io.file 创建文件(文件夹),算是 java 最基础的知识,但实战项目中还是需要知晓细节. 比如 File 类中的 mkdir() 和 mkdirs() 的区别. JDK API ...

  3. 【原】python中文文本挖掘资料集合

    这些网址是我在学习python中文文本挖掘时觉得比较好的网站,记录一下,后期也会不定期添加:   1.http://www.52nlp.cn/python-%E7%BD%91%E9%A1%B5%E7% ...

  4. windows服务 定时任务

    1.c#程序做成windows服务 若用cmd安装: var path = Process.GetCurrentProcess().MainModule.FileName + " s&quo ...

  5. 【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流

    http://www.lydsy.com/JudgeOnline/problem.php?id=1065 https://vijos.org/p/1826 好难的题啊TWT ∈我这辈子也想不出来系列~ ...

  6. Advanced Office Password Recovery如何设置快捷方式

    一般软件安装成功之后都会在桌面上形成快捷方式以方便使用,但是一些用户发现Advanced Office Password Recovery这种office密码破解工具安装成功后桌面上没有出现快捷方式, ...

  7. Neural Style学习1——简介

    该项目是Github上面的一个开源项目,其利用卷积神经网络的理论,参照论文A Neural Algorithm of Artistic Style,可以实现一种效果:两张图片,一张取其内容,另一张取其 ...

  8. 从A文件拿B文件的某一个值

  9. 前端构建工具:gulp的配置与使用

    安装gulp 因为gulp是基于node的管理工具,所以要先安装nodejs安装nodejsnodejs下载地址:中文站:http://nodejs.cn/ 英文站:https://nodejs.or ...

  10. TP-LINK WR941 DD-WRT刷回OpenWRT及OpenWRT刷回原厂固件

    1.DD-Wrt 刷回 OpenWrt A.从官网下载固件: root@TL-DDWRT:/tmp# wget http://downloads.openwrt.org/barrier_breaker ...