一、Redis简介
Redis,英文全称是Remote Dictionary Server(远程字典服务),ANSI C语言编写、支持网络、可基于内存亦可持持久化的日志型、Key-Value数据库。可以用作数据库、缓存、消息中间件。
二、Redis优缺点
(一)优点
-
响应速度快
-
内存读写,比存在磁盘的数据库读写速度快,省去了磁盘IO消耗
-
单线程操作,避免频繁的上下文切换
-
采用了非阻塞IO多路复用机制(I/O多路复用机制:I/O多路复用就是只有单个线程,通过跟踪每个I/O流的状态,来管理多个I/O流)
(二)缺点
-
数据容易丢失,因为是在内存中读写
-
依赖内存的大小
-
缓存和数据库双写一致性问题
-
缓存穿透
-
缓存雪崩
-
缓存击穿
三、Redis 和 Memcached 有什么区别
(一)redis与memcache总体对比
1.性能
2.内存使用效率
3.内存空间和数据量大小
4.数据结构支持
5.可靠性
6.应用场景
(二)redis与memcache内存管理机制对比
1. Memcached的内存管理机制
2. Redis的内存管理机制
(三)Redis和Memcached的集群实现机制对比
1. Memcached的分布式存储
2. Redis的分布式存储
四、Redis使用场景
缓存、数据共享分布式、分布式锁、全局ID、计数器、位统计、购物车、消息队列、点赞,签到,打卡、排行榜、消息发布和订阅、商品标签
五、Redis-数据结构
(一)String
String是Redis最基础的数据结构类型,它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
(二)Hash
String 元素组成的字典,适用于存储对象
(三)Set
String 元素组成的无序集合,通过哈希表实现(增删改查时间复杂度为 O(1)),不允许重复。
(四)Zset
有序集合(sorted sets),因为在redis中,有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等,所以我们都将redis中的有序集合叫做zsets
(五)List
-
列表,按照 String 元素插入顺序排序。其顺序为后进先出。由于其具有栈的特性,所以可以实现如“最新消息排行榜”这类的功能,redis中的lists在底层实现上并不是数组,而是链表
剩余3种比较特殊的数据结构
(六)BitMap
BitMap是一种实现对位的操作的数据结构,但是其实它本身并不是数据结构,底层其实是字符串,是借助字符串进行位操作的,但是BigMap在Redis中使用却和字符串不太一样,可以理解为这是一个以位为单位的数组,数组的每个单元格存放的是1或者0,数组的下标在BitMaps中被称为偏移量
(七)Hyperloglog
Redis中的HyperLogLog是一种基于基数估算的算法,所谓基数估算就是在一批数据中不重复的元素个数有多少个
(八)Geospatial
Redis 在 3.2 版本中加入了地理空间(geospatial)以及索引半径查询的功能,主要用在需要地理位置的应用上。将指定的地理空间位置(经度、纬度、名称)添加到指定的 key 中,这些数据将会存储到 sorted set。这样的目的是为了方便使用 GEORADIUS 或者 GEORADIUSBYMEMBER 命令对数据进行半径查询等操作。也就是说,推算地理位置的信息,两地之间的距离,“附近的人”等等场景都可以用它实现。geo 底层原理是使用 zset来实现的
六、Redis-持久化机制
Redis提供了RDB和AOF两种持久化机制
(一)RDB
(二)AOF
七、Redis-缓存击穿、缓存穿透、缓存雪崩
(一)缓存击穿
(二)缓存穿透
(三)缓存雪崩
八、Redis-高可用
(一)主从模式
(二)哨兵模式
(三)Cluster集群模式
九、Redis-实现分布式锁
在单体项目中,我们处理多线程同时操作某一处代码块或者变量时就使用 Synchronized 或者 Lock 锁去保证数据的安全性,但是,现在我们基本上都是使用微服务,当我们把服务部署到多个进程中去,这时候使用 Synchronized 或者 Lock 锁就没办法保证数据的安全性,这时候就需要用到分布式锁