关于Redis一整套数据结构整理

redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库。它支持包括String、List、Set、Zset、hash五种数据结构。除此之外,通过复制、持久化和客户端分片等特性,用户可以很方便地将redis扩展成一个能够包含数百GB数据和每秒处理上百万次的请求的系统。
在这里插入图片描述

Geospatial:
把某个具体的位置信息(经度,纬度,名称)添加到指定的key中,数据将会用一个sorted set存储,以便稍后能使用 GEORADIUS和 GEORADIUSBYMEMBER命令来根据半径来查询位置信息。
这个命令(指GEOADD)的参数使用标准的x,y形式,所以经度(longitude)必须放在纬度(latitude)之前,对于可被索引的坐标位置是有一定限制条件的:非常靠近极点的位置是不能被索引的

Replication:
Redis 支持简单且易用的主从复制(master-slave replication)功能, 该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品。
Redis 使用异步复制。 从 Redis 2.8 开始, 从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度。
一个主服务器可以有多个从服务器。
不仅主服务器可以有从服务器, 从服务器也可以有自己的从服务器, 多个从服务器之间可以构成一个图状结构。

replication 主要用于解决两个问题:

1. 读扩展
一个 master 用于写,多个 slave 用于分摊读的压力。
2. 高可用
如果 master 挂掉了,可以提升(promote)一个 slave 为新的 master,进而实现故障转移(failover)。

Lua scripting:
从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用 EVAL 命令对 Lua 脚本进行求值
Redis2.6内置的Lua Script支持,可以在Redis的Server端一次过运行大量逻辑。
• 整个Script默认是在一个事务里的。
• Script里涉及的所有Key尽量用变量,从外面传入,使Redis一开始就知道你要改变哪些key。
• EVAL每次传输一整段Script比较费带宽,可以先用SCRIPT LOAD载入script,返回哈希值。然后用EVALHASH执行。
• 内置的LUA库里还很贴心的带了CJSON,可以处理JSON字符串。
把客户端的程序脚本代码转移到服务器端缓存,减少数据来回的开销,还有“原子性”。

LRU eviction:
当有写数据的请求到达redis主服务器时,如果redis主服务器中的内存已达到配置的maxMemory
将会按照配置好的驱逐策略,清除key;
大体分为以下几种:
1.LRU(最近最少使用);
2.LFU(最少使用);每个key都存储一个使用频率,根据此值做驱逐,频率值会衰减,后面会说;
Random(随机删除),ttl(过期时间剩余最短)
Volatile-lru->针对具有到期设置的key,进行LRU模式淘汰;
allkey-lru->针对所有key,使用LRU模式淘汰;
Volatile-LFU->在设置了过期的key中使用LFU模式淘汰;
allkey-lFU->在所有key中进行LFU模式淘汰;
Volatile-Random->从设置了过期的key中随机淘汰;
allkey-Random->随机淘汰任意key;
volatile-ttl->淘汰过期时间最近的key(Minor TTL);
noeviction->不淘汰任何内容,在写入操作中返回错误;

Transactions:
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
批量操作在发送 EXEC 命令前被放入队列缓存。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
1.开始事务。
2.命令入队。
3.执行事务。

Persistence:
当使用Redis进行数据操作的时候,不可避免的能会遇到一些意外的情况导致Redis停止工作,诸如宕机,电源断电等因素。此时Redis提供了RDB以及AOF两种方式来进行数据的备份,两者各有优缺点。可以选择其中的一个单独使用,也支持两者同时使用。通常的情况下AOF保存的数据会比RDB完整,此外在两者同时使用的情况下会优先载入AOF来进行数据恢复。

Sentinel:
 ·监控(Monitoring):sentinel会不间断地检查Redis master和Redis slave是否正常运行
  ·提醒(Notification):当其中一个被监控的Redis实例出现问题,sentinel能通过API或其他程序通知管理员
  ·自动故障转移(Automatic failover):当Redis master故障不能正常工作时,sentinel会故障切换进程,将一个slave提升为master,另外的Redis slave将更新配置使用新的master,此后有新连接时,会连接到新的Redis master
  ·配置提供者(Configuration provider):Redis充当客户端服务发现的权威来源:客户端连接到sentinel,以请求当前可靠的Redis master地址,若发生故障转移,sentinels将报告新地址
  
Sentinel的分布式特性
  Redis sentinel是一个分布式系统,可以在一个架构中运行多个sentinel进程,优势如下:
    · 1. 当多个sentinels确定master不再可用,就进行故障检测,这降低了误报的可能性
    · 2. 当在不同服务器上运行多个sentinel进程,然后将sentinel做集群,即使其中一个故障,也可以进行热切换,降低对客户端的影响,从而提升了系统健壮性
    · 3.Redis客户端可连接任意sentinel来使用Redis集群

Cluster:
分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。

分区的优势

通过利用多台计算机内存的和值,允许我们构造更大的数据库。
通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。

分区的不足

redis的一些特性在分区方面表现的不是很好:
涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。
涉及多个key的redis事务不能使用。

当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件。增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的。

Redis 有两种类型分区,假设有4个Redis实例 R0,R1,R2,R3,和类似user:1,user:2这样的表示用户的多个key,对既定的key有多种不同方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到某个Redis服务。
在这里插入图片描述
扫码关注获取Java资源!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT Talk

谢谢您对我的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值