目录: 1、缓存-redis 三种模式搭建和运行原理 2、发帖求助,XAMPP添加redis扩展的问题 3、Redis — 八种数据类型(基本命令) 缓存-redis 三种模式搭建和运行原理 标签: redis 缓存 主从 哨兵 集群 本文简单的介绍redis三种模式在linux的安装部署和数据存储的总结,希望可以相互交流相互提升。 对于Centos7在安装redis之前需要进行一些常用工具的安装: 关闭防火墙 正式安装redis 在redis进行maketest时候会出现一系列的异常,有如下解决方案: 用redis-server启动一下redis,做一些实验没什么意义。 要把redis作为一个系统的daemon进程去运行的,每次系统启动,redis进程一起启动,操作不走如下: RDB和AOF是redis的一种数据持久化的机制。 持久化 是为了避免系统在发生灾难性的系统故障时导致的系统数据丢失。我们一般会将数据存放在本地磁盘,还会定期的将数据上传到云服务器。 RDB 是redis的snapshotting,通过redis.conf中的save配置进行设置,如 save 60 1000: AOF 是以appendonly方式进行数据的储存的,开启AOF模式后,所有存进redis内存的数据都会进入os cache中,然后默认1秒执行一次fsync写入追加到appendonly.aof文件中。一般我们配置redis.conf中的一下指令: AOF和RDB模式我们一般在生产环境都会打开,一般而言,redis服务挂掉后进行重启会优先家在aof中的文件。 当启动一个slave node的时候,它会发送一个PSYNC命令给master node,如果这是slave node重新连接master node,那么master node仅仅会复制给slave部分缺少的数据;否则如果是slave node第一次连接master node,那么会触发一次full resynchronization; 开始full resynchronization的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。RDB文件生成完毕之后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。 slave node如果跟master node有网络故障,断开了连接,会自动重连。master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有slave node。 从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。 master node会在内存中常见一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制,但是如果没有找到对应的offset,那么就会执行一次resynchronization。 master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了,可以有如下配置: slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。 在redis.conf配置文件中,上面的参数代表至少需要3个slaves节点与master节点进行连接,并且master和每个slave的数据同步延迟不能超过10秒。一旦上面的设定没有匹配上,则master不在提供相应的服务。 sdown达成的条件很简单,如果一个哨兵ping一个master,超过了 is-master-down-after-milliseconds 指定的毫秒数之后,就主观认为master宕机 sdown到odown转换的条件很简单,如果一个哨兵在指定时间内,收到了 quorum 指定数量的其他哨兵也认为那个master是sdown了,那么就认为是odown了,客观认为master宕机 如果一个slave跟master断开连接已经超过了down-after-milliseconds的10倍,外加master宕机的时长,那么slave就被认为不适合选举为master (down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state 每次一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个slave来做切换,这个slave还得得到majority哨兵的授权,才能正式执行切换; (2)SENTINEL RESET *,在所有sentinal上执行,清理所有的master状态 (3)SENTINEL MASTER mastername,在所有sentinal上执行,查看所有sentinal对数量是否达成了一致 4.3.2 slave的永久下线 让master摘除某个已经下线的slave:SENTINEL RESET mastername,在所有的哨兵上面执行. redis的集群模式为了解决系统的横向扩展以及海量数据的存储问题,如果你的数据量很大,那么就可以用redis cluster。 redis cluster可以支撑N个redis master,一个master上面可以挂载多个slave,一般情况我门挂载一个到两个slave,master在挂掉以后会主动切换到slave上面,或者当一个master上面的slave都挂掉后,集群会从其他master上面找到冗余的slave挂载到这个master上面,达到了系统的高可用性。 2.1 redis cluster的重要配置 2.2 在三台机器上启动6个redis实例 将上面的配置文件,在/etc/redis下放6个,分别为: 7001.conf,7002.conf,7003.conf,7004.conf,7005.conf,7006.conf 每个启动脚本内,都修改对应的端口号 2.3 创建集群 解决办法是 先安装rvm,再把ruby版本提升至2.3.3 使用redis-trib.rb命令创建集群 –replicas: 表示每个master有几个slave redis-trib.rb check 192.168.31.187:7001 查看状体 3.1 加入新master 以上相同配置完成后,设置启动脚本进行启动;然后用如下命令进行node节点添加: 3.2 reshard一些数据过去 3.3 添加node作为slave 3.4 删除node 发帖求助,XAMPP添加redis扩展的问题 首先检查你的php是否能正常加载redis.dll,用phpinfo或者php -i来确认下里面是否有redis的信息。 然后排除权限以及访问限制等问题,手动telnet你的redis server是否正常? 正确的编译方法是 #wget ip/files/redis-2.4.7.tar.gz #tar xzf redis-2.4.7.tar.gz #cd redis-2.4.7 #make //注意不需要 phpize 服务器端 #make install 这里记得复制配置文件到系统文件夹(默认内容,配置需要自己设置) #cp redis.conf /etc/ 然后执行 # src/redis-server 即可 Redis — 八种数据类型(基本命令) String、Hash、List、Set和Zset。 等同于java中的, MapString,String string 是redis里面的最基本的数据类型,一个key对应一个value。 应用场景 :String是最常用的一种数据类型,普通的key/value存储都可以归为此类,如用户信息,登录信息和配置信息等; 实现方式 :String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作(自增自减等原子操作)时会转成数值型进行计算,此时redisObject的encoding字段为int。 Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能。 Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS。 Redis的字符串也会遵守C语言的字符串的实现规则,即 最后一个字符为空字符。然而这个空字符不会被计算在len里头。 Redis动态扩展步骤: Redis字符串的性能优势 常用命令 :set/get/decr/incr/mget等,具体如下; ps:计数器(字符串的内容为整数的时候可以使用),如 set number 1。 补充: 等同于java中的: MapString,MapString,String ,redis的hash是一个string类型的field和value的映射表, 特别适合存储对象。 在redis中,hash因为是一个集合,所以有两层。第一层是key:hash集合value,第二层是hashkey:string value。所以判断是否采用hash的时候可以参照有两层key的设计来做参考。并且注意的是, 设置过期时间只能在第一层的key上面设置。 应用场景 :我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID我们希望获取该用户的姓名或者年龄或者生日; 实现方式 :Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口。如,Key是用户ID, value是一个Map。 这个Map的key是成员的属性名,value是属性值 。这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据。 当前HashMap的实现有两种方式 :当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时redisObject的encoding字段为int。 常用命令 :hget/hset/hgetall等,具体如下: 等同于java中的 MapString,ListString ,list 底层是一个链表,在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一样插入两层的key。 list是一种有序的、可重复的集合。 应用场景 :Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现; 实现方式 :Redis list的实现为一个 双向链表 ,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括 发送缓冲队列 等也都是用的这个数据结构。 常用命令 :lpush/rpush/lpop/rpop/lrange等,具体如下: 性能总结 : 它是一个字符串链表,left、right都可以插入添加。 等同于java中的 MapString,SetString ,Set 是一种无序的,不能重复的集合。并且在redis中,只有一个key它的底层由hashTable实现的,天生去重。 应用场景 :Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动去重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且 set提供了判断某个成员是否在一个set集合内的重要接口 ,这个也是list所不能提供的;如保存一些标签的名字。标签的名字不可以重复,顺序是可以无序的。 实现方式 :set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。 常用命令 :sadd/spop/smembers/sunion等,具体如下: ZSet(Sorted Set:有序集合) 每个元素都会关联一个double类型的分数score,分数允许重复,集合元素按照score排序( 当score相同的时候,会按照被插入的键的字典顺序进行排序 ),还可以通过 score 的范围来获取元素的列表。 应用场景 :Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以 通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。 当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。 底层实现 : zset 是 Redis 提供的一个非常特别的数据结构,常用作排行榜等功能,以用户 id 为 value ,关注时间或者分数作为 score 进行排序。实现机制分别是 zipList 和 skipList 。规则如下: zipList:满足以下两个条件 skipList:不满足以上两个条件时使用跳表、组合了hash和skipList 为什么用skiplist不用平衡树? 主要从内存占用、对范围查找的支持和实现难易程度这三方面总结的原因。 拓展:mysql为什么不用跳表? 常用命令 :zadd/zrange/zrem/zcard等; 官网地址: 可以用来推算两地之间的距离,方圆半径内的人。 关于经度纬度的限制: 一般我们使用Hyperloglog做基数统计。 什么是基数?就是一个集合中不重复的数的个数。 集合A:{1,3,5,7,9,7} 集合B:{1,3,5,7,9} AB集合的基数都是5 应用:统计网站的访问量(一个人访问网站很多次仍然算作一次)。 优点:占用的内存是固定的,找2^64次方个数的基数,只需要12KB内存。 缺点:有0.81%的错误率,可以忽略不计 概述: bitmap 存储的是连续的二进制数字(0 和 1),通过 bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。 我们知道 8 个 bit 可以组成一个 byte,所以 bitmap 本身会极大的节省储存空间。 应用场景: 适合需要保存状态信息(比如是否签到、是否登录…)并需要进一步对这些信息进行分析的场景。比如用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。 针对上面提到的一些场景,这里进行进一步说明。 使用场景一:用户行为分析 很多网站为了分析你的喜好,需要研究你点赞过的内容。 使用场景二:统计活跃用户 使用时间作为 key,然后用户 ID 为 offset,如果当日活跃过就设置为 1 那么我该如果计算某几天/月/年的活跃用户呢(暂且约定,统计时间内只有有一天在线就称为活跃),有请下一个 redis 的命令 使用场景三:用户在线状态 对于获取或者统计用户在线状态,使用 bitmap 是一个节约空间效率又高的一种方法。 只需要一个 key,然后用户 ID 为 offset,如果在线就设置为 1,不在线就设置为 0。 补充 : 巨人的肩膀: 【宝塔redis扩展】的内容来源于互联网,若引用不当,请发邮件456@456.cn联系删除
相关文章
猜你喜欢

