Redis学习笔记
在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面:
-
低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
-
支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
-
大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
-
庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低
为了克服这一问题,NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐。
Redis是什么
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
-
基于内存运行,性能高效
-
支持分布式,理论上可以无限扩展
-
key-value存储系统
-
开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
相比于其他数据库类型,Redis具备的特点是:
-
C/S通讯模型
-
单进程单线程模型
-
丰富的数据类型
-
操作具有原子性
-
持久化
-
高并发读写
-
支持lua脚本
Redis的应用场景有哪些
Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。
Redis的数据类型及主要特性
Redis提供的数据类型主要分为5种自有类型和一种自定义类型,这5种自有类型包括:String类型、哈希类型(hash)、列表类型(list)、集合类型(set)和顺序集合类型(zset)。
String类型:
它是一个二进制安全的字符串,意味着它不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。
对每种数据类型,Redis都提供了丰富的操作命令,如:
-
GET/MGET
-
SET/SETEX/MSET/MSETNX
-
INCR/DECR
-
GETSET
-
DEL
哈希类型:
该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。
Hash的操作命令如下:
-
HGET/HMGET/HGETALL
-
HSET/HMSET/HSETNX
-
HEXISTS/HLEN
-
HKEYS/HDEL
-
HVALS
列表类型:
该类型是一个插入顺序排序的字符串元素集合, 基于双链表实现。
List的操作命令如下:
-
LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET
-
LINDEX/LRANGE
-
LLEN/LTRIM
集合类型:
Set类型是一种无顺序集合, 它和List类型最大的区别是:集合中的元素没有顺序, 且元素是唯一的。
Set类型的底层是通过哈希表实现的,其操作命令为:
-
SADD/SPOP/SMOVE/SCARD
-
SINTER/SDIFF/SDIFFSTORE/SUNION
Set类型主要应用于:在某些场景,如社交场景中,通过交集、并集和差集运算,通过Set类型可以非常方便地查找共同好友、共同关注和共同偏好等社交关系。
顺序集合类型:
ZSet是一种有序集合类型,每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。与Set类型一样,其底层也是通过哈希表实现的。
ZSet命令:
-
ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT
-
ZINTER/ZDIFF/ZDIFFSTORE/ZUNION
Redis特性1:事务
-
命令序列化,按顺序执行
-
原子性
-
三阶段: 开始事务 - 命令入队 - 执行事务
-
命令:MULTI/EXEC/DISCARD
Redis特性2:发布订阅(Pub/Sub)
-
Pub/sub是一种消息通讯模式
-
Pub发送消息, Sub接受消息
-
Redis客户端可以订阅任意数量的频道
-
“fire and forgot”, 发送即遗忘
-
命令:Publish/Subscribe/Psubscribe/UnSub
Redis特性3:Stream
-
Redis 5.0新增
-
等待消费
-
消费组(组内竞争)
-
消费历史数据
-
FIFO
以上就是Redis的基本概念,下面我们将介绍在开发过程中可能会踩到的“坑”。
Redis常见问题解析:击穿
概念:在Redis获取某一key时, 由于key不存在, 而必须向DB发起一次请求的行为, 称为“Redis击穿”。
引发击穿的原因:
-
第一次访问
-
恶意访问不存在的key
-
Key过期
合理的规避方案:
-
服务器启动时, 提前写入
-
规范key的命名, 通过中间件拦截
-
对某些高频访问的Key,设置合理的TTL或永不过期