Redis介绍

´Redis是一种基于键值对的NoSQL数据库。
´Redis基于内存来存放数据。
´速度快,官方给出读写性能可达到10万/秒(数据存内存,C语言实现,单线程架构)。
´丰富的数据结构:字符串、哈希、列表、集合、有序集合、位图、GEO等。
´丰富的功能:键过期,发布订阅,支持Lua脚本,事务,Pipeline。
´稳定的系统。
´客户端支持语言多。
´数据持久化,RDB、AOF。
´主从复制及分布式。
 
Redis主要应用场景
´缓存,主要作用是优化数据访问速度,减轻后端数据源的压力。
´排行榜,TOP10,可利用Redis的列表或有序集合来实现。
´计数器,例如播放量、浏览数等计数。
´基本的消息队列。Redis提供了发布订阅功能(最好还是用Kafka等专业的)。
´分布式锁,分布式Session等。
´时间过期(如短信验证码的过期时间等)
 
Redis单机环境搭建
´下载Redis的安装包,redis-5.0.0.tar.gz,这里安装5.0版本。
´拷贝到Linux下,解压:tar -zxvf redis-5.0.0.tar.gz。
´移动到/usr/local下(或软连接),mv redis-5.0.0 /usr/local/redis。
´在Redis目录执行make && make install,编译redis。
´修改redis.conf:

port 7000:服务端口。

daemonize yes:修改服务为后台运行。

pidfile /var/run/redis_7000.pid:指定不同的pid文件。

logfile "/var/redis/7000.log":指定log日志路径。

dir /opt/redis-cluster/redis-7000:这个指定rdb,aof文件的路径配置。

requirepass ibethfy:客户端访问需要密码验证。

´redis-server redis.conf,启动redis。
´redis-cli –h ip –p port –a psw,启动redis客户端。
 
Redis数据结构和命令
´提供5种数据结构:字符串,哈希,列表,集合,有序集合。
 
Redis常见全局命令
´keys *,查看所有键,会遍历所有键,时间复杂度为O(n)。
´dbsize,查看键总数,直接获取内置键总数变量,O(1)。
´exists key,检查键是否存在,存在返回1,不存在返回0。
´del key1 key2…,删除键,返回删除成功的个数。
´expire key second,键过期时间设置。
´ttl key,查看key的过期剩余时间,有就返回秒数,不会过期返回-1,不存在键返回-2。
´type key,返回key的数据结构。
 
数据结构内部编码
´使用:object encoding key,来查看数据内部编码。3.2之后,list采用quicklist作为其内部编码,可以理解为结合linkedlist和ziplist,以ziplist为节点的linkedlist。
 
Redis键管理命令
´ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
´linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。
´注意:以上两个数据结构在2版本下适用,3.2版本后,提供了quicklist内部编码,简单地说它是以一个ziplist为节点的linkedlist,它结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现。
´遍历键:keys pattern。由于该命令会遍历key,时间复杂度是O(n),如果键过多,会导致redis阻塞,所以一般不建议在生产环境中使用,若要使用,建议在其从节点执行(可能会影响主从复制)或明确key较少的情况下使用。
´渐进式遍历:scan的复杂度是O(1),需要多次执行才能实现keys的功能。

scan cursor [match pattern] [count number]

cursor是必需参数,实际上cursor是一个游标,第一次遍历从0开始,每

次scan遍历完都会返回当前游标的值,直到游标值为0,表示遍历结束。

match pattern是可选参数,它的作用的是做模式的匹配,这点和keys的模式匹配很像。

count number是可选参数,它的作用是表明每次要遍历的键个数,默认值是10,此参数可以适当增大

scan 0 match * count 3

´切换数据库:select dbindex,redis默认配置的是16个数据库。
´flushdb:清空当前数据库数据。
´flushall: 清空所有数据库数据。
 
RDB触发机制
´RDB持久化是把当前进程数据生成快照保存到硬盘的过程,RDB文件保存在dir配置指定的目录下,触发RDB持久化过程分为手动触发和自动触发。
´手动触发:save,占用主进程,阻塞;bgsave,创建子进程,阻塞发生在fork子进程阶段,很短,推荐使用。
´自动触发:

1、使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。可配置多个。

2、如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点。

3、执行debug reload命令重新加载Redis时,也会自动触发save操作。

4、默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。

bgsave流程:

1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回。

2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒。

3)父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。

4)子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的时间,对应info统计的rdb_last_save_time选项。

5)进程发送信号给父进程表示完成,父进程更新统计信息。

RDB优缺点

优点

´RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景。
´Redis加载RDB恢复数据远远快于AOF的方式。

缺点

´RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高。
´由于触发时机问题,不适合实时持久化。
 
AOF
´AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。
 
AOF文件同步策略
由config配置文件中appendfsync决定
´write操作会触发延迟写(delayed write)机制。Linux在内核提供页缓冲区用来提高硬盘IO性能。write操作在写入系统缓冲区后直接返回。同步硬盘操作依赖于系统调度机制,例如:缓冲区页空间写满或达到特定时间周期。同步文件之前,如果此时系统故障宕机,缓冲区内数据将丢失。
´fsync针对单个文件操作(比如AOF文件),做强制硬盘同步,fsync将阻塞直到写入硬盘完成后返回,保证了数据持久化。
´问题:AOF为什么把命令追加到aof_buf中?

Redis使用单线程响应命令,如果每次写AOF文件命令都直接追加到硬盘,那么性能完全取决于当前硬盘负载。先写入缓冲区aof_buf中,还有另一个好处,Redis可以提供多种缓冲区同步硬盘的策略,在性能和安全性方面做出平衡。

AOF重写触发机制

´手动触发:直接调用bgrewriteaof命令。
´自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机,它底层也是调用bgrewriteaof。
´auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB。
´auto-aof-rewrite-percentage:代表当前AOF文件空间(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。
´自动触发时机=aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewritepercentage。
 
AOF bgrewriteof流程

1)执行AOF重写请求。

如果当前进程正在执行AOF重写,请求不执行并返回如下响应:

ERR Background append only file rewriting already in progress

334

如果当前进程正在执行bgsave操作,重写命令延迟到bgsave完成之后再

执行,返回如下响应:

Background append only file rewriting scheduled

2)父进程执行fork创建子进程,开销等同于bgsave过程。

3.1)主进程fork操作完成后,继续响应其他命令。所有修改命令依然写

入AOF缓冲区并根据appendfsync策略同步到硬盘,保证原有AOF机制正确

性。

3.2)由于fork操作运用写时复制技术,子进程只能共享fork操作时的内

存数据。由于父进程依然响应命令,Redis使用“AOF重写缓冲区”保存这部

分新数据,防止新AOF文件生成期间丢失这部分数据。

4)子进程根据内存快照,按照命令合并规则写入到新的AOF文件。每

次批量写入硬盘数据量由配置aof-rewrite-incremental-fsync控制,默认为

32MB,防止单次刷盘数据过多造成硬盘阻塞。

5.1)新AOF文件写入完成后,子进程发送信号给父进程,父进程更新

统计信息,具体见info persistence下的aof_*相关统计。

5.2)父进程把AOF重写缓冲区的数据写入到新的AOF文件。

5.3)使用新AOF文件替换老文件,完成AOF重写。

 
Redis重启加载过程
 

集群扩容

´步骤:准备新节点;加入集群;迁移槽和数据;加入新节点的从节点。
´redis-server redis-7006.conf,新启动一个节点
´redis-cli –a psw --cluster add-node 127.0.0.1:7006 127.0.0.1:7000,将新节点加入集群。
´redis-cli –a psw –p port cluster nodes,查看集群状态,发现新加入的node作为主节点还未分配槽。
´redis-cli --cluster reshard 127.0.0.1:7000,通过这条命令执行槽分配。
´redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,该条命令可用于将添加的新节点作为某个主节点的从节点。
´如果有空槽的节点已用第二步加进集群。可用以下指令来指定其主节点:
´redis-cli –a psw –p port; cluster replicate mastered
´问题:集群中主节点掉线后,会由其从节点选出一个作为新的主节点,旧主节点重新加入,会作为新主节点的从节点。
´问题:当一个主节点通过del-node命令移除后,它再次重启执行加入集群指令会报错,提示节点在集群中已知或存在数据。这个时候,需要先将该节点的以下数据移除:rdb文件,aof文件,cluster-config-file集群配置文件;移除文件后,重启该节点,再执行加入集群命令。
 
集群收缩
´首先确认是否是主节点,如果是从节点可以直接执行下线命令。
´redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`
´如果是主节点,如果主节点没有槽,则可以执行移除直接下线。
´如果主节点有分配的槽,则需要将其槽分配给其他主节点,没有槽后再下线,为了保证数据的完整性。
´下线的主节点如果有从节点,则会分配给集群中的一个主节点作为其从节点。
 

集群迁移

´1.Stop your clients. No automatic live-migration to Redis Cluster is currently possible. You may be able to do it orchestrating a live migration in the context of your application / environment.
´2.Generate an append only file for all of your N masters using the BGREWRITEAOF command, and waiting for the AOF file to be completely generated.
´3.Save your AOF files from aof-1 to aof-N somewhere. At this point you can stop your old instances if you wish (this is useful since in non-virtualized deployments you often need to reuse the same computers).
´4.Create a Redis Cluster composed of N masters and zero slaves. You'll add slaves later. Make sure all your nodes are using the append only file for persistence.
´5.Stop all the cluster nodes, substitute their append only file with your pre-existing append only files, aof-1 for the first node, aof-2 for the second node, up to aof-N.
´6.Restart your Redis Cluster nodes with the new AOF files. They'll complain that there are keys that should not be there according to their configuration.
´7.Use redis-cli --cluster fix command in order to fix the cluster so that keys will be migrated according to the hash slots each node is authoritative or not.
´8.Use redis-cli --cluster check at the end to make sure your cluster is ok.
´9.Restart your clients modified to use a Redis Cluster aware client library.

redis分享的更多相关文章

  1. 【无私分享:ASP.NET CORE 项目实战(第十一章)】Asp.net Core 缓存 MemoryCache 和 Redis

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitHub上下载了十几个源码参考, Memory 和 Redis 终于写出一个 ...

  2. 国内外三个不同领域巨头分享的Redis实战经验及使用场景

    Redis不是比较成熟的memcache或者Mysql的替代品,是对于大型互联网类应用在架构上很好的补充.现在有越来越多的应用也在纷纷基于Redis做架构的改造.首先简单公布一下Redis平台实际情况 ...

  3. 自己编写redis客户端[deerlet-redis-client],分享与招募。

    引言 最近工作上有需要使用redis,于是便心血来潮打算自己写一个Java客户端.经过两天的努力,目前该客户端已经基本成型.不过可惜的是,由于redis的命令众多,因此LZ还需要慢慢扩展它去支持更多的 ...

  4. (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景

    随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...

  5. Session for Tornado(Redis) - 代码分享

    Session for Tornado(Redis) - 代码分享   Session for Tornado(Redis) session id的生成借用了web.py. 使用了 redis 的 h ...

  6. 做个简单的Redis监控(源码分享)

    Redis监控 Redis 是目前应用广泛的NoSQL,我做的项目中大部分都是与Redis打交道,发现身边的朋友也更多人在用,相对于memcached 来说,它的优势也确实是可圈可点.在随着业务,数据 ...

  7. Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9941208.html 主讲人:大石头 时间:2018-11-10 晚上20:00 地点:钉钉群(组织代码 ...

  8. 知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路

    本文来自知乎官方技术团队的“知乎技术专栏”,感谢原作者陈鹏的无私分享. 1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动 ...

  9. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

随机推荐

  1. [转]Java虚拟机类加载机制

    原文地址:http://blog.csdn.net/u013256816/article/details/50829596 看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎 ...

  2. Oracle 11gR2 RAC网络配置,更改public ip、vip和scanip

    Oracle 11gR2 RAC网络配置,更改public ip.vip和scanip 转载黑裤子 发布于2018-10-30 01:08:02 阅读数 2898  收藏 展开 转载. https:/ ...

  3. 微信小程序出现 text 设置行高 line-height 无效的问题

    前言: 我在写程序过程中遇到过给text加line-height不生效的问题,但是也有生效的情况,如果不生效了就按下面的解决方法处理吧. 解决办法: 在text的外层嵌套一层view,然后给view设 ...

  4. GO 使用 动态链接库(共享链接库)进行编译 生成动态链接可执行文件

    我们使用 go help buildmode 可以看到 go 可以以多种方式进行构建,默认使用静态链接库. ➜ src go help buildmode The 'go build' and 'go ...

  5. WPF 字体设置

    原文:WPF 字体设置 WPF 主界面 更换字体 可全局 但是有的时候有的窗体 字体还是没变 可以做全局样式 <Window x:Class="CLeopardTestWpf.Main ...

  6. <Math> 29 365

    29. Divide Two Integers class Solution { public int divide(int dividend, int divisor) { if(dividend ...

  7. <DFS & BFS> 286 339 (BFS)364

    286. Walls and Gates DFS: 思路是,搜索0的位置,每找到一个0,以其周围四个相邻点为起点,开始 DFS 遍历,并带入深度值1,如果遇到的值大于当前深度值,将位置值赋为当前深度值 ...

  8. JavaWeb 增删改查功能

    1.今天来写一个简单的增删改查功能,这个项目还是接着在昨天写的 --JavaWeb实现简单登录注册-- 来写的. 登录成功进来后对学生信息的增删改查 2.项目文件为: 3.好了,直接贴上今天新写的代码 ...

  9. Istio修改IngressGateway网络类型

    ingressgateway的默认网络类型是LoadBanlancer,在没有外部负载均衡的情况下可以修改为NodePort. 1.修改 kubectl patch service istio-ing ...

  10. Ubuntu sudo 免密码

    sudo visudo 这里默认打开的是 nano 编辑器,不习惯可以把默认编辑器换成 vim, 参考 Ubuntu 修改默认编辑器 test ALL=NOPASSWD: ALL