redis入门级理解--基础

一、什么是redis

reids是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可以持久化。

二、redis的应用场景

1.会话缓存(最常用)
2.消息队列,比如支付
3.活动排行榜或计数。
4.发布订阅消息(消息通知)
5.商品列表,评论列表等

三、五种数据结构即使用场景

1.字符串

redis没有直接使用C语言传统的字符串表示,而是自己实现的叫做简单动态字符串SDS的抽象类型。C语言的字符串不记录自身的长度信息,而SDS则保存了长度信息,这样将获取字符串长度的时间由O(N)降低到了O(1),同时可以避免缓冲区溢出和减少修改字符串长度时所需的内存重分配次数。
字符串类型实际上可以是字符串(简单的字符串、复杂的字符串(xml、json)、数字(整数、浮点数)、二进制(图片、视频等),但最大能超过512M)
使用场景
1.缓存功能:字符串最经典的使用场景,redis作为缓存层,MySQL作为存储层,绝大部分请求数据都是redis种获取,由于redis具有支撑高并发特性,所以缓存通常能起到加速读写和降低后端压力的作用。
2.计数器:许多应用都会使用redis作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时,数据可以一步落地到其他的数据源。(如视频播放数系统就是使用redis作为视频播放数计数的基础组件。)
3.共享session:出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不同服务器上,用户刷新依次访问可能会需要重新登录,为避免这个问题可以用redis将用户session集中管理,在这种模式下只要保证redis的高可用和拓展性的,每次获取用户更新或查询登录信息都直接从redis种集中获取。
4.限速:出于安全考虑,每次进行登录时让用户输入手机验证码,为了接口不被频繁访问,会限制用户每分钟获取验证码的频率。

2.哈希

用于保存键值对的抽象数据结构。redis使用hash表作为底层实现,每个字典带有两个hash表,供平时使用和rehash时使用,hash表使用链地址法来解决键冲突,被分配到同一个索引位置的多个键值对会形成一个单向链表,在对hash表进行扩容或者缩容的时候,为了服务的可用性,rehash的过程不是一次性完成的,而是渐进式的。
使用场景
哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。
所以常常用于用户信息的管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而redis模拟关系型复杂查询开发困难,维护成本高。

3.列表

列表类型是用来存储多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以存储2^32-1个元素,在redis中,可以对列表两端插入(pubsh)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素。列表是一种比较灵活的数据结构,它可以充当栈和队列的角色。
redis链表是一个双向无环链表结构,很多发布订阅、慢查询、监视器功能都是使用到了链表来实现,每个链表的节点由一个listNode结构来表示,每个节点都有指向前置节点和后置节点的指针,同时表头节点的前置和后置节点都指向NULL。
优点
1.列表的元素是有序的,这就意味着可以通过索引下标获取某个或某个范围内的元素列表。
2.列表内的元素是可以重复的。
使用场景
消息队列:redis的lpush+brpop的命令组合即可实现阻塞队列,生产者客户端是由lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞时的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
使用列表的技巧
lpush+lpop = Stack(栈)
lpush+rpop=Queue(队列)
Ipush+Itrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)

4.集合

集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素,并且集合中的元素是无序的,不能通过索引下标获取元素,redis除了支持集合内的增删改查,同时还支持多个集合取交集,并集、差集。
使用场景
**1.标签:**集合类型比较经典的使用场景,如一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及增强用户粘度比较重要。(用户和标签的关系维护应该放在一个事务内执行,防止部分命令失败造成数据不一致)
sadd = tagging(标签)
spop/srandmember=random item(生成随机数,抽奖)
sadd+sinter=social Graph(社交需求)

5.有序集合

有序集合和集合有着必然的联系,他保留了集合不能有重复成员的特性,但不同是,有序集合中的元素是可以排序的,但是他和列表使用索引下标作为排序依据不同的是,他给每个元素设置一个分数,作为排序的依据。(有序集合中的元素不可以重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同)。
跳跃表是有序集合的底层实现之一,redis中在实现有序集合键和集群节点的内部结构中都是用到了跳跃表。redis跳跃表由zskiplist和zskiplistNode组成,zskiplist用于保存跳跃表信息(表头、表尾节点、长度等),zskiplistNode用于表示表跳跃节点,每个跳跃表的层高都是1-32的随机数,在同一个跳跃表中,多个节点可以包含相同的分值,但是每个节点的成员对象必须是唯一的,节点按照分值大小排序,如果分值相同,则按照成员对象的大小排序。
使用场景
有序集合经典使用场景。排行榜

四、redis的发布与订阅

redis的发布与订阅是他的一种消息通信模式,一方发送信息,一方接收消息。
下图是三个客户端同时订阅同一个频道
在这里插入图片描述

下图是有新信息发送给频道1时,就会将消息发送给订阅它的三个客户端
在这里插入图片描述

五、redis的服务相关的命令

select #选择数据库(编号0-15)
退出# 退出连接
info #获取服务的信息与统计
monitor #实时监控
config get #获取服务配置
flushdb #删除当前选择的数据库中的key
flushall #删除所有数据库中的键

六、redis的持久化

redis持久有两种方式:快照,仅附加文件(AOF)

1.快照

这个是redis默认的持久化的方式
快照是redis默认的持久化的方式,这种方式在规定的时间将内存中数据以快照的方式写入到二进制文件中,默认的文件名是:dump.rdb;可以通过配置设置自动持久化的方式,我们可以修改redis.conf文件,来配置redis在n秒如果超过m个key被修改则自动做快照操作。

2.AOF

由于快照的方式有一定的间隔时间,所以如果redis在间隔时间内意外宕机后,就会丢失最后一次快照后的所有数据。
AOF比快照方式有更好的持久化性,是由于在使用AOF时,redis会将每一个收到的命令通过write函数追加到文件中,当redis重启后,会通过重新执行AOF文件中的内容,来在内存中重建整个数据库的内容。

具体实现

1.快照的方式

打开redis.conf配置文件。

save 900 1 #如果在900秒以内,超过一个key被修改,则发起快照保存
save 300 10 #如果在300秒内,超过10个key被修改,则发起快照保存
save 60 10000  #如果在60秒以内  超过10000个key被修改,则发起快照保存

2.AOF的方式

打开redis.conf配置文件,找到appendonly,默认是no,改成yes,yes则代表开启AOF持久化。
找到appendonly,支持三种方式

appendfsync always   #收到的命令就立即写入磁盘,最慢,但是保证了完全的持久化
appendfsync everysec  #每一秒钟写入磁盘一次,在性能和持久化方面做了很好的调整
appendfsync no  #完全依赖os,性能最好,持久化没保证。

重启redis即可,执行命令后,查看文件会有appendonly.aof文件,记录着操作的命令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值