Redis以及值对象简介

Redis是互联网技术领域使用最为广泛的存储中间件,它是“Remote Dictionary Service”远程字典服务的首字母缩写。

1.Redis简介

Redis是一个速度非常快的非关系数据库(non-relational-database),它可以存储键(key)与五种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘。可以使用复制特性来扩展性能,还可以使用客户端分片来扩展写性能。
高性能键值缓存服务器memcached也经常被拿来与Redis进行比较:这两者都可以用于存储键值映射,彼此的性能也相差无几,但是Redis能够自动以两种不同的方式将数据写入硬盘,并且Redis除了能存储普通的字符串之外,还可以存储其他四种数据结构,而memcached只能存储普通的字符串键。这些不同之处使得Redis可以用于解决更为广泛的问题,并且既可以用作主数据库(primary database)使用,又可以作为其他存储系统的辅助数据库(auxiliary database)使用。

2.Redis数据结构简介

Redis可以存储键与五种不同数据结构之间的映射,这五种数据结构类型分别为STRING(字符串)、LIST(列表)、SET(集合)、HASH(哈希)和ZSET(有序集合)。

结构类型结构存储的值结构的读写能力
STRING可以是字符串、整数或者浮点数对整个字符串或者字符串其中一部分执行操作;对整数和浮点数执行自增(increment)或者自减(decrement)操作
LIST一个链表,链表上的每个节点都包含了一个字符串从链表的两端推入或者弹出元素
SET包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同的添加、获取、移除单个元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素
HASH包含键值对的无序散列表添加、获取、移除单个键值对;获取所有键值对
ZSET(有序集合)字符串成员(member)和浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素

3.一些数据库和缓存服务器的特性与功能对比

名称类型数据存储选项查询类型附加功能
Redis使用内存存储(in-memory)的非关系数据库字符串(string)、列表(list)、集合(set)、哈希(hash)、有序集合(zset)每种数据类型都有自己的专属命令。另外还有批量操作(bulk opration)和不完全(partial)的事务支持发布与订阅,主从复制(master/slave replication),持久化,脚本,存储过程(stored procedure)
memchached使用内存存储的键值缓存键值之间的映射创建命令、读取命令、更新命令、删除命令以及其他几个命令为提升性能而设的多线程服务器
Mysql关系数据库每个数据库可以包含多个表,每个包可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展;支持可定制类型SELECT、INSERT、UPDATE、DELETE、内置函数、自定义的存储过程支持ACID性质,主从复制,由第三方支持的多主复制(multi-master replication)
PostgreSQL关系数据库每个数据库可以包含多个行;可以处理多个表的视图(view);支持空间(spatial)和第三方扩展SELECT、INSERT、UPDATE、DELETE、函数、存储过程支持ACID性质(需要使用InnoDB),主主复制(master/master replication)
MongoDB使用硬盘存储(on-disk)的非关系文档存储每个数据库可以包含多个表,每个表可以包含多个无组织与结构的(schema-less)的BSON文档创建命令、读取命令、更新命令、删除命令、条件查询命令等支持map-reduce操作,主从复制,分片,空间索引(spatial index)

4.附加特性

在使用类似Redis这样的内存数据库时,一个首先要考虑的问题就是“当服务器被关闭时,服务器存储的数据将何去何从呢?”Redis拥有两种不同形式的持久化方法,他们都可以用小而紧凑的格式将存储在内存中的数据写入硬盘:

  1. 第一种持久化方法为时间点存储(point-in-time dump),转储操作既可以在“指定时间段内有指定数量的写操作执行”这一条件被满足时执行,又可以通过调用两条转储到硬盘(dump-to-disk)命令中的任意一条来执行。
  2. 第二种持久化方法将所有修改了数据库的命令都写入一个只追加(append-only)文件里面,用于可以根据数据的重要程度,将只追加写入设置为从不同步(sync)、每秒同步一次或者每写入一个命令就同步一次。

另外,尽管Redis的性能很好,但受限于Redis的内存存储设计,有时候只有一台Redis服务器可能没有办法处理所有请求。因此,为了扩展Redis的读性能,并为Redis提供故障转移(failover)支持,Redis实现了主从复制特性;执行复制的从服务器会连接上主服务器,接收服务器发送的整个数据库的初始副本(copy);之后主服务器执行的写命令,都会被发送给所有连接着的从服务器去执行,从而实时地更新从服务器的数据集。因为从服务器包含的数据会不断地进行更新,所以客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。

5.使用Redis的理由

数据库的一个常见用法是存储长期的报告数据,并将这些报告数据用作固定时间范围内的聚合数据(aggregates)。收集集合数据的常见做法是:先将各个行插入一个报告表里面,之后再通过扫描这些行为来收集聚合数据,并根据收集到的聚合数据来更新聚合表中已有的那些行。之所以使用插入行的方式来存储,是因为对于大部分数据库来说,插入行操作执行速度非常快(插入行只会在硬盘文件末尾进行写入)。不过,对表里面的行进行行更新却是一个速度相当慢的操作,因为这种操作除了会引起一次随机读(random read)之外,还可能会引起一次随机写(random write)。而在Redis里面,用户可以直接使用原子的(atomic)INCR命令及其变种来计算集合数据,并且因为Redis将数据存储在内存里面,而且Redis的命令请求并不需要经过典型的查询分析器(parser)或者查询优化器(optimizer)进行处理,所以对Redis存储的数据执行随机写的速度总是非常迅速的。
使用Redis而不是关系数据库或者其他硬盘存储数据库,可以避免写入不必要的临时数据,也免去了对临时数据进行扫描或者删除的麻烦,并最终改善程序的性能。虽然上面列表的都是一些简单的例子,但它们很好地证明了“工具会极大地改变人们解决问题的方式”这一点。

6.可以使用的业务例子

  1. 记录帖子的点赞数、评论数和点击数(hash)
  2. 记录用户的帖子ID列表(排序),便于快速的显示用户的帖子列表(zset)
  3. 记录帖子的标题、摘要、作者和封面信息,用于列表展示(hash)
  4. 记录帖子的点赞用户ID列表,评论ID列表,用于显示和去重计数(zset)
  5. 缓存最近热帖内容(帖子内容的空间占用比较大),减少数据库压力(hash)
  6. 记录帖子的相关文章ID,根据内容推荐相关帖子(list)
  7. 如果帖子ID是整数自增,可以使用Redis来分配帖子ID(计数器)
  8. 收藏集合帖子之间的关系(zset)
  9. 记录热榜帖子ID列表、总热榜和分类热榜(zset)
  10. 缓存用户行为历史、 过滤恶意行为(zset、hash)

当然,实际情况下需求可能也没有这么多,因为在请求压力不大的情况下,很多数据都是可以直接从数据库中查询的。但是如果有请求压力,以前通过数据库直接获取的数据则必须挪到缓存里来操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值