拓薪教育-redis教程(2)

2019-02-15 18:31

我勒个去,出异常了,could not connect to redis Instance at 127.0.0.1:6379,server 忘记打开了。

赶紧去打开终端执行一下 ./redis-server 命令,再运行一下,发现没有返回 testvalue001,而是System.Byte[]。

是的,调用 Get 方法返回的类型就是byte数组,ServiceStack.Redis 提供了另一个 Get 方法的重载,要想返回 string,我们只需要改成这样:

var value = redis.Get( \这次返回的结果就没错了。

ServiceStack.Redis 还提供了一系列的其他功能函数,都对应着 Redis 命令,整个 API 的命令还是比较规范的,一看方法名就能大致明白是什么意思,风格非常的 restful。

关于其他函数的功能,我也不想一一列举了,网上一搜一大把,这些放一个连接供大家参考。 下一篇我将为大家介绍 Redis 的配置。

随笔- 17 文章- 3 评论- 168

高性能网站架构设计之缓存篇(3)- Redis 的配置

我们说Redis是一个强大的Key-Value存储系统,在前面我们已遇到了两个问题: 1、redis server 启动后,独占进程,能不能修改为后台服务呢?

2、redis server 服务是单线程的,而我的机器是多核的,能不能在同一台机器上开启多个实例更充分的利用 cpu 资源呢?但6379端口已经被前一个实例绑定,肯定会有冲突,那能不能修改默认端口呢? 答案是肯定的,redis 提供了灵活的配置方式,一种可以通过配置文件来配置,另一种你可以在运行时通过 config set 命令来修改配置。 我们先来看看配置文件吧。

殊不知我们在前面启动 server 的时候敲的 ./redis-server 命令,如果后面不附加参数,它是按默认配置来启动 redis 服务的,其实它后面还可以附加一个配置文件路径的参数。这个配置文件在哪?在redis根目录下有一个redis.conf文件,这个文件为了提供了默认的配置和示例。你不要轻易去动这个文件,除非你非常牛逼。我们还是保险起见先复制一个副本吧。打开副本我们发现这个文件真的好大好长啊,全是英文看得我也难受啊,也不见哪座大神帮忙翻译一下,给个现成的中文版,太自私了吧,哥今天一晚不睡也要给你们一个交代。

太长了,翻译了一个晚上才搞了一部分出来,不过主要的配置项都翻译出来了,我后面有时间继续翻译。看这里。记得顺便去关注一下我的 restful.data 。

把这个文件下载下来后,拷贝到 src 目录下面,也就是和 redis-server 在同一个目录,方便我们操作。 我们稍微改一下配置,看看能不能把我们前面提到的两个问题解决了。

首先我们修改 daemonize 配置项,把它设置为 yes,打开终端,我们执行一下 redis-server 命令。

zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis/src zhaoguihuadediannao:src zhaogh$ ./redis-server ./redis.conf zhaoguihuadediannao:src zhaogh$ ./redis-cli 127.0.0.1:6379>

是不是已经不再独占进程了,启动守护进程后,我们仍然可以执行 redis-cli 命令。 先停掉 redis 服务:

127.0.0.1:6379> shutdown 127.0.0.1:6379> quit

zhaoguihuadediannao:src zhaogh$

然后我们修改 port 配置项为 6378,然后再启动服务:

zhaoguihuadediannao:src zhaogh$ ./redis-server ./redis.conf zhaoguihuadediannao:src zhaogh$ ./redis-cli

Could not connect to Redis at 127.0.0.1:6379: Connection refused not connected>

因为我们修改了默认端口号,已经连不上去了,尝试加上端口参数。

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 6378 127.0.0.1:6378> 成功了连上了。

篇幅有限,redis.confi 中其他配置项请大家结合注释去深入的了解。 下面介绍另外一种配置方式,通过命令行来配置。

假如说我们不想修改配置文件来启动指定端口号的redis服务,我们可以在终端上执行下面的命令:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 6379 --daemonize yes zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 6379 127.0.0.1:6379>

但我还是推荐使用配置文件的方式。

如果在生产环境里面需要修改某些配置项,但我们又不想停掉服务,怎么办?

Redis允许在运行的过程中,在不重启服务器的情况下更改服务器配置,同时也支持使用特殊的CONFIG SET和 CONFIG GET命令用编程方式查询并设置配置。

127.0.0.1:6379> config get port 1) \2) \

127.0.0.1:6379>

127.0.0.1:6379> config set port 6380

(error) ERR Unsupported CONFIG parameter: port 127.0.0.1:6379>

我试图直接修改端口号,没有成功,我是有点想当然了,因为一旦修改端口必然需要重启服务,重新绑定端口,所以并不是所有的配置项都能在运行时进行修改。 那我们来修改一个允许修改的配置项。

127.0.0.1:6379> config set tcp-keepalive 60 OK

127.0.0.1:6379>

上面的例子,我把心跳包发送时间间隔修改成了60秒。你们可以自己尝试着去修改其他配置项。 技术上有很多事情不是靠看几篇文章,通过道听途说就能明白的,想要真正弄清楚,必须要自己亲自去尝试,实践才是检验真理的唯一标准,就像很多朋友给我推荐车一样,说这车好,那车差,其实自己都没开过,我发现很多程序员嘴上都说的一套一套的,实际做起事来真不行,这样的人适合做销售,会忽悠,当然这也是种能力。

随笔- 17 文章- 3 评论- 168

高性能网站架构设计之缓存篇(4)- Redis 主从复制

Redis 的主从复制配置非常容易,但我们先来了解一下它的一些特性。

1. redis 使用异步复制。从 redis 2.8 开始,slave 也会周期性的告诉 master 现在的数据量。可能只是

个机制,用途应该不大。 2. 3.

一个 master 可以拥有多个 slave,废话,这也是业界的标配吧。

slave 可以接收来自其他 slave 的连接。意思是不是就是说 slave 在接收其他的slave的连接

之后成为 master ?等下我们来验证。

4. redis 复制在 master 这一端是非阻塞的,也就是说在和 slave 同步数据的时候,master 仍然可以执

行客户端的操作命令而不受其影响。这点都不能保证,要你干嘛?

5. redis 复制在 slave 这一端也是非阻塞的。在配置文件里面有 slave-serve-stale-data 这一项,如果

它为 yes ,slave 在执行同步时,它可以使用老版本的数据来处理查询请求,如果是 no ,slave 将返回一个错误。在完成同步后,slave 需要删除老数据,加载新数据,在这个阶段,slave 会阻止连接进来。 6.

Replication can be used both for scalability, in order to have multiple slaves for

read-only queries (for example, heavy SORT operations can be offloaded to slaves), or simply for data redundancy.这句话我也没理解什么意思。

7. 使用复制可以避免 master 因为需要把全部的数据集写入磁盘而造成的开销,因此可以把 master 中

save 配置项全部注释掉,不让它进行保存,然后配置 slave ,让 slave 保存。虽然有这个特性,但是我们好像一般不这么做。 好吧,我们做几个例子练习一下。

先打开三个终端,然后起三个实例,分别用三个 client 去连接它们:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10000 --daemonize yes zhaoguihuadediannao:src zhaogh$

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10000 端口10000的做 master。

slave 01:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10001 --daemonize yes zhaoguihuadediannao:src zhaogh$

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10001 slave 02:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10002 --daemonize yes zhaoguihuadediannao:src zhaogh$

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10002

上面只是让它们的实例启动了并用客户端去连接它,并没有设置主从关系。在 slave 01 和 slave 02 上执行下面的命令:

127.0.0.1:10001> slaveof 127.0.0.1 10000 OK

127.0.0.1:10001>

这样就设置好了主从关系。我们来试试有没有效果。

127.0.0.1:10001> get testkey001 (nil)

127.0.0.1:10001> 这个时候是没有值的。 master 上执行:

127.0.0.1:10000> set testkey001 testvalue001 OK

127.0.0.1:10000> 然后看看 slave 上有没有:

127.0.0.1:10001> get testkey001 \127.0.0.1:10001>

127.0.0.1:10002> get testkey001 \127.0.0.1:10002>

有了,是不是比***点读机还 easy ?已经有了感性的认识,我们来介绍一下它的原理吧。

当你设置了主从关系后,slave 在第一次连接或者重新连接 master 时,slave 都会发送一条同步指令给 master ;

master 接到指令后,开始启动后台保存进程保存数据,接着收集所有的数据修改指令。后台保存完了,master 就把这份数据发送给 slave,slave 先把数据保存到磁盘,然后把它加载到内存中,master 接着就把收集的数据修改指令一行一行的发给 slave,slave 接收到之后重新执行该指令,这样就实现了数据同步。

slave 在与 master 失去联系后,自动的重新连接。如果 master 收到了多个 slave 的同步请求,它会执行单个后台保存来为所有的 slave 服务。

一旦 master 和 slave 在失去联系并重新连接上,总是会重新进行一次完整的同步。不过从 redis 2.8 开始,只是部分重新同步也是可以的。具体请大家参考官方文档。

随笔- 17 文章- 3 评论- 168

高性能网站架构设计之缓存篇(5)- Redis 集群(上)

集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力。

上一篇我们讲到了 Redis 的主从复制技术,当实现了多节点的 master-slave 后,我们也可以把它叫做集群,但我们今天要讲的集群主要是利用切片技术来组建的集群。

集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点,这里我们需要一个规则或者算法,通常的做法是获取 key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的 key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。

一致性哈希有四个重要特征:

均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。

单调性:对于单调性有很多翻译让我非常的不解,而我想要的是当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。

分散性和负载:这两个其实是差不多的意思,就是要求一致性哈希算法对 key 哈希应尽可能的避免重复。 但一致性哈希不是我们今天要介绍的重点,因为 Redis 引入另一种哈希槽(hash slot)的概念。 Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。 使用哈希槽的好处就在于可以方便的添加或移除节点。

当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了; 当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;

内部机制,与我何干,对于我们来说,在新增或移除节点的时候不要让我们先停掉所有的 redis 服务我就谢天谢地了,这点它做到了。

下面我们就开始动手搭建一个 redis 集群来体验一下。

因为我们要启动多个 redis 实例,虽然我们可以直接通过命令行来启动,但始终是不怎么方便的,所以我们先来新建三个实例目录,分别是9001,9002,9003,目录名就是 redis 实例的端口号。


拓薪教育-redis教程(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:学生管理系统需求分析+总体设计+详细设计

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: