Redis基础

本片文章行文思路:

 

 

1 redis 是一个什么东西,概念是什么?

redis 是一个远程 内存 非关系型数据库,提供了不同的数据结构【主要是5钟】,各种问题也就映射到这五种数据结构上解决。

可以存储key与其他不同类型的value 的映射,可以将存储在内存上的键值对持久化到硬盘上,可以通过使用复制特性来扩展读性能,可以使用客户端分片扩展写性能

2 redis 数据结构什么样的?

首先要说明一点的是此处的数据结构指的是存储的值 [value] 的数据结构,此处只讲基本的五种,随着redis 的发现,也有其他的数据类型出现,可以去官网关注。

下面用图的形式表示一下几种结构:

结构类型

结构存储的值

结构的读写能力

应用场景

Hash  【散列】值本身也是一个键值对,无需的添加,获取,移除单元素,获取所有键值对1 保存结构体,将每个字段分开传,取的时候就可以只取需要的字段了。
 List   【列表】是一个链表,链表节点上存储的是一个字符串从链表的两端推入或者弹出元素,根据偏移量进行修剪[trim] ,读取单个或者多个元素,根据值查找或者移除元素

1 异步队列使用【将需要延后处理的任务结构体序列化成字符串进redis 的列表,另一个线程从这个列表中轮询数据进行处理】

2 秒杀场景,秒杀前将本场秒杀的商品放到list中,因为list的pop操作是原子性的,所以即使有多个用户同时请求,也是依次pop,list空了pop抛出异常就代表商品卖完了

Set     【集合】字符串,无序的,各不相同的添加,获取,移除单元素,检测是否存在元素,计算交集,并集,差集,从集合里随机获取元素1 不可重复,但是value可以为null ,用在一些去重的场景,比如用户只能参加一次活动,一个用户只能中一次奖等等去重场景。
String【字符串】可以是字符串,整数或者浮点数对整个字符串或者字符串的一部分进行操作。对整数或者浮点数执行自增 [increment] 或者自减 [decrement] 操作

1 缓存结构体信息【将结构体信息json序列化成一个字符串】

2 计数功能

ZSet   【有序集合】字符串,浮点数与分值之间的一个映射,顺序由分值大小决定添加,获取,移除单元素,更具分值范围或者成员来获取元素1 各类排序场景:歌曲排行榜,播放次数,播放数,点赞数等等需要排序的场景。


 

  

 

 

3 redis 持久化方式

redis 提供了两种不同的持久化方法来将数据持久化到硬盘里。

第一种:快照方法 [snapshotting]

它可以将存在于某个时刻的所有数据都写入到硬盘里。

  创建快照的方式:客户端向redis 发送 bgsave 命令来创建,或者发送save 命令。两者的差别在于 bgsave 是创建一个子进程,子进程负责将快照写入硬盘,父进程继续处理命令请求。而save通常是没有足够内存的时候使用的,接收到save 命令时服务器在创建完快照之前,将不再响应任何命令;还有一些是redis 接受到关闭服务器等的命令时,执行save 命令;一个redis 接收到另一个redis服务器的同步命令时,主服务器会执行 bgsave 命令。

使用快照方式持久命令的时候,因为记录的是某个时间点的快照,所以如果系统崩溃,用户将失去最后一次生成快照之后的数据。所以快照持久化方式只适合于那些即使丢失一部分数据也不会造成问题的应用程序。

 

第二种:只追加文件 [append-only-file,AOF]

AOF 持久化会将被执行的写命令写到AOF 文件的末尾。以此来记录数据发生的变化。所以只要从头执行到尾,也就能恢复数据了。每个redis的写命令都会被写入硬盘,从而系统崩溃时数据丢失能减到最小。但这种方式需要对硬盘进行大量写入,所以redis 处理命令的速度受硬盘性能的限制。转盘式硬盘每秒能处理大概200个命令,固态硬盘每秒大概能处理几万个命令。

 写命令同步频率也是可以调整的【appendfsync】:

选项

同步频率

always每个redis 写命令都哟啊同步写入硬盘,这样做会严重降低redis 的速度
everysec每秒执行一次同步,显示地将多个写命令同步到硬盘
no让操作系统决定应该何时进行同步

 

AOF 持久化缺点:追加的话AOF 的文件体积比较大。

1 Redis不断地将被执行的写命令记录到AOF文件里面,所以随着 Redis不断运行,AOF文件的体积也会不断增长,在极端情况下,体积不断增大的AOF文件甚至可能会用完硬盘的所有可用空间。

2 还有另一个问题就是,因为 Redis在重启之后需要通过重新执行AOF文件记录的所有写命令来还原数据集,所以如果AOF文件的体积非常大,那么还原操作执行的时间就可能会非常长。

解决:

向 Redis发送 BGREWRITEAOF命令,这个命令会通过移除AOF文件中的冗余命令来重写( rewrite)AOF文件,使OF文件的体积变得尽可能地小 BGREWRITEAOF的工作原理和 BGSAVE创建快照的

工作原理非常相似: Redis会创建一个子进程,然后由子进程负责对AOF文件进行重写。

 

持久化到硬盘上还不够,备份到多个不同的地方才足够安全。

两种方法可以同时使用,也可以单独使用,

为什么要将内存中的数据存储到硬盘上?

一方面是防止系统故障而将数据进行备份。另一方面是有些数据是经过大量计算得到的,存储起来之后使用就不用重新计算了。

 

4 复制特性

作用:可以让其他服务器拥有一个不断地更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读请求。在需要扩展读请求的时候,或者在需要写入临时数据的时候,用户可以通过设置额外的 Redis从服务器来保存数据集的副本。在接收到主服务器发送的数据初始副本之后,客户端每次向主服务器进行写入时,从服务器都会实时地得到更新。

复制过程:

 

5 redis 的锁功能与典型的加锁功能的区别

redis:

MULTI:标记一个事务块的开始

EXEC:执行所有事务块内的命令

WATCH: 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

UNWATCH: 放弃本次监控,重新获值再去修改

 

WATCH命令监控一个key,然后MULTI ,EXEC将需要在同一个事务里的命令包裹。如果监控到key 被另外的事务改变时,则UNWATCH。偏向于乐观锁

值得注意的是:redis对事务是部分支持。是全部执行,而没有要求全部执行成功,中途有命令执行错误了,其他不影响。

对于学习Redis基础知识,可以按照以下思路进行学习: 1. 了解Redis的概念和特点:首先需要了解Redis是什么,它的主要特点是什么,它为什么被广泛应用于缓存、消息队列、会话管理等场景。 2. 安装和配置Redis:根据你的操作系统,安装Redis并进行相关配置。可以参考Redis官方文档或其他教程来完成这一步。 3. 学习Redis的数据结构:Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。了解每种数据结构的特点、用途和操作命令,并通过实际操作来加深理解。 4. 掌握Redis的常用命令:学习Redis的常用命令,如get、set、hget、hset、lpush、lrange、sadd、smembers等,了解每个命令的具体用法和参数含义。 5. 理解Redis的持久化机制:了解Redis的RDB和AOF两种持久化方式,以及它们的优缺点。学习如何进行备份和恢复数据。 6. 学习Redis的事务和Lua脚本:了解Redis事务的基本概念和使用方法,以及如何使用Lua脚本来进行复杂的操作。 7. 深入了解Redis的性能优化和高可用方案:学习如何优化Redis的性能,包括配置调优、使用合适的数据结构、合理地使用缓存等。同时了解Redis的高可用方案,如主从复制、哨兵模式和集群模式。 8. 学习Redis与其他技术的结合:了解Redis如何与其他技术进行结合,如与Python、Java等编程语言的配合使用,以及与Spring、Django等框架的整合。 以上是学习Redis基础知识的一个思路,你可以根据自己的实际情况和需求进行学习和拓展。推荐参考一些经典的Redis教程和实战案例,通过实际操作和项目实践来提升自己的技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值