共计 5020 个字符,预计需要花费 13 分钟才能阅读完成。
一、同样是缓存,用 map 不行吗?
Redis 能够存储几十个 G 的数据,Map 行吗?
Redis 的缓存能够进行本地长久化,Map 行吗?
Redis 能够作为分布式缓存,Map 只能在同一个 JVM 中进行缓存;
Redis 反对每秒百万级的并发,Map 行吗?
Redis 有过期机制,Map 有吗?
Redis 有丰盛的 API,反对十分多的利用场景,Map 行吗?
二、Redis 为什么是单线程的?
代码更清晰,解决逻辑更简略;
不必思考各种锁的问题,不存在加锁和开释锁的操作,没有因为可能呈现死锁而导致的性能问题;
不存在多线程切换而耗费 CPU;
无奈施展多核 CPU 的劣势,但能够采纳多开几个 Redis 实例来欠缺;
三、Redis 真的是单线程的吗?
Redis6.0 之前是单线程的,Redis6.0 之后开始反对多线程;
Redis 外部应用了基于 epoll 的多路服用,也能够多部署几个 Redis 服务器解决单线程的问题;
Redis 次要的性能瓶颈是内存和网络;
内存好说,加内存条就行了,而网络才是大麻烦,所以 Redis6 内存好说,加内存条就行了;
而网络才是大麻烦,所以 Redis6.0 引入了多线程的概念,
Redis6.0 在网络 IO 解决方面引入了多线程,如网络数据的读写和协定解析等,须要留神的是,执行命令的外围模块还是单线程的。
四、Redis 优缺点
1、长处
Redis 是 KV 数据库,MySQL 是关系型数据库,Redis 速度更快;
Redis 数据操作次要在内存中,MySQL 次要将数据存储在硬盘,Redis 速度更快;
Redis 同样反对长久化(RDB+AOF),Redis 反对将数据异步将内存的数据长久化到硬盘上,防止 Redis 宕机呈现数据失落的问题;
Redis 性能极高,读的速度是 110000 次 / 秒,写的速度是 81000 次 / 秒;
Redis 数据类型丰盛,不仅反对 KV 键值对,还反对 list、set、zset、hash 等数据结构的存储;
Redis 反对数据的备份,即 master-slave 模式的数据备份;
Redis 反对简略的事务,操作满足原子性;
Redis 反对读写拆散,分担读的压力;
Redis 反对哨兵模式,实现故障的主动转移;
单线程操作,防止了频繁的上下文切换;
采纳了非阻塞 I / O 多路复用机制,性能卓越;
2、毛病
数据存储在内存,容易造成数据失落;
存储容量受内存的限度,只能存储大量的罕用数据;
缓存和数据库双写一致性问题;
用于缓存时,容易呈现内存穿透、缓存击穿、缓存雪崩的问题;
批改配置文件后,须要进行重启,将硬盘中的数据同步到内存中,耗费的工夫较长,而且数据同步的工夫里 Redis 不能提供服务;
五、Redis 常见业务场景
Redis 是基于内存的 nosql 数据库,能够通过新建线程的模式进行长久化,不影响 Redis 单线程的读写操作
通过 list 取最新的 N 条数据
模仿相似于 token 这种须要设置过期工夫的场景
公布订阅音讯零碎
定时器、计数器
缓存减速、分布式会话、排行榜、分布式计数器、分布式锁;
Redis 反对事务、长久化、LUA 脚本、公布 / 订阅、缓存淘汰、流技术等个性;
六、Redis 常见数据类型
1、String
(1)String 简介
String 是最根本的 key-value 构造,key 是惟一标识,value 是具体的值,value 其实不仅是字符串,也能够是数字(整数或浮点数),value 最多能够包容的数据长度是 512M。
(2)利用场景
① 作为缓存数据库
在 Java 管理系统体系中,大多数都是用 MySQL 存储数据,redis 作为缓存,因为 Redis 具备撑持高并发的个性,通常能起到减速读写和升高数据库服务器压力的作用,大多数申请都会先申请 Redis,如果 Redis 中没有数据,再申请 MySQL 数据库,而后再缓存到 Redis 中,以备下次应用。
② 计数器
Redis 字符串中有一个命令 INCR key,incr 命令会对值进行自增操作,比方 CSDN 的文章浏览,视频的播放量,都能够通过 Redis 来计数,每浏览一次就 +1,同时将这些数据异步存储到 MySQL 数据库中,升高 MySQL 服务器的写入压力。
③ 共享 session
在分布式系统中,用户每次申请个别会拜访不同的服务器,这就会导致 session 不同步的问题,这时,个别会应用 Redis 来解决这个问题,将 session 存入 Redis,应用的时候从 Redis 中取出就能够了。
④ 分布式锁
setnx key value,加锁
del key,开释锁
(3)key 操作命令
(4)set key value
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
EX seconds,设置过期工夫,单位秒
PX milliseconds,设置过期工夫,单位毫秒
EXAT timestamp-seconds,设置过期工夫,以秒为单位的 UNIX 工夫戳
PXAT timestamp-milliseconds,设置过期工夫,以毫秒为单位的 UNIX 工夫戳
NX,键不存在的时候设置键值
XX,键存在的时候设置键值
KEEPTTL,保留设置前指定键的生存工夫
GET,返回指定键本来的值,若键不存在返回 nil
备注:
命令不辨别大小写,而 key 是辨别大小写的。
help @类型:查看以后类型相干的操作命令。
Since the SET command options can replace SETNX, SETEX, PSETEX, GETSET, it is possible that in future versions of Redis these commands will be deprecated and finally removed。
(5)同时设置多个键值
(6)获取指定区间范畴内的值
getrange、setrange。
(7)数值增减
INCR key,递增数字
INCRBY key increment,减少指定的数值递增
DECR key,递加数值
DECRBY key decrement,指定指定的数值递加
(8)获取字符串的长度,内容追加
STRLEN key,获取值的长度
APPEND key value,内容追加
2、List
(1)List 列表简介
List 列表是简略的字符串列表,依照插入程序排序,能够从头部或尾部向 List 列表增加元素。
列表的最大长度为 2^32 – 1,也即每个列表反对超过 40 亿个元素。
次要性能有 push/pop,个别用在栈、队列、音讯队列等场景。
left、right 都能够插入增加;
如果键不存在,创立新的链表;
如果键存在,新增内容;
如果值全副移除,对应的键也会隐没;
它的底层是双向链表,对两端的操作性能很高,通过索引下标操作两头的节点,性能会较差。
(2)利用场景
① 音讯队列
应用 lpush + rpop 或者 rpush + lpop 实现音讯队列,Redis 还反对阻塞操作,在弹出元素的时候应用阻塞命令来实现阻塞队列。
② 作为栈应用
应用 lpush+lpop 或者 rpush+rpop 实现栈。
③ 文章列表
(3)常用命令
3、Hash
(1)hash 简介
Hash 是一个键值对(key – value)汇合,value 也是一个 hash,相当于 Map<String,Map<Object,Object>>。
(2)罕用场景
因为非凡的数据结构,hash 个别作为存储 bean 应用,String+JSON 的数据结构存储特定的利用场景。
(3)常用命令
4、Set
(1)Set 类型简介
Set 类型是一个无序并惟一的键值汇合,它的存储程序不会依照插入的先后顺序进行存储。
一个汇合最多能够存储 2^32-1 个元素。概念和数学中个的汇合根本相似,能够交加,并集,差集等等,所以 Set 类型除了反对汇合内的增删改查,同时还反对多个汇合取交加、并集、差集。
(2)利用场景
① 雷同好友可见
在朋友圈场景中,对于点赞、评论的性能,通过交加实现雷同还有可见的性能。
② 独特关注、独特爱好
③ 抽奖性能
(3)常用命令
5、Zset
(1)Zset 类型简介
Zset 类型(有序汇合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序汇合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序联合的元素值,一个是排序值。
有序汇合保留了汇合不能有反复成员的个性(分值能够反复),但不同的是,有序汇合中的元素能够排序。
zset k1 score1 v1 score2 v2
(2)利用场景
① 排行榜
通过 score 来记录点赞数,而后依据 score 进行排序,实现排行榜的性能。
② 提早音讯队列
订单零碎,下单后须要在 15 分钟内进行领取操作,否则主动勾销订单。
将下单后 15 分钟后的工夫作为 score,订单作为 value 存入 Redis,消费者轮询去生产,如果生产的大于等于 score,则勾销该订单。
(3)Zset 常用命令
6、BitMap
(1)Bitmap 简介
Bitmap,即位图,是一串间断的二进制数组(0 和 1),能够通过偏移量(offset)定位元素。BitMap 通过最小的单位 bit 来进行 0 | 1 的设置,示意某个元素的值或者状态,工夫复杂度为 O(1)。
(2)利用场景
因为 bit 是计算机中最小的单位,应用它进行贮存将十分节俭空间,特地适宜一些数据量大且应用二值统计的场景。
① 签到统计
② 判断用户是否登录
③ 统计间断学习打卡的人
(3)BitMap 常用命令
7、BitField
通过 bitfield 命令能够一次性操作多个比特位,它会执行一系列操作并返回一个响应数组,这个数组中的元素对参数列表中的相应操作的执行后果。
8、HyperLogLog
(1)HyperLogLog 简介
Redis HyperLogLog 是 Redis 2.8.9 版本新增的数据类型,是一种用于「统计基数」的数据汇合类型,基数统计就是指统计一个汇合中不反复的元素个数。但要留神,HyperLogLog 是统计规定是基于概率实现的,不是十分精确,规范误算率是 0.81%。
所以,简略来说 HyperLogLog 提供不准确的去重计数。
HyperLogLog 的长处是,在输出元素的数量或者体积十分十分大时,计算基数所需的内存空间总是固定的、并且是很小的。
在 Redis 外面,每个 HyperLogLog 键只须要破费 12 KB 内存,就能够计算靠近 2^64 个不同元素的基数,和元素越多就越消耗内存的 Set 和 Hash 类型相比,HyperLogLog 就十分节俭空间。
(2)利用场景
百万级网页 UV 计数
(3)常用命令
pfadd key element,增加元素
pfcount key,返回指定 HyperLogLog 的基数的估算值;
pfmerge destkey sourcekey,将多个 HyperLogLog 合并成一个 HyperLogLog;
9、GEO
(1)GEO 简介
Redis GEO 是 Redis 3.2 版本新增的数据类型,次要用于存储地理位置信息,并对存储的信息进行操作。
在日常生活中,咱们越来越依赖搜寻“左近的餐馆”、在打车软件上叫车,这些都离不开基于地位信息服务(Location-Based Service,LBS)的利用。LBS 利用拜访的数据是和人或物关联的一组经纬度信息,而且要能查问相邻的经纬度范畴,GEO 就非常适合利用在 LBS 服务的场景中。
(2)利用场景
高德地图、滴滴打车等定位软件。
(3)常用命令
10、Stream
(1)Stream 简介
Redis Stream 是 Redis 5.0 版本新减少的数据类型,Redis 专门为音讯队列设计的数据类型。
在 Redis 5.0 Stream 没进去之前,音讯队列的实现形式都有着各自的缺点,例如:
公布订阅模式,不能长久化也就无奈牢靠的保留音讯,并且对于离线重连的客户端不能读取历史音讯的缺点;
List 实现音讯队列的形式不能反复生产,一个音讯生产完就会被删除,而且生产者须要自行实现全局惟一 ID。
基于以上问题,Redis 5.0 便推出了 Stream 类型也是此版本最重要的性能,用于完满地实现音讯队列,它反对音讯的长久化、反对主动生成全局惟一 ID、反对 ack 确认音讯的模式、反对生产组模式等,让音讯队列更加的稳固和牢靠。
(2)利用场景
音讯队列
(3)常用命令
七、总结
Redis 是一个 key-value 存储系统,反对 10 种数据类型,总结了为何要用 Redis 代替 map 作为程序缓存、Redis 为什么是单线程的、Redis 的优缺点、Redis 的罕用场景,做了一次 Redis 的疾速入门。