高可用Redis:Redis Cluster

Redis Cluster是Redis官方提供的Redis集群功能。 为什么现需要Redis Cluster 主从复制不能满足高可用的要求 随着业务的发展,需要更高的QPS 数据量的增长导致服务器内存不足以存储 网络流量的增长,业务的流量已经超过了服务器的网卡的上限值,可以考虑使用分布式技术来进行分流。 离线计算,需要中间环节缓冲等别的需求。 数据分布当单机的redis节点无法满足要求,按照分区规则把数据分到若干个子集中。

Redis设计与实现读书笔记二

redis服务器redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理器来维持服务器自身的运转。 命令请求的过程加入我们使用了这样一天个命令 12redis> SET KEY VALUEOK 整个执行的流程 客户端会将命令转换为协议格式,然后通过连接到服务器的套接字按协议格式的命令请求发送给服务器。 当客户端与服务器之间连接的套接字变得可读时,服务器调用命令求情处理器。 读取套接字中协议格式的命令,将它保存到客户端状态的输入缓冲区里。 对输入缓冲区中的数据进行分析,将请求参数存入argv中,参数个数保存在argc中。 根据请求参数(查找命令表),调用相应的命令执行器,执行指定的命令(在正式执行之前还会检测出参数个数是否正确,客户端是否通过身份认证,如果服务器打开了maxmenory功能,那么在执行命令之前,先检查服务器的内存占用情况,并在需要时进行内存回收,之后再进行执行,并且服务器没被阻塞)。 再实现函数调用之后,还会执行一系列的后续工作,比如检查是否需要记录到慢查询日志,更新命令的redisCommand结构的milliseconds属性,并将器calls属性加一,如果开启了AOF持久化功能,那么将刚才的命令写入到AOF缓冲区中,如果有其它服务器正在复制这个服务器,那么服务器会见刚刚执行的命令传播到所有从服务器。

Redis设计与实现读书笔记一

简单动态字符串Redis没有直接使用C语言中的以空字符结尾的字符串。而是自己构建了一种名为简单动态字符串(SDS)的抽象类型。Redis中直接使用C字符串的地方仅仅是那些不需要对字符串进行修改的地方,作为字面量使用。Redis底层使用了大量的SDS。比如set msg "hello world",这个命令会建立一个键值对,Redis会为msg创建一个SDS,为’hello world’创建一个键值对。 SDS的定义12345struct sdshdr{ int len; //记录buf中已经使用的字节数,等于SDS所保存的字符串的长度 int free; //记录buf中空闲的字节的数量 char buf[]; //字节数组,用于保存字符串}

Redis实战学习笔记二

使用Redis构建支持程序案例一: 使用Redis实现日志的记录需求: 在构建应用程序和服务的过程中,对正在运行的系统的相关信息进行挖掘变得越来越重要。这都依赖于日志。 分析: 许多日志的记录的方式都是将日志记录到文件中去,然后随着时间的流逝新建日志文件(因为日志文件大大小不可能无限的增长),因为每个服务都有相应的日志记录,并且每种服务的日志轮换机制也是不同的,这就会缺少了一种将这些日志聚合的方案。还有一种日志记录方式是利用syslog服务来进行日志的记录。syslog服务接收各个服务的日志信息,并路由到不同的磁盘上,它还负责日志的轮换和删除工作。它要比直接写文件方便的多。 我们也可以利用Redis来实现日志的记录。 实现方式: 12345678910111213141516171819202122SEVERITY={ # 设置一个字典,将日志的安全级别映射为字符串 loggin.DEBUG:'debug', loggin.INFO:'info', loggin.WARNING:'warning', loggin.ERROR:'error', loggin.CRITICAL:'critical'}SERVERITY.update((name,name) for name in SERVERITY.values())def log_recent(conn,name,message,severity=loggin.INFO,pipe=None): # 将日志的安全级别映射为简单的字符串 severity=str(SEVERITY.get(severity,severity)).lower() # 创建负责存储消息的键 destination='recent:%s:%s'%(name,severity) # 在消息中添加当前时间 message=time.asctime()+' '+message # 使用流水线通信方式 pipe=pipe or conn.pipeline() pipe=lpush(destination,message) # 对日志列表进行修剪,只保留100条消息 pipe.ltrim(destination,0,99) # 执行两个命令 pipe.execute()

Redis实战学习笔记一

初识RedisRedis是一个远程内存数据库。它是一个速度非常快的非关系型内存数据库。它可以存储键到五种类型的映射。并且可以将存储到内存中的数据持久化到磁盘。并且可以使用复制特性来提高读性能,使用客户端分片来提高写性能/ Redis的独到之处Redis不同于我们常用的MySQL数据库的一个特性是它是非关系型数据库。简单的讲就是不会使用表。 它和memcached的一大不同之处在于它支持多种不同的数据类型,而memcached只支持字符串键。 Redis还有一个独特之处在于它是内存数据库。因为内存是易失性存储,所以不得不考虑持久化的问题。Redis的持久化提供了两种方案,一种是时间点转储,第二种方案就是将所有修改了数据库的命令写入一个只追加的文件中,根据用户的设置可以选择从不同步、每秒同步一次或者没写入一个命令就同步一次。

Redis入门

RedisRedis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库, redis支持数据的持久化,可以将内存中的数据存储到磁盘中。 不仅仅支持key-value类型的数据,还支持list,set,zset,hash等数据结构 支持数据的备份 redis的特点 极高的性能,读取速度可达110000次/s;写的速度高达81000次/s 支持多种数据类型 所有操作都是原子性的(包括多步操作) 其它特性 redis的数据类型和相关命令 string 字符串 一个键最大可以存512mb 123456789101112131415161718192021222324252627//存入set mykey "hello word"//取出get mykey//返回key中的字符串的子字符串getrange key start end// 将key的值设为value并返回旧值getset key value//对key所存储的字符串,获取指定偏移量上的位getbit key offset//获取所有给定key的值mget key1 [key2...]//对所有key存储的字符串,设置或清除指定偏移量上的位setbit key offset value//将值value关联到key,并将key的过期时间设为secondssetex key seconds value//只有在key不存在时设置key的值setnx key value//返回key所存储的字符串的长度srtlen key//将key中存储的值加一incr key//将key所存储的值加上给定的增量值incrbyfloat key increment//在key后面追加字符串append key value