Redis基础知识
Redis 是一种开源(BSD 许可)内存数据结构存储,用作数据库、缓存、消息代理和流引擎。
1 Redis介绍
Redis 是一种开源(BSD 许可)内存数据结构存储,用作数据库、缓存、消息代理和流引擎。Redis 提供数据结构,例如字符串、哈希、列表、集、带有范围查询的排序集、位图、超日志、地理空间索引和流。 Redis 具有内置复制、Lua 脚本、LRU 逐出、事务和不同级别的磁盘持久性,并通过 Redis Sentinel 和 Redis 集群的自动分区提供高可用性。
基于内存的KV键值对内存数据库
Redis在某些场景中明显优于MySQL,比如计数器、排行榜等。两者是共用和配合使用。
功能与应用:
- 分布式缓存,挡在MYSQL数据库之前的带刀护卫。
- 内存存储和持久化(RDB+AOF),redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务。
- 高可用架构搭配。
- 缓存穿透、击穿、雪崩。
- 分布式锁。
- 队列。
- 排行版+点赞。
- 。。。。。。
2 Redis安装
官网下载稳定版
Linux下
1.解压Redis-x.x.x.tar.gz (tar -zxvf Redis-x.x.x.tar.gz)
2.make && make install
等待显示:It‘s a good idea to run ‘make test’ ;)
安装默认目录(/usr/local/bin)
注意:将redis.conf备份一份,这里示例为redis7.conf。修改redis7.conf的内容。
启动服务
执行redis-server myredis/redis7.conf
检测ps -ef|gtep redis|grep -v grep
,6379端口被占有成功。
连接服务
redis-cli -a [密码] -p 6379
关闭服务
单实例关闭 redis-cli -a [密码] shutdown
多实例关闭 redis-cli -p 6379 shutdown
3 Redis十大数据类型
String、List、Hash、Set、ZSet(有序集合)、GEO(地理空间)、HyperLogLog(基数统计)、bitmap(位图)、bitfield(位域)、Stream。
- List(列表):底层实际是个双端链表。
- Hash:一个String类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象。
- Set:String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是intset或者hashtable。Redis中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是0(1)。
- ZSet(short set 有序集合):不允许重复的成员。每个元素都会关联一个double类型的分数,Redis正是通过分数来为集合中的成员进行从大到小的排序。ZSet的成员是唯一的,但分数却可以重复。通过哈希表实现的,所以添加,删除,查找的复杂度都是0(1)。
- GEO:主要用于存储地理位置信息,并对存储的信息进行操作,包括添加、获取地理位置的坐标,计算两个位置之间的距离等。
- HyperLogLog:用来做基数统计的算法。优点:在输入元素的数量或体积非常非长大时,计算基数所需要的空间总是固定并且是很小的。在Redis中,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。HyperLogLog只会根据元素来计算基数,而不会存储元素本身。
- bitmap:由0和1状态表现的二进制位的bit数组。
- bitfield:一次性对多个比特位域(连续的多个比特位)进行操作。
- Stream:主要用于消息队列(MQ)。
Redis常见数据类型操作命令:https://redis.io/commands/
命令不区分大小写,key区分大小写。 help @类型(帮助命令)
具体参考官方文档Understand Redis data types | Redis
4 Redis持久化
Redis 如何将数据写入磁盘
持久性是指将数据写入持久存储,例如固态磁盘 (SSD)。Redis 提供了一系列持久性选项。这些包括:
- RDB(Redis Database ):RDB 持久性以指定的时间间隔执行数据集的时间点快照。
- AOF(Append Only File ):AOF 持久性记录服务器收到的每个写入操作。然后,可以在服务器启动时再次重放这些操作,从而重建原始数据集。命令使用与 Redis 协议本身相同的格式进行记录。
- No persistence :可以完全禁用持久性。这有时在缓存时使用。
- RDB + AOF:您还可以将 AOF 和 RDB 组合到同一个实例中。
AOF配置文件
- 在同时开启rdb和aof持久化时,重启时只会加载aof文件,不会加载rdb文件。
5 Redis事务
可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行执行而不会被其他命令插入,不许加塞。
- 单独的隔离操作:Redis的事务仅仅是保证事务里的操作会被连续独占的执行,Redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的。
- 没有隔离级别的概念:因为事务提交前任何命令指令都不会被执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题。
- 不保证原子性:没有执行到一半进行回滚的能力。
- 排他性:Redis会保证一个事务的命令依次执行,而不会被其他命令插入。
开启:以MULTI开始一个事务
入队:将多个命令入队到食事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面。
执行:由EXEC命令触发事务
一旦执行了exec,之前加的监控锁都会被取消掉了。
当客户端连接丢失的时候(比如退出链接),所有东西都会被取消监视。
6 Redis管道
批处理命令变种优化措施,类似Redis的原生批命令(mget和mset)。
重要提示:当客户端使用pipelining 发送命令时,服务器将被迫使用内存对回复进行排队。因此,如果您需要通过pipelining 发送大量命令,最好将它们分批发送,每个命令包含合理的数量,例如 10k 命令,读取回复,然后再次发送另外 10k 命令,依此类推。速度几乎相同,但使用的额外内存最多是对这些 10k 命令的回复进行排队所需的内存量。
7 Redis复制
主从复制,master以写为主,Slave以读为主。当master数据变化时,自动经新的数据异步同步到其他Slave数据库。
配从(库)不配主(库)。
8 Redis哨兵
官网 Sentinel client spec | Redis
- 监控Redis运行状态,包括master和slave
- 当master down机,能自动将slave转换成master
哨兵的运行流程和选举原理:
当一个主从配置中的master失效之后,sentinel可以选举出一个新的master,用于自动接替原master的工作,主从配置中的其他Redis服务器自动指向新的master同步数据。一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换。
哨兵使用建议:
- 数量应该多个,哨兵本身集群,保证高可用。
- 哨兵节点数量应该是奇数。
- 各个哨兵节点配置应一致。
- 如果部署在Docker中,尤其注意端口的映射。
- 哨兵集群+主从复制,并不能保证数据零丢失。
9 Redis集群
官网 Redis cluster specification | Redis
由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供每个在多个Redis节点间共享数据的程序集。
Redis集群是一个提供在多个Redis节点间共享数据的程序集,Redis集群可以支持多个Master。
Redis集群支持多个Master,每个Master又可以挂载多个Slave。
由于Cluster自带Sentinel的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能。
客户端与Redis节点连接,不再需要连接集群中所有的节点,只需要任意连接集群中的一个可用节点即可。
槽位slot负责分配到各个物理服务节点,由对应的集群来负责维护节点,插槽和数据之间的关系。
哈希取余分区
一致性哈希算法分区:
(目的是当服务器个数发生变动时,尽量减少影响客户端到服务端的映射关系)
将所有的存储节点排列在首尾相连的Hash环上,每个Key在计算Hash后会顺时针找临近的存储节点存放。而当有节点加入或退出时仅影响该节点在Hash环上顺时针的后续节点。
优点:加入和删除节点只影响哈希环中顺时针方向的相邻节点,对其他节点无影响。
缺点:数据的分布和节点位置有关。数据存储时可能达不到均匀分布。