简单来说Redis就是一个数据库,不过与传统数据库不同的是Redis的数据是存在内存中的,所以存写速度非常快,因此Redis被广泛应用于缓存方向。
另外,Redis也经常用来做分布式锁。Redis提供了多种数据类型来支持不同的业务场景。
除此之外,Redis支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案。
本文将从以下几个方面全面解读Redis:为什么要用Redis/为什么要用缓存
为什么要用Redis而不用map/guava做缓存
Redis和Memcached的区别
Redis常见数据结构以及使用场景分析
Redis设置过期时间
Redis内存淘汰机制
Redis持久化机制(怎么保证Redis挂掉之后再重启数据可以进行恢复)
Redis事务
缓存雪崩和缓存穿透问题解决方案
如何解决Redis的并发竞争Key问题
如何保证缓存与数据库双写时的数据一致性
为什么要用Redis/为什么要用缓存?
主要从“高性能”和“高并发”这两点来看待这个问题。
高性能
假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。
将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。
操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变了之后,同步改变缓存中相应的数据即可!
高并发
直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
为什么要用Redis而不用map/guava做缓存
缓存分为本地缓存和分布式缓存。以Java为例,使用自带的map或者guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着JVM的销毁而结束。
并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
使用Redis或Memcached之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。
缺点是需要保持Redis或Memcached服务的高可用,整个程序架构上较为复杂。
Redis和Memcached的区别
现在公司一般都是用Redis来实现缓存,而且Redis自身也越来越强大了!
对于Redis和Memcached我总结了下面四点:
Redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的K/V类型的数据,同时还提供list、set、zset、hash等数据结构的存储。Memcache支持简单的数据类型String。
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中。
集群模式:Memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是Redis目前是原生支持Cluster模式的。
Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路IO复用模型。
来自网络上的一张对比图,这里分享给大家:
Redis常见数据结构以及使用场景分析
String
常用命令:set、get、decr、incr、mget等。
String数据结构是简单的Key-Value类型,Value其实不仅可以是String,也可以是数字。常规Key-Value缓存应用;常规计数:微博数,粉丝数等。
Hash
常用命令:hget、hset、hgetall等。
Hash是一个String类型的Field和Value的映射表,Hash特别适合用于存储对象。
后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。比如我们可以Hash数据结构来存储用户信息,商品信息等等。
比如下面我就用Hash类型存放了我本人的一些信息:
key=JavaUservalue={“id”:1,“name”:“SnailClimb”,“age”:22,“location”:“Wuhan,Hubei”}
List
常用命令:lpush、rpush、lpop、rpop、lrange等。
List就是链表,RedisList的应用场景非常多,也是Redis最重要的数据结构之一。
比如微博的