php发展

首页 » 常识 » 诊断 » 读完这篇文章,就基本搞定了Redis数据
TUhjnbcbe - 2021/6/27 2:33:00
北京中医院能治疗白癜风 http://pf.39.net/bdfyy/bdfjc/141109/4513686.html

简单来说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最重要的数据结构之一。

比如微博的

1
查看完整版本: 读完这篇文章,就基本搞定了Redis数据