redis 简介
redis(remote dictionary server)是一个开源的高性能键值对存储数据库,最初由 salvatore sanfilippo 开发,它在内存中存储数据,并提供了持久化功能,可以将数据保存到磁盘中,是一种nosql(not-only sql,非关系型数据库)的数据库。
它的数据结构十分丰富,基础数据类型包括:string(字符串)、list(列表,双向链表)、hash(散列,键值对集合)、set(集合,不重复)和 sorted set(有序集合),这使得它不仅仅是一个简单的键值存储,还可以用于存储和处理复杂的数据。
数据类型和底层结构的对应关系
string list hash set sorted set
简单动态字符串 双向链表、压缩链表 压缩链表、哈希表 压缩链表、整数数组 压缩链表、跳表
底层实现的时间复杂度
跳表 双向链表 压缩链表 哈希表 整数数组
o(logn) o(n) o(n) o(1) o(n)
可以看出除了 string 类型的底层实现只有一种数据结构,其他四种均有两种底层实现,这四种类型为集合类型,其中一个键对应了一个集合的数据。
redis 特点/优势
redis 具备许多特点和优势,所以在大规模应用和高并发场景中得到广泛应用。
丰富的数据结构:redis 支持多种数据结构,包括字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)等。每种数据结构都有丰富的操作命令,可以方便地对数据进行存储和处理。
持久化:redis 提供了两种持久化方式,rdb(redis database)和 aof(append only file)。rdb 是将数据库在指定时间点转储到磁盘的快照持久化方式,aof 是将写操作追加到文件末尾的日志持久化方式。这两种方式可以根据需求进行选择,保证数据在服务器重启后不会丢失。
高性能:redis 是一种内存数据库,数据存储在内存中,因此读写速度非常快。它采用单线程模型,避免了多线程带来的竞争问题,使得 redis 能够充分利用 cpu 和内存资源。
支持事务:redis 支持事务操作,可以将多个命令打包执行,保证这些命令要么全部执行成功,要么全部失败,保持数据的一致性。虽然 redis 在单个命令的执行上是原子性的,但是多个命令的组合并不是原子性的,通过事务可以实现一组命令的原子性执行。
高可用与分布式:redis 支持主从复制、哨兵和集群等功能,可以构建高可用和分布式的 redis 架构。主从复制可以实现数据的热备份和读写分离,哨兵可以监控 redis 的健康状态并进行自动故障转移,集群可以将数据分布在多个节点上,提高性能和扩展性。
发布订阅:redis 支持发布订阅模式,可以实现消息的发布和订阅。发布者将消息发布到指定的频道,订阅者可以订阅感兴趣的频道并接收相应的消息,实现了解耦和实时通信。
redis 为什么很快
内存存储:redis将数据存储在内存中,而不是像传统的磁盘存储数据库那样将数据写入到硬盘上。由于内存的读写速度远远快于磁盘,因此redis能够实现极快的读写性能。
单线程模型:redis采用单线程模型,每个redis实例都由单个主线程来处理所有的客户端请求。虽然单线程看起来似乎会限制其性能,但这实际上是redis的一大优势。单线程模型消除了多线程之间的竞争和锁等开销,使得redis能够充分利用cpu资源,并且避免了多线程带来的复杂性。此外,redis在内部使用了i/o多路复用技术(例如epoll或kqueue)来处理并发请求,使得单线程能够同时处理多个客户端连接。
非阻塞io:redis使用了非阻塞io,也就是在读写操作时不会阻塞其他操作。在读取数据时,如果内存中没有所需的数据,redis会立即返回一个空结果,而不会等待数据从磁盘加载进来。这样即使在高并发情况下,redis也能够快速地响应请求。
高效的数据结构:redis支持多种高效的数据结构,比如字符串、哈希、列表、集合、有序集合等。这些数据结构的设计和实现都非常高效,能够在常量时间内完成查找、插入、删除等操作,保证了redis的高速性能。
异步操作:redis支持异步操作,比如异步持久化和异步复制。异步操作能够让redis在进行磁盘持久化和主从复制时不会阻塞其他操作,提高了整体的性能。
优化的网络协议:redis使用resp(redis serialization protocol)作为网络协议,resp是一种简单、高效的二进制协议。resp协议的设计使得网络传输的数据量尽可能地减少,减少了网络传输的开销,提高了性能。
原子性操作:redis支持很多原子性操作,比如incr、decr、setnx等。原子性操作能够在一条命令中完成多个操作,而且这些操作是不可中断的,保证了数据的一致性。
应用场景
由于 redis 具备高性能、丰富的数据结构和多种特性,它的主要应用场景如下:
缓存:作为缓存数据库,redis 可以将经常访问的数据存储在内存中,避免频繁读写数据库,提高应用的响应速度。缓存可以存储热点数据,减轻后端数据库的压力,提高系统的吞吐量。
计数器:利用 redis 的原子性操作,可以实现高效的计数器功能,比如网站的点赞、浏览次数等统计功能。由于 redis 原子性操作的特性,计数器的更新可以并发执行而不会出现竞争问题。
消息队列:redis 的发布订阅功能和列表数据结构可以实现简单的消息队列,用于解耦系统的各个模块。生产者将消息发布到指定频道,消费者订阅感兴趣的频道并处理消息,实现异步消息传递。
排行榜:使用有序集合数据结构,可以实现排行榜功能,比如游戏中的玩家排名。通过有序集合的分数属性,可以对玩家的得分进行排序和排名,实时显示排行榜。
会话缓存:在 web 应用中,可以使用 redis 存储用户的会话数据,实现分布式会话管理。用户登录后,可以将会话数据存储在 redis 中,从而实现多台服务器之间的会话共享。
如何安装和使用
安装 redis 非常简单,可以通过官方网站下载源代码进行编译安装,也可以使用包管理工具安装。对于 ubuntu 系统,可以使用以下命令安装 redis:
bashcopy codesudo apt updatesudo apt install redis-server
安装完成后,可以使用以下命令启动 redis 服务:
bashcopy codesudo systemctl start redis-server
连接 redis 服务器可以使用 redis-cli 命令行工具:
bashcopy coderedis-cli
5. 常用命令
设置键值对:
bashcopy codeset key value
获取键值对:
bashcopy codeget key
设置过期时间:
bashcopy codesetex key seconds value
删除键:
bashcopy codedel key
使用列表:
bashcopy codelpush list_key value1 value2 value3 # 从左侧插入元素rpush list_key value4 value5 # 从右侧插入元素lrange list_key 0 -1 # 获取所有元素
总结
redis 是一款功能强大且广泛应用于各种场景的内存数据库。它的快速读写性能、丰富的数据结构和多种特性使得它成为处理高速数据和构建高可用、分布式系统的理想选择。无论是作为缓存、计数器、消息队列还是会话缓存,redis 都能发挥出色的性能。
Ubuntu 22.04查看DNS的方法
OPPO Find X2 Pro评测,结果超乎想象
数字化时代 八种输入设备即将取代电脑键盘
Xilinx FPGA独立的下载和调试工具LabTools下载、安装、使用教程
找实惠!找优惠!就找惠普E3631A直流电源E3631A
Redis简介/特点/优势/应用场景 Redis如何安装和使用
数据存储进化论,曙光存储引领未来
基于AT89C51单片机和放大器实现音频信号均幅控制放大电路的设计
Imagination推出新款高性能的汽车内饰装备
光伏逆变器有哪些保护功能
人工智能研究的进展将与硬件创新密切相关
基于SOPC技术的虚拟示波器设计
发展区块链哪些需要被重视
台电推出新款平板电脑 搭载联发科P70处理器售价1299元
蒋国庆分析:法定数字货币与区块链的关系
Sysmark桌面处理器排行榜公布 Intel占据前7名
人工气候培养箱是什么,它都具备着哪些优势
ARRI在CES艾美奖颁奖典礼鸣谢安森美半导体的贡献
几种常见的过压保护电路
芯翼信息科技新推出 XY1100 芯片,为物联网连接提供服务