redis总结
Redis是非关系数据库,使用键值对存储数据;非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
Redis 主要是用于缓存系统的,并且是单线程
Redis 作为一个数据库,很多开发者还可以单独使用它。事实上,更多时候 Redis 是在数据库和代码中间作为一个中间件使用,
Redis支持的数据***************************:
1,string (字符串)
2,list(有序集合)链表结构,利于排行????,如粉丝列表
3,hash(哈希)---->储存的是对象
4,set(集合)
5,zset(有序集合)每个元素都会关联一个double类型的分数
通过分数来为集合中的成员进行从小到大的排序。
6,Pub/Sub 发布订阅
7,事务(multi,exec,watch)
Redis的优点***********************************:
1,读取速度快,对较大数据处理快
2,持久化
3,没有关联关系,数据结构简单,拓展表比较容易
Redis适用场景******************************:
1,数据高并发的读写
2,海量数据的读写
3,对扩展性要求高的数据
Redis 最大的作用是增加你原来的访问性能问题,Redis 独特的存在是只需要增加一层,把常用的数据存放在 Redis 即可。你在开发环境中使用 Redis 功能,但却不需要转到 Redis。
Redis的运用************************************:
1,缓存系统
2,计数器,比如转发数,评论数,点赞数,查询在页面停留不超过30 秒的用户
3,消息队列系统,,??????
4,排行榜及相关问题,比如游戏的排名
5,社交网络 (观察者模式)
6,按照用户投票和时间排序,
7,过期项目处理
8,实时系统,比如垃圾邮件过滤
redis保存持久化的方式有两种**************************:
RDB(快照):在指定的时间间隔内将内存中的数据集快照写入磁盘
实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
缺点是RDB容易造成数据的丢失。
AOF持久化:
以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
OF 文件通常会比 RDF 文件体积更大。
持久化的一些使用建议:
如果redis仅仅是用来做为缓存服务器的话,我们可以不使用任何的持久化。
redis的主从复制(master---slave)************************:
优点:
1.实现读写分离
2.降低master的压力
3.实现数据的备份
主从复制需要注意的地方:
1.如果master已经运行了一段时间,slave才连上来,此时slave会对master的所有数据进行同步,而不是从连接上的时间点同步!
2.master节点可读可写,但是slave节点只读不可写(如果非要写可以修改redis.conf文件中的slave-read-only的值来实现)
3.在当前的这个主从结构中,如果master挂点,重启后依然还是master,主从操作依然可用。
全量复制:在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份
增量复制:Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令
注意只要是slave重新连接master都会自动执行一个全量复制
Redis之哨兵模式:*******************************
哨兵的作用是监控Redis系统的运行状态,
功能包括以下两个:
1,监控主数据库和从数据库是否正常运行
2,主数据库出现故障时自动将从数据库转换为从数据库
注意点:
1,哨兵模式只需要配置其监控的主数据库即可,哨兵会自动发现所有复制该数据库的从数据库
2,哨兵启动后会与要监控的主数据库建立两条连接:
连接2:一条是向主数据库发送消息;
连接1:另一条订阅了“_sentinel_:hello”频道的消息
3,哨兵会在连接2发送以下命令:
1):每10秒哨兵会向主数据库和从数据库发送INFO命令,
发送INFO命令会返回当前数据库的相关信息(运行id,从数据库信息等)从而实现新节点的自动发现,前面提到的配置哨兵时只需要监控Redis主数据库即可,因为哨兵可以借助INFO命令来获取所有的从数据库信息(slave),进而和这两个从数据库分别建立两个连接。在此之后哨兵会每个10秒钟向已知的主从数据库发送INFO命令来获取信息更新并进行相应的操作。
2)每2秒钟哨兵向主数据库和从数据库的_sentinel_:hello频道发送 自己的消息
哨兵向主从数据库的_sentinel_:hello 频道发送信息来与同样监控该数据库的哨兵分享自己的信息(多个哨兵的关联)
3)每秒钟哨兵会向主数据库.从数据库和其他哨兵节点发送ping命令
每隔一定时间向这些节点发送PING命令来监控,,如果被PING的数据库或节点仍然未回复,则哨兵认为其主观下线(subjectively down),主观下线表示从当前的哨兵进程看来,该节点已经下线。
注意:
在主观下线后,如果该节点是主数据库,则哨兵会进一步判断是否需要对其进行故障恢复,并发送命令询问其他哨兵节点以了解他们是否也认为该主数据库主观下线,如果达到指定数量时,哨兵会认为其客观下线,并选举领头的哨兵节点对主从系统发起故障恢复,选出领头哨兵后,1.领头哨兵将从停止服务的主数据库的从数据库中挑选一个来充当新的主数据库。2.将已经停止服务的旧的主数据库更新为新的主数据库的从数据库,使得当其恢复服务时自动以从数据库的身份继续服务。
Redis集群***********************************
集群的概念:
集群中每台服务器就叫做这个集群的一个“节点”,所有节点构成了一个集群。每个节点都提供相同的服务,那么这样系统的处理能力就相当于提升了好几倍(有几个节点就相当于提升了这么多倍)。
概念:
Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。(多个master)
Redis的分片策略:
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽
Redis实现限制访问频率*******************
1,实现访问一:
当用户第一次访问服务器时,会开启一个事务,对用户的key执行incr命令(默认为0+访问次数),并设置过期时间。访问一次incr就加1,如果在过期时间内超过了访问限制次数就会限制访问,
缺陷:两个连续的过期时间里,,比如如果用户第过期的访问了99次,前面58秒访问了9次,后面1秒访问了90次,然后用户后一个过期时间也访问了99次,而后一分钟的第一秒访问了90次,在中间的两秒内访问了180次。这是不允许的。
2,实现访问二:
服务器使用一个list来记录(限制时间内)每次访问时间,如果访问次数达到了限制时间的访问的次数,就会判断第一次和最后一次的时间间隔发否小于限制时间,如果小于就限制访问,大于就删除最早的访问时间,保持list的个数为限制次数。
Redis的缓存:**********************************
缓存(Cache)的作用是减少服务器对数据源的访问频率,从而提高数据库的稳定性。
缓存的方式:
1,永久存在
注意:禁止直接访问数据源,禁止其他系统操作同一个数据源,DML操 作应该把缓存的数据删除,
2,设置过期时间
注意:不要将过期时间统一设置,针对不同商品设置不同过期时间
都得保证数据源和缓存的数据保持同步。
缓存穿透:是指查询一个数据库一定不存在的数据
解决方案:从数据库查询的对象为空,也放入缓存,只是设定的缓存过期 时间较短
缓存雪崩:是指在某一个时间段,缓存集中过期失效
解决方案:灵活设置过期时间。
缓存击穿:大并发集中对这一个点进行访问,当这个key在失效的瞬间 ,持续的大并发就穿破缓存,直接请求数据库
解决方案:。解决方式直接设置为永久key就可以了
总结:
1.设置Redis最大使用内存是必须的。
2.通过不同的策略设置过期时间。
3.如果是热点key我们可以直接设置为永久key。