Redis--核心数据结构和高性能原理(油炸圣女果的学习日记第十期)

        开个玩笑:我是萧炎,Redis就像萧薰儿,从刚接触修炼(java)的时候,就能感觉到Redis不简单,但是对其的了解始终不深,只能get到表象或者从各种外界传闻(面试宝典)知道Redis的强大。这一世,我重生归来,师从药老(诸葛老师),势必要从底层开始,狠狠深入了解Redis,将其拿下(桀桀桀)

Ok,开始新的专题:Redis

Redis安装
安装过程就不赘述了,属于练气阶段的基础操作,跟着功法走就行。
下载地址:http://redis.io/download
2 安装步骤:
3 # 安装gcc
4 yum install gcc
5
6 # 把下载好的redis‐5.0.3.tar.gz放在/usr/local文件夹下,并解压
7 wget http://download.redis.io/releases/redis‐5.0.3.tar.gz
8 tar xzf redis‐5.0.3.tar.gz
9 cd redis‐5.0.3
10
11 # 进入到解压好的redis‐5.0.3目录下,进行编译与安装
12 make
13
14 # 修改配置
15 daemonize yes #后台启动
16 protected‐mode no #关闭保护模式,开启的话,只有本机才可以访问redis
17 # 需要注释掉bind
18 #bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户
端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
19
20 # 启动服务
21 src/redis‐server redis.conf
22
23 # 验证启动是否成功
24 ps ‐ef | grep redis
25
26 # 进入redis客户端
27 src/redis‐cli
28
29 # 退出客户端
30 quit
31
32 # 退出redis服务:
33 (1)pkill redis‐server
34 (2)kill 进程号
35 (3)src/redis‐cli shutdown

Redis核心的五种数据结构

Redis的之所以强大,主要就归功于性能优秀和丰富的数据结构。见下图:

String结构

最常规的一个数据结构,常用的操作例举一下就行。

String的应用场景

这里指的分布式锁只是一种很简单的结构,做个举例,不用深究。

Hash结构

常用的操作命令都可以自己执行一下试试效果

Hash的应用场景

这里提一个Hash数据类型可能存在的问题:

bigkey问题:因为hash的结构是key value的形式,即如上图,如果我们给key为user缓存增加很多条数据,那么如果我们执行了一条HMGET ALL查询user的所有数据的话,这一个操作就会执行很长时间,那么问题就出现了:Redis是一个单线程模型(也不能说纯粹的单线程,后面会讲),各种命令进来会排个队,挨个执行,如果遇到这种bigkey的情况执行时间过长,其他的命令都会阻塞,那么就影响了redis的并发。

再举个应用场景例子,应用场景可以结合工作场景多思考

Hash结构优缺点:

优点

1)同类数据归类整合储存,方便数据管理

2)相比string操作消耗内存与cpu更小

3)相比string储存更节省空间

缺点

1)过期功能不能使用在field上,只能用在key上

2)Redis集群架构下不适合大规模使用

List结构

List应用场景

比如萧炎微博关注了几个博主(备胎说车和MacTalk),这样萧炎的关注消息就可以缓存为一个list,MacTalk发个微博,就往萧炎的消息list里LPUSH一条,备胎说车发微博,同样又缓存一条。这样我在查询的时候,先法消息的排序在后面,便是一种栈的形式。

Set结构(特点无序)

Set的应用场景

1.利用set的无序性用基础命令实现随机抽奖的效果。

2.集合操作:即交集、并集、差集

关注模型

        首先将每个用户关注的人作为一个用户的set缓存如集合A,B,C,那么诸葛老师和杨过老师的共同关注就是A和B集合的交集,那么就可以通过共同关注的人数或占比,系统可以推断出后你类似的人,就可以给你推送他关注的人给你或者判定你们可能共同认识的人(A和B的差集),或者和你喜好类似的人购买了某些商品,是不是可以推测你也感兴趣?那么系统就可以把商品推送给你。

ZSet(有序集合结构)

下一步通过几个问题了解Redis的性能层面

Redis的单线程和高性能
1.Redis是单线程吗?
        Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的 ,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的 。(所以Redis整体来说并不是真正意义上的单线程的,只是说Redis执行命令的功能是单线程执行的)
2.Redis 单线程为什么还能这么快?
        因为它所有的数据都在 内存 中,所有的运算都是内存级别的运算,而且 单线程避免了多线程的切换性 能损耗 问题。正因为 Redis 是单线程,所以要小心使用 Redis 指令, 对于那些耗时的指令(比如 keys),一定要谨慎使用 ,一不小心就可能会导致 Redis 卡顿。
3. Redis 单线程如何处理那么多的并发客户端连接?
        Redis的IO多路复用 :redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。
其他高级命令
keys:全量遍历键 用来列出所有满足特定正则字符串规则的key,当redis数据量比较大时,
性能比较差,要避免使用
scan:渐进式遍历键
SCAN cursor [MATCH pattern] [COUNT count]
scan 参数提供了三个参数,第一个是 cursor 整数值(hash桶的索引值) ,第二个是 key 的正则模式, 第三个是一次遍历的key的数量(参考值,底层遍历的数量不一定),并不是符合条件的结果数量。第 一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。一直遍历 到返回的 cursor 值为 0 时结束。
注意: 但是scan并非完美无瑕, 如果在 scan的过程中 如果 有键的变化(增加、 删除、 修改) ,那 么遍历效果可能会碰到如下问题: 新 增的键可能没有遍历到, 遍历出了重复的键等情况 , 也就是说 scan并不能保证完整的遍历出来所有的键, 这些是我们在开发时需要考虑的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值