我们为什么需要redis
以前大多是Web,Server,MySQL,三位一体。 Mysql从单机演进出了集群,它的数据量增长快,读写压力不断增加。
- 每次需要数据都从数据库里面调,查,会浪费太多的时间,性能很低。
- 数据分冷热 (热数据:经常被访问到的数据)
- 将热数据存储到内存中
读场景:
Web ——> Server ——> Redis——>MySQL(如果redis中读不到所需信息,再从Mysql中读)
写场景:
Web ——> Server ——> MySQL ——> (监听binlog,修改Redis)Redis
Redis的工作原理
Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。它的基本工作原理如下:
-
内存存储:Redis将数据存储在内存中,这使得它能够提供快速的读写操作。数据可以以键值对的形式存储,其中键是唯一的标识符,值可以是字符串、哈希、列表、集合或有序集合等数据结构。
-
持久化:Redis支持两种持久化方式,即快照和日志。快照是将内存中的数据保存到磁盘上的一个二进制文件中,而日志则是将写操作追加到一个日志文件中。这样可以在Redis重启后恢复数据。
-
命令和响应:Redis使用简单的文本协议与客户端进行通信。客户端可以向Redis发送各种命令,如读取、写入、删除数据等。Redis接收到命令后,执行相应的操作,并将结果返回给客户端。
-
高性能:由于Redis将数据存储在内存中,并使用单线程模型处理请求,它能够提供非常高的性能。此外,Redis还支持一些高级功能,如发布/订阅、事务和Lua脚本等。
总的来说,Redis的基本工作原理是将数据存储在内存中,并通过简单的文本协议与客户端进行通信,以提供高性能的数据存储和访问能力。
Redis中的数据结构
在Redis中,字符串(String)是最基本的数据类型之一,Redis提供了一些常用的操作来处理字符串:
-
设置值:使用命令
SET key value可以设置一个键值对。例如,SET name "John"将键"name"的值设置为"John"。 -
获取值:使用命令
GET key可以获取指定键的值。例如,GET name将返回键"name"的值"John"。 -
追加值:使用命令
APPEND key value可以向一个字符串值的末尾追加内容。例如,APPEND name " Doe"将字符串值变为"John Doe"。 -
获取子串:使用命令
GETRANGE key start end可以获取字符串值中指定范围的子串。范围由起始位置和结束位置指定,起始位置从0开始,负数表示从末尾开始计数。例如,GETRANGE name 0 3将返回子串"John"。 -
获取长度:使用命令
STRLEN key可以获取字符串值的长度。例如,STRLEN name将返回字符串值"John"的长度4。 -
设置过期时间:使用命令
EXPIRE key seconds可以设置键的过期时间,单位为秒。例如,EXPIRE name 60将键"name"的过期时间设置为60秒。 -
自增/自减:使用命令
INCR/DECR key可以将键的值自增/自减1,并返回操作后的值。例如,INCR counter将对名为"counter"的键进行自增操作。
Hash数据结构dict
-
rehash: rehash操作是将ht[0]中的数据全部迁移到ht[1]中。数据量小的场景下,直接将数据从ht[0]拷贝到ht[1]速度是较快的。数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求。
-
渐进式rehash:为避免出现这种情况,使用了rehash方案。基本原理就是,每次用户访问时都会迁移少量数据。将整个迁移过程,平摊到所有的访问用不请求过程中。