一、相同是缓存,用map不行吗?

  1. Redis能够存储几十个G的数据,Map行吗?
  2. Redis的缓存能够进行本地耐久化,Map行吗?
  3. Redis能够作为分布式缓存,Map只能在同一个JVM中进行缓存;
  4. Redis支撑每秒百万级的并发,Map行吗?
  5. Redis有过期机制,Map有吗?
  6. Redis有丰厚的API,支撑十分多的运用场景,Map行吗?

既然有Map了,为什么还要有Redis?

二、Redis为什么是单线程的?

  1. 代码更清晰,处理逻辑更简略;
  2. 不必考虑各种锁的问题,不存在加锁和开释锁的操作,没有因为或许呈现死锁而导致的功用问题;
  3. 不存在多线程切换而消耗CPU;
  4. 无法发挥多核CPU的优势,但能够选用多开几个Redis实例来完善;

三、Redis真的是单线程的吗?

  1. Redis6.0之前是单线程的,Redis6.0之后开端支撑多线程;
  2. Redis内部运用了依据epoll的多路服用,也能够多部署几个Redis服务器解决单线程的问题;
  3. Redis首要的功用瓶颈是内存和网络;
  4. 内存好说,加内存条就行了,而网络才是大麻烦,所以Redis6内存好说,加内存条就行了;
  5. 而网络才是大麻烦,所以Redis6.0引入了多线程的概念,
  6. Redis6.0在网络IO处理方面引入了多线程,如网络数据的读写和协议解析等,需求留意的是,履行指令的核心模块还是单线程的。

四、Redis优缺点

1、长处

  1. Redis是KV数据库,MySQL是关系型数据库,Redis速度更快;
  2. Redis数据操作首要在内存中,MySQL首要将数据存储在硬盘,Redis速度更快;
  3. Redis相同支撑耐久化(RDB+AOF),Redis支撑将数据异步将内存的数据耐久化到硬盘上,防止Redis宕机呈现数据丢掉的问题;
  4. Redis功用极高,读的速度是110000次/秒,写的速度是81000次/秒;
  5. Redis数据类型丰厚,不只支撑KV键值对,还支撑list、set、zset、hash等数据结构的存储;
  6. Redis支撑数据的备份,即master-slave形式的数据备份;
  7. Redis支撑简略的事务,操作满意原子性;
  8. Redis支撑读写分离,分担读的压力;
  9. Redis支撑岗兵形式,完结毛病的主动搬运;
  10. 单线程操作,防止了频频的上下文切换;
  11. 选用了非堵塞I/O多路复用机制,功用卓越;

2、缺点

  1. 数据存储在内存,简略造成数据丢掉;
  2. 存储容量受内存的约束,只能存储少量的常用数据;
  3. 缓存和数据库双写共同性问题;
  4. 用于缓存时,简略呈现内存穿透、缓存击穿、缓存雪崩的问题;
  5. 修正配置文件后,需求进行重启,将硬盘中的数据同步到内存中,消耗的时刻较长,而且数据同步的时刻里Redis不能供给服务;

五、Redis常见事务场景

  1. Redis是依据内存的nosql数据库,能够经过新建线程的方法进行耐久化,不影响Redis单线程的读写操作
  2. 经过list取最新的N条数据
  3. 模仿类似于token这种需求设置过期时刻的场景
  4. 发布订阅音讯体系
  5. 定时器、计数器
  6. 缓存加快、分布式会话、排行榜、分布式计数器、分布式锁;
  7. Redis支撑事务、耐久化、LUA脚本、发布/订阅、缓存淘汰、流技术等特性;

六、Redis常见数据类型

既然有Map了,为什么还要有Redis?

1、String

(1)String简介

String 是最基本的 key-value 结构,key 是仅有标识,value 是详细的值,value其实不只是字符串, 也能够是数字(整数或浮点数),value 最多能够容纳的数据长度是 512M。

(2)运用场景

① 作为缓存数据库

在Java管理体系体系中,大多数都是用MySQL存储数据,redis作为缓存,因为Redis具有支撑高并发的特性,通常能起到加快读写和降低数据库服务器压力的效果,大多数恳求都会先恳求Redis,假如Redis中没有数据,再恳求MySQL数据库,然后再缓存到Redis中,以备下次运用。

既然有Map了,为什么还要有Redis?

② 计数器

Redis字符串中有一个指令INCR key,incr指令会对值进行自增操作,比方CSDN的文章阅览,视频的播放量,都能够经过Redis来计数,每阅览一次就+1,一起将这些数据异步存储到MySQL数据库中,降低MySQL服务器的写入压力。

③ 共享session

在分布式体系中,用户每次恳求一般会拜访不同的服务器 ,这就会导致session不同步的问题,这时,一般会运用Redis来解决这个问题,将session存入Redis,运用的时分从Redis中取出就能够了。

④ 分布式锁

  1. setnx key value,加锁
  2. del key,开释锁

(3)key操作指令

既然有Map了,为什么还要有Redis?

(4)set key value

SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]

  1. EX seconds,设置过期时刻,单位秒
  2. PX milliseconds,设置过期时刻,单位毫秒
  3. EXAT timestamp-seconds,设置过期时刻,以秒为单位的UNIX时刻戳
  4. PXAT timestamp-milliseconds,设置过期时刻,以毫秒为单位的UNIX时刻戳
  5. NX,键不存在的时分设置键值
  6. XX,键存在的时分设置键值
  7. KEEPTTL,保留设置前指定键的生计时刻
  8. 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)数值增减

  1. INCR key,递加数字
  2. INCRBY key increment,添加指定的数值递加
  3. DECR key,递减数值
  4. DECRBY key decrement,指定指定的数值递减

(8)获取字符串的长度,内容追加

  1. STRLEN key,获取值的长度
  2. APPEND key value,内容追加

2、List

(1)List 列表简介

List 列表是简略的字符串列表,依照刺进顺序排序,能够从头部或尾部向 List 列表添加元素。

列表的最大长度为 2^32 – 1,也即每个列表支撑超过 40 亿个元素。

首要功用有push/pop,一般用在栈、行列、音讯行列等场景。

  1. left、right都能够刺进添加;
  2. 假如键不存在,创建新的链表;
  3. 假如键存在,新增内容;
  4. 假如值全部移除,对应的键也会消失;

它的底层是双向链表,对两端的操作功用很高,经过索引下标操作中间的节点,功用会较差。

(2)运用场景

① 音讯行列

运用 lpush + rpop或许 rpush + lpop完结音讯行列,Redis还支撑堵塞操作,在弹出元素的时分运用堵塞指令来完结堵塞行列。

既然有Map了,为什么还要有Redis?

② 作为栈运用

运用 lpush+lpop或许 rpush+rpop完结栈。

既然有Map了,为什么还要有Redis?

③ 文章列表

(3)常用指令

既然有Map了,为什么还要有Redis?

3、Hash

(1)hash简介

Hash 是一个键值对(key – value)调集,value也是一个hash,相当于 Map<String,Map<Object,Object>>

(2)常用场景

因为特别的数据结构,hash一般作为存储bean运用,String+JSON的数据结构存储特定的运用场景。

既然有Map了,为什么还要有Redis?

(3)常用指令

既然有Map了,为什么还要有Redis?

既然有Map了,为什么还要有Redis?

4、Set

(1)Set类型简介

Set 类型是一个无序并仅有的键值调集,它的存储顺序不会依照刺进的先后顺序进行存储。

一个调集最多能够存储 2^32-1 个元素。概念和数学中个的调集基本类似,能够交集,并集,差集等等,所以 Set 类型除了支撑调集内的增删改查,一起还支撑多个调集取交集、并集、差集。

(2)运用场景

① 相同好友可见

在朋友圈场景中,关于点赞、评论的功用,经过交集完结相同还有可见的功用。

② 共同关注、共同喜爱

③ 抽奖功用

(3)常用指令

既然有Map了,为什么还要有Redis?

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常用指令

既然有Map了,为什么还要有Redis?

6、BitMap

(1)Bitmap简介

Bitmap,即位图,是一串接连的二进制数组(0和1),能够经过偏移量(offset)定位元素。BitMap经过最小的单位bit来进行0|1的设置,表明某个元素的值或许状态,时刻复杂度为O(1)。

(2)运用场景

因为 bit 是核算机中最小的单位,运用它进行贮存将十分节约空间,特别适合一些数据量大且运用二值核算的场景。

① 报到核算

② 判别用户是否登录

③ 核算接连学习打卡的人

(3)BitMap常用指令

既然有Map了,为什么还要有Redis?

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)常用指令

  1. pfadd key element,添加元素
  2. pfcount key,回来指定HyperLogLog的基数的预算值;
  3. pfmerge destkey sourcekey,将多个HyperLogLog合并成一个HyperLogLog;

9、GEO

(1)GEO简介

Redis GEO 是 Redis 3.2 版别新增的数据类型,首要用于存储地理位置信息,并对存储的信息进行操作。

在日常生活中,我们越来越依赖搜索“邻近的餐馆”、在打车软件上叫车,这些都离不开依据位置信息服务(Location-Based Service,LBS)的运用。LBS 运用拜访的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度规模,GEO 就十分适合运用在 LBS 服务的场景中。

(2)运用场景

高德地图、滴滴打车等定位软件。

(3)常用指令

既然有Map了,为什么还要有Redis?

10、Stream

(1)Stream简介

Redis Stream 是 Redis 5.0 版别新添加的数据类型,Redis 专门为音讯行列设计的数据类型。

既然有Map了,为什么还要有Redis?

在 Redis 5.0 Stream 没出来之前,音讯行列的完结方法都有着各自的缺点,例如:

  • 发布订阅形式,不能耐久化也就无法可靠的保存音讯,而且关于离线重连的客户端不能读取前史音讯的缺点;
  • List 完结音讯行列的方法不能重复消费,一个音讯消费完就会被删去,而且生产者需求自行完结全局仅有 ID。

依据以上问题,Redis 5.0 便推出了 Stream 类型也是此版别最重要的功用,用于完美地完结音讯行列,它支撑音讯的耐久化、支撑主动生成全局仅有 ID、支撑 ack 确认音讯的形式、支撑消费组形式等,让音讯行列更加的稳定和可靠。

(2)运用场景

音讯行列

(3)常用指令

既然有Map了,为什么还要有Redis?

七、总结

Redis是一个key-value存储体系,支撑10种数据类型,总结了为何要用Redis替代map作为程序缓存、Redis为什么是单线程的、Redis的优缺点、Redis的常用场景,做了一次Redis的快速入门。

最终说一句(求关注,别白嫖我)

假如这篇文章对您有所帮助,或许有所启示的话,您的关注和点赞是我坚持写作最大的动力。

关注大众号:【哪吒编程】,在大众号中回复【】,获取Java学习资料、电子书;回复【星球】参加Java学习星球,陪同学习,共同优秀。