具体使用:php
redis.windows.conf:配置文件 redis-benchmark.exe:Redis读写性能测试工具 redis-check-aof.exe:aof修复检查日志 redis-check-dump.exe:dump检查数据库文件 redis-cli.exe:Redis客户端程序 redis-server.exe:Redis服务器程序 StartWithConf.bat:启动Redis
redis.windows.conf
Redis服务端的运行参数所有靠配置文件实现,此处详细介绍Redis配置文件的几个重要参数:html
// network bind 127.0.0.1:绑定地址(外网链接:0.0.0.0) port 6379:默认绑定本机的6379端口; timeout:链接超时时间(秒) requirepass pass:配置redis链接认证密码 // general loglevel debug/notice/warning/verbose:日志级别(开发测试/生产环境/只记录警告错误信息/详细信息) logfile ./Logs/redis_log.txt:日志文件保存路径 databases 16:数据库数量,默认0 // snapshotting save TimeInterval ChangeCnt // append only mode appendonly yes:开启命令日志模式; // limits maxclients 64:最大链接数,0为不限制 maxmemory <bytes>:内存清理临界值 maxmemory-policy volatile-lru:内存清理采用的默认策略,对设置过时时间的key进行LRU算法删除
ping:启动服务链接状况 info:查看server/client配置信息 info commandstats + config resetstat:显示/清除名次调用统计信息 config get/set:获取/设置配信息 flushdb/flushall:删除当前所选/全部数据库中的全部key save/bgsave:数据保存到硬盘/异步保存 lastsave: 上次成功保存到磁盘的unix时间戳 dbsize:查看全部key的数目 get/set和mget/mset:获取/设置键 incr/decr和incrby/decrby:自增/自减 exists/type key:键key是否存在/键类型 expire key secondTime:设置键的过时时间 rename oldKey newKey:重命名 ttl key:键key的剩余存活时间 select db_index:选择数据库 move key db_index:将键key移动到指定数据库
Redis是典型的NoSQL数据库服务器,其License是Apache License、彻底免费。首先看下内存数据库的基本概念:java
内存数据库web
In-Memory DataBase,之内存为主要存储介质的数据库.redis
Redis算法
REmote DIctionary Server(远程字典服务),远程内存数据库(Memory Database + Data Structure Server),开源的使用ANSI-C语言编写、支持网络、可基于内存亦可持久化的日志型、高性能的key-value数据库,Redis不预约义且不使用表,适应高并发、海量数据存储场景。sql
- A persistent key-value database with built-in net interface written in ANSI-C for Posix systems.
- Redis is an open source, BSD licensed, advanced key-value cache and store.
下面是Redis支持的5种类型数据结构的内部图解(图一):数据库
redisObject 对象是Redis内部的核心对象,用于表示全部的key和valuewindows
typedef struct redisObject { unsigned type:4; // 数据类型 unsigned encoding:4; // 编码方式 unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ int refcount; // 对象的引用计数 void *ptr; // 指向真正的存储结构 } robj;
其中,REDIS_LRU_BITS 表示当内存超限时采用 LRU 算法清除内存中的对象。redisObject对象的建立在object.c文件中:浏览器
robj *createObject(int type, void *ptr) { robj *o = zmalloc(sizeof(*o)); o->type = type; o->encoding = OBJ_ENCODING_RAW; o->ptr = ptr; o->refcount = 1; /* Set the LRU to the current lruclock (minutes resolution). */ o->lru = LRU_CLOCK(); return o; }
具体内存结构示意图(图二):
参考:Redis数据库入门教程; Redis学习笔记;
特色
内存优化
其中,字段free用于冗余空间,空间换时间、必定状况下避免插入操做引发的扩容操做。
Redis .vs. Memcached
string
list
双向链表、容许重复,支持lpush/rpush和lpop/rpop;实现消息队列等;
set
不容许重复,内部是哈希表实现、查找/删除/插入均O(1); 集合提供SINTER、SUNION、SDIFF分别支持交集、并集、差集操做。
hash
键值对(父键+子键:值)。存储键key的多个属性数据,彻底能够用Json格式存储、直接看成string类型操做,但对性能有影响,因此Redis提出Hash类型。
以下,图一是普通的key/value结构,须要封装一个对象保存value的信息;图二是Redis的Hash类型:
zset
有序键值对(父键+成员:分值),键值对实际是成员和分值(Member-Score)的映射关系(字符串成员member与浮点数分值score之间的有序映射,按分值大小排序),分值必须为浮点数; 既能够根据成员访问元素(同散列),又能够根据分值按序访问元素结构。
内存提供主存储支持、硬盘做持久性存储。默认开启RDB模式,默认优先加载AOF文件。一次性将数据加载到内存中,一次性预热。
问题:当服务器被关闭时,服务器内存存储的数据将何去何从?
RDB .vs. AOF
不重启Redis从RDB模式切换到AOF模式 :
redis-cli> config set appendonly yes:启用AOF redis-cli> config set save "":关闭RDB
==>:Redis数据持久化; Redis做者:深度剖析Redis持久化;
半持久化模式(快照方式:File-Snap-Shotting,即时间点转储:Point-in-Time Dump),Redis DataBase,将数据先存储在内存,当直接调用save/bgsave命令时或数据修改知足设置的save条件时触发bgsave操做,将内存数据一次性写入RDB文件。比较适合灾难恢复(Disaster Recovery),若Redis异常crash,最近的数据会丢失。
rdbcompression yes:建立快照时对数据进行压缩 dbfilename dump.rdb:快照名称 dir ./saveFile/:快照保存路径(AOF文件存放目录)
原理:Copy-on-Write(写时复制)技术
该原理保证任什么时候候复制RDB文件都是绝对安全的。
全持久化模式(日志方式),Append-Only-File,将数据存在内存,同时调用fsync将本次写操做命令进行日志记录到aof文件,基于Redis网络交互协议的由Redis标准命令组成的可识别的纯文本文件,只容许追加不容许改写。
写策略:默认并推荐 appendfsync everysec ,速度和安全兼顾。
AOF最关键的配置就是关于调用fsync追加日志文件持久化数据的频率。磁盘空间满、断电等状况不会影响日志的完整性和可用性。
保存:支持2种方式
sds aof_buf; /* AOF buffer, written before entering the event loop */
加载
fakeClient = createFakeClient(); // 建立伪客户端 while(命令不为空) { // 获取一条命令的参数信息 argc, argv . . . // 执行 fakeClient->argc = argc; fakeClient->argv = argv; cmd->proc(fakeClient); }
AOF重写
bgrewriteAOF,从新生成一份AOF文件,新的AOF文件只包含对同一个值的屡次操做的最后一条记录(能够恢复数据的最小指令集),过程和RDB相似(Copy-on-Write机制):
当同时知足如下2个条件时触发rewrite操做:
auto-aof-rewrite-percentage 100 // 当前写入日志文件的大小占到初始日志文件大小的某个百分比时触发rewrite auto-aof-rewrite-min-size 64mb // 本次Rewrite最小的写入数据量
注意,bgrewriteaof和bgsave不能同时执行,避免两个Redis后台进程同时对磁盘进行大量的I/O操做。
修复
Redis提供 redis-check-aof.exe 工具支持日志修复功能:
master-slave,为了增强持久化机制,在持久化基础上Redis提供复制功能:将一个主服务器(master)数据自动同步到多个从服务器(slave),实现主从同步:
具体地:
在主从同步过程当中(异步实现),从服务器不会阻塞,期间默认使用同步以前的数据继续响应客户端命令。主从机制支持增量同步策略,下降链接断开的恢复成本。
具体应用中一般是:Redis+MySQL
publish-subscribe,观察者模式,订阅者(Subscriber)订阅频道(Channel),发布者(Publisher)将消息发到指定频道(Channel),经过这种方式将消息的发送者和接收者解耦,能够实现多个浏览器之间的信息同步和实时更新。
publish myChannel “xxx”:发布 subscribe myChannel:订阅 unsubscribe myChannel:取消订阅
Redis的Pub/Sub模式容许动态的Subscribe/Unsubscribe,提升系统的灵活性和可扩展性。
排序
问题:数据库支持排序,为何要把排序功能放在缓存中实现?
sort key [BY pattern] [LIMIT offset cnt] [GET pattern [GET pattern ...]] [asc | desc] [ALPHA] [STORE destination]
事务
Transaction。
管道
pipilining,容许Redis一次性接收多个命令、执行后一次性返回结果,减小客户端与Redis服务器的通讯次数、下降往返时延。相似事务,经过原子操做multi/exec完成。
优先级队列
blpop/brpop。
高可用性(High Availability)
首先,将Redis与SQL Server/MySQL等对比一下:
应用场景
- 在主页中显示最新的项目列表; - 删除和过滤:lrem; - 排行榜(Leader Board)及相关问题; - 按照用户投票和时间排序; - 过时项目处理:unix时间做为得分; - 计数(Counting Stuff):INCR,DECR命令构建计数器系统; - 特定时间内的特定项目:Redis特点特性; - 实时分析正在发生的状况,用于数据统计与防止垃圾邮件等; - Pub/Sub:发布订阅机制; - 队列(Priority Queue); - 缓存(Caching);
而后给出使用Redis中的几点注意事项:
以及经过阅读 ALCA in Redis-land 获得的建议:
参考:Redis应用场景; Redis做者谈Redis应用场景; Redis应用建议;
关于Redis在C#中的辅助工具,具体参见:Redis for C# | sqh;