初识Redis

目录

前言

Redis的诞生

Redis特性

速度快:

基于键值对的数据结构:

丰富的功能:

简单稳定:

客户端语言多:

持久化:

主从复制(Replication):

[高可用(High Availability)和分布式 (Distributed):](#高可用(High Availability)和分布式 (Distributed):)

Redis可以做什么

缓存:

消息队列:

排行榜:

计数器应用:

Redis不能做什么

结尾总结

前言

Redis是一种基于键值对 (key-value)的NoSQL 数据库,与很多键值对数据库不同的是,Redis中的值可以由字符串、哈希、列表、集合、有序集合、位图等多种数据结构和算法组成,能够满足特别多的使用场景。又因为Redis会将所有数据都放在内存中 ,所以它的读写性能非常惊人。不仅于此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,在发生类似断电宕机的时候,内存中的数据不会丢失。

Redis的诞生

2008年,Redis的作者Salvatore Sanfilipp在开发一个叫做LLOOGG的网站的时候,需要一个高性能的队列功能,最开始他使用的是MySQL,但是后来发现怎么优化SQL语句,网站的性能都上不去,于是自己打造了一个专属的数据库,这就是Redis的前身。

Redis特性

一下是关于Redis的8个重要特性:

速度快:

正常情况下,Redis执行命令的速度非常快,官网给出的读写性能可以达到10w条 / 秒

  • Redis的所有数据都是存放在内存中的
  • Redis是用C语言实现的,距离OS更近,执行速度相对更快点
  • Redis使用了单线程,预防了多线程会产生的竞争问题
    • Redis在6.0版本引入了多线程机制,但主要也是在处理网络IO,并不涉及数据命令
层级 速度
L1 cache reference 0.5ns
Branch mispredict 5ns
L2 cache reference 7ns
Mutex lock/unlock 25ns
Main memory reference 100ns
Compress 1 K bytes with Zippy 3000ns
Send 2 K bytes over 1 Gbps network 20000ns
Read 1 MB sequentially from Memory 250000ns
Round trip within same datacenter 500000ns

基于键值对的数据结构:

正如前言所说,Redis中基于键值对的数据结构,类似于C++里的map、Java里的map、Python里的dict等等,这种存储方式的查找的时间复杂度可以认为是O(1)

丰富的功能:

  • 提供键值过期功能,可以用来实现缓存
  • 提供发布订阅功能,可以用来实现消息系统
  • 支持Lua脚本功能,可以利用Lua创造出新的Redis命令
  • 提供简单的事务功能,能在一定程度上保证事务的特性
  • 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次传输到Redis,减少网络开销

简单稳定:

这主要体现在三个方面:

第一点:早期的Redis版本代码大概只有2w行左右,3.0版本由于添加了集群特性,增加到5w行左右,相对于很多NoSQL数据库来说代码量相对少很多,这也就意味着很多普通的开发人员就能够吃透它

第二点:Redis使用单线程模型,这样不仅使得Redis服务端处理模型变得简单,而且也使得客户端开发变得简单。

第三点:Redis不需要依赖于操作系统中的类库,Redis自己实现了事件处理的相关功能

简单的同时Redis具有相当的稳定性,在大量使用过程中,很少出现因为Redis本身Bug导致宕机的情况

客户端语言多:

Redis提供了简单的TCP通信协议,很多编程语言可以很方便的接入到Redis。又由于Redis收到社区和各大公司的广泛认可,所以支持Redis客户端语言的也非常多,几乎涵盖了主流的变成语言,例如:C、C++、Java、PHP等

持久化:

通常数据放在内存中使很不安全的,因为内存只要一掉电,那么所有保存在内存中的数据就消失了,因此Redis也提供了持久化的方法,将内存中的数据能够保存到硬盘当中,这里持久化可以使用RDB 或 AOF 的策略

主从复制(Replication):

Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础

高可用(High Availability)和分布式 (Distributed):

Redis提供了高可用实现的Redis哨兵(Redis Sentinel),能够保证Redis结点的故障发现和故障自动转移。也提供了Redis集群,是真正的分布式实现,提供了高可用、读写和容量的拓展性


Redis可以做什么

首先我们要知道Redis 是把数据存储在内存上,所以不应该让他保存大量的用户数据

缓存:

大型的网站往往都会使用缓存机制,合理使用缓存能够加快数据的访问速度,而且能够有效的缓解后端数据源的压力。同时Redis提供了键值对过期时间,并且也能领过控制最大内存和内存溢出过后的淘汰策略。

消息队列:

消息队列可以说是大型网站的必备基础组件,因为其具有业务解耦、非实施业务削峰等特性。Redis提供了发布订阅功能和阻塞队列功能,虽然和专业的比起来不够强大,但是对于一般的消息队列他能够满足

排行榜:

就是像微博热搜top100 那样子类型的排行榜,Redis提供了列表和有序集合的结构,合理使用这些数据结构能够很方便的构造出各种排行榜系统

计数器应用:

例如视频的播放次数、点赞、点踩、收藏之类的,每次点赞都是对其数据做加1的操作。这种次数十分频繁的事情对于传统关系型数据库的性能是一种挑战,Redis天然支持计数功能并且性能也非常好,可以说是计数器系统的重要选择


Redis不能做什么

每个技术都有自己的应用场景,Redis并不是万金油~~

Redis的数据是存放在内存中的,如果数据量非常大,例如每天有几千万的用户行为数据,使用Redis来存储的话基本就是一个无底洞,这是挑战内存极限的活

数据也分为冷数据和热数据,如果将冷数据放在Redis中的话,基本上就是一种对内存资源的浪费,而热资源放在Redis中的话就能够很好的加快用户的读取效率,可以大大减轻后端存储的负载


结尾总结

Redis是一门基于KV的NoSQL数据库,它把数据存储在内存上的策略能够达到非常高的读写速度,但同样也有局限性,需要结合实际场景来使用

相关推荐
水月梦镜花8 小时前
redis:list列表命令和内部编码
数据库·redis·list
掘金-我是哪吒9 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
ketil2711 小时前
Ubuntu 安装 redis
redis
王佑辉12 小时前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
Karoku06613 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
材料苦逼不会梦到计算机白富美13 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
gorgor在码农13 小时前
Redis 热key总结
java·redis·热key
想进大厂的小王13 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情13 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
HBryce2414 小时前
缓存-基础概念
java·缓存