什么是redis?
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。它通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Map)、列表(list)、集合(sets) 和 有序集合(sorted sets)等类型。
基本介绍
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
支持的语言
ActionScript Bash C C# C++ Clojure Common Lisp Crystal D Dart Elixir emacs lisp Erlang Fancy gawk GNU Prolog Go Haskell Haxe Io Java Javascript Julia Lua Matlab mruby Nim Node.js Objective-C OCaml Pascal Perl PHP Pure Data Python R Racket Rebol Ruby Rust Scala Scheme Smalltalk Swift Tcl VB VCL
Redis 的应用场景到底有哪些?
最常用的就是会话缓存
消息队列,比如支付
活动排行榜或计数
发布、订阅消息(消息通知)
商品列表、评论列表等
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的 key-value 类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
Redis支持数据的备份,即 master-slave 模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
Redis 的发布与订阅
Redis 发布与订阅(pub/sub)是它的一种消息通信模式,一方发送信息,一方接收信息。
下图是三个客户端同时订阅同一个频道:
下图是有新信息发送给频道 1 时,就会将消息发送给订阅它的三个客户端:
Redis 事务
Redis 事务可以一次执行多条命令:
发送 exec 命令前放入队列缓存,结束事务
收到 exec 命令后执行事务操作,如果某一命令执行失败,其它命令仍可继续执行
一个事务执行的过程中,其它客户端提交的请求不会被插入到事务执行的命令列表中
一个事务经历三个阶段:
开始事务(命令:multi)
命令执行
结束事务(命令:exec)
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set key key1 QUEUED 127.0.0.1:6379> get key QUEUED 127.0.0.1:6379> rename key key001 QUEUED 127.0.0.1:6379> exec 1) OK 2) "key1" 3) OK
Redis 安全配置
可以通过修改配置文件设备密码参数来提高安全性:#requirepass foobared。
去掉注释#号就可以配置密码,没有配置密码的情况下查询如下:
127.0.0.1:6379> CONFIG GET requirepass 1) "requirepass" 2) ""
配置密码之后,就需要进行认证:
127.0.0.1:6379> CONFIG GET requirepass (error) NOAUTH Authentication required. 127.0.0.1:6379> AUTH foobared #认证 OK 127.0.0.1:6379> CONFIG GET requirepass 1) "requirepass" 2) "foobared"
Redis 持久化
Redis 持久有两种方式:
Snapshotting(快照),默认
Append-only file(AOF)
Snapshotting(快照):
将存储在内存的数据以快照的方式写入二进制文件中,如默认 dump.rdb中。
save 900 1,#900 秒内如果超过 1 个 Key 被修改,则启动快照保存。
save 300 10,#300 秒内如果超过 10 个 Key 被修改,则启动快照保存。
save 60 10000,#60 秒内如果超过 10000 个 Key 被修改,则启动快照保存。
Append-only file(AOF):
使用 AOF 持久时,服务会将每个收到的写命令通过 write 函数追加到文件中(appendonly.aof)
AOF 持久化存储方式参数说明:
appendonly yes,#开启 AOF 持久化存储方式
appendfsync always,#收到写命令后就立即写入磁盘,效率最差,效果最好,数据不丢失。
appendfsync everysec,#每秒写入磁盘一次,效率与效果居中
appendfsync no,#完全依赖 OS,效率最佳,效果没法保证
rdb和aof区别
rdb优势
整个Redis数据库将只包含一个文件,方便进行备份。
大数据集时的速度比 AOF 的恢复速度要快。
最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。
劣势
服务器故障时可能丢失数据
每次保存 RDB 的时候,都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。 在数据集非常庞大时 fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端;
aof优势
具备可调整的同步策略 appendsync 调整持久化。
AOF 文件是只进行追加操作的日志文件(append only log)因此对写入不需要进行 seek
AOF 文件有序地保存了所有写入操作, 以 Redis 协议格式保存, 因此文件非常易懂
aof劣势
性能比rdb低,相同数据集,AOF 文件体积通常要大于 RDB 文件体积。
根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB。
相关教程
Redis教程 —— redis简介:http://www.ibloger.net/article/1126.html
Redis教程 —— windows下redis的安装使用教程 :http://www.ibloger.net/article/1120.html
Redis教程 —— Redis的密码设置:http://www.ibloger.net/article/1326.html
Redis教程 —— redis常用命令示例:http://www.ibloger.net/article/1125.html
Redis教程 —— redis常用命令速查一览表:http://www.ibloger.net/article/1126.html
Redis教程 —— Java操作Redis增删改查 :http://www.ibloger.net/article/1118.html
Redis教程 —— 事务详解:http://www.ibloger.net/article/3265.html
未经允许请勿转载:程序喵 » Redis教程 —— 简介