简介

  • Redis相关笔记

redis是什么

Redis是一个开源的内存数据库,它可以用作键值存储、缓存和消息队列。Redis支持各种数据结构,如字符串、哈希、列表、集合、有序集合等,这使得它非常灵活和多用途。它通常被用来加速应用程序的性能,存储会频繁访问的数据,或者作为分布式系统中的数据存储和消息传递中间件。Redis的速度非常快,因为它将数据存储在内存中,并且可以通过持久化机制将数据保存到磁盘上以进行持久化存储。

Redis(维基百科)

  • Redis(Remote Dictionary Server)是一个使用ANSI C编写的支持网络,基于内存,分布式,可选持久性的键值对存储数据库。

  • 数据模型
    • Redis的外围由一个键,值映射的字典构成。与其他非关系型数据库主要不同在于: Redis中值的类型不仅限于字符串,还支持如下抽象数据类型
      • 字符串列表
      • 无序不重复的字符串集合
      • 有序不重复的字符串集合
      • 键,值都为字符串的哈希表
    • 值的类型决定了值本身支持的操作。Redis支持不同无序,有序的列表,无序,有序的集合间的交集,并集等高级服务器端原子操作
  • 持久化
    • Redis通常将全部数据存储在内存中
    • 目前通过两种方式实现持久化
      • 使用快照,一种半持久耐用模式。不时的将数据集以异步方式从内存以RDB格式写入硬盘
      • 1.1版本开始使用更安全的AOF格式替代,一种只能追加的日志类型。将数据集修改操作记录起来。Redis能够在后台对只可追加的记录进行修改,从而避免日志的无限增长。
  • 同步
    • Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助
  • 性能
    • 当数据依赖不再需要,Redis这种基于内存的性质,与在执行一个事务时将每个变化都写入硬盘的数据库系统相比就显得执行效率非常高。[11]写与读操作速度没有明显差别。

数据库 redis 详解

Redis是一个非常流行的开源内存数据库,它提供了丰富的功能和灵活的用途。下面是对Redis的一些详细解释:

  1. 内存数据库:Redis主要将数据存储在内存中,这使得它能够提供非常快速的读写操作。由于内存的速度远高于磁盘,因此Redis能够在毫秒级别处理大量的读写请求。

  2. 键值存储:Redis是一个键值存储系统,其中的每个键都与一个值相关联。这种简单的数据结构使得Redis在处理简单数据模型时非常高效。

  3. 数据结构支持:Redis支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等。这些数据结构使得Redis可以应对各种不同的需求,并提供了丰富的数据操作命令。

  4. 持久化存储:尽管Redis主要将数据存储在内存中,但它也提供了持久化存储功能,可以将数据定期保存到磁盘上,以防止数据丢失。

  5. 缓存:由于其快速的读写速度和灵活的数据结构,Redis经常被用作缓存系统。它可以将经常访问的数据存储在内存中,从而加速应用程序的性能。

  6. 发布/订阅:Redis支持发布/订阅模式,可以用作消息队列系统。发布者可以将消息发布到特定的频道,而订阅者则可以订阅这些频道以接收消息。

  7. 分布式系统支持:Redis提供了多种分布式特性,如主从复制、分片等,使得它可以在分布式系统中使用,并提供高可用性和可扩展性。

  8. 事务支持:Redis支持事务操作,可以将多个命令打包成一个原子操作,从而保证这些命令要么全部执行成功,要么全部执行失败。

总的来说,Redis是一个功能强大、性能优越的内存数据库,可以应对各种不同的应用场景,从简单的缓存系统到复杂的分布式系统都能够发挥作用。

linux redis C++相关工具库

在Linux环境下,有几个与Redis相关的C++工具库可以用来与Redis进行交互和操作。以下是其中一些:

  1. hiredis:hiredis是一个轻量级的C库,用于与Redis进行交互。虽然它是用C编写的,但也提供了C++的包装器,可以在C++项目中使用。hiredis提供了简洁的API,使得与Redis进行连接、发送命令和接收响应变得非常方便。

  2. cpp_redis:cpp_redis是一个用C++编写的Redis客户端库,提供了现代C++风格的API和异步支持。它的设计使得在C++应用程序中与Redis进行交互变得更加简单和高效。

  3. Redox:Redox是另一个用C++编写的Redis客户端库,它提供了类似于cpp_redis的现代C++接口,并支持异步操作。Redox的设计目标是提供简单易用的API,同时保持高性能。

这些工具库都可以在Linux环境下使用,并且都支持与Redis进行连接、命令发送、响应接收等操作。选择哪个库取决于你的项目需求和个人偏好,但无论选择哪个,它们都提供了方便、高效的方式来利用Redis的功能。

linux redis开发结构是什么样的

在Linux环境下进行Redis开发时,通常会采用一种分层结构来组织代码和实现功能。这种结构可以根据项目的规模和复杂度进行调整,但通常包含以下几个层次:

  1. 应用层:应用层是最高级别的层次,它包含与业务逻辑直接相关的代码。在这一层,开发者会编写与具体业务需求相关的功能,如数据处理、业务逻辑实现等。应用层通过调用下一层的接口来与Redis进行交互,发送命令、接收响应,并处理返回的数据。

  2. Redis客户端库:在应用层之下是Redis客户端库,它提供了与Redis服务器进行通信的API和功能。开发者可以使用已有的Redis客户端库,如hiredis、cpp_redis或Redox,也可以根据需要自行开发客户端库。这一层负责建立与Redis服务器的连接,发送命令和接收响应,并提供方便的接口供应用层调用。

  3. 网络通信层:在客户端库之下是网络通信层,它负责处理与Redis服务器之间的网络通信。这一层实现了与Redis服务器的连接建立、命令发送、响应接收等功能,通常使用TCP/IP协议来进行通信。

  4. Redis服务器:最底层是Redis服务器,它负责存储数据、处理命令、生成响应等功能。Redis服务器通常在Linux环境下运行,可以作为单机或分布式系统来部署和管理。

在这种结构下,应用层通过调用Redis客户端库提供的API与Redis进行交互,而客户端库则通过网络通信层与Redis服务器建立连接,并发送命令和接收响应。这种分层结构使得Redis开发更加模块化和可维护,同时也提供了灵活性和扩展性,能够适应不同规模和复杂度的项目需求。

redis的用途 详解

Redis 是一个开源的、基于内存的数据存储系统,它支持多种数据结构(如字符串、哈希表、列表、集合、有序集合等),并提供了丰富的功能和特性。Redis 的用途非常广泛,包括但不限于以下几个方面:

1. 缓存:

Redis 可以作为高性能的缓存系统,用于存储常用的数据,加速访问速度。由于 Redis 的数据存储在内存中,读写速度非常快,适合存储热点数据和频繁访问的数据。常见的缓存应用包括网页缓存、会话缓存、对象缓存等。

2. 数据库:

虽然 Redis 是一个键值存储系统,但它的数据结构支持丰富,可以存储复杂的数据类型,并提供了持久化功能,可以将数据持久化到磁盘上。因此,Redis 也可以作为轻量级的数据库使用,适用于一些对数据持久性要求不是很高的场景,如消息队列、计数器、排行榜等。

3. 分布式锁:

Redis 的原子操作和分布式特性使其成为实现分布式锁的一个理想选择。通过 Redis 的 SETNX(SET if Not eXists)命令可以很方便地实现分布式锁,保证在分布式环境下的数据一致性和并发安全性。

4. 消息队列:

Redis 的发布订阅功能使其成为一个简单而有效的消息队列系统。生产者可以将消息发布到指定的频道,而订阅者则可以订阅这些频道,并在有消息到达时接收并处理。这种发布-订阅模式非常适用于异步任务处理、消息广播等场景。

5. 实时排行榜和计数器:

由于 Redis 支持有序集合和原子操作,可以非常方便地实现实时排行榜和计数器功能。通过有序集合存储分数和成员的对应关系,可以实现按分数排序的排行榜,而通过增减操作可以实现实时计数器功能。

6. 地理位置应用:

Redis 的地理位置数据结构和地理位置计算命令,使其成为实现地理位置应用(如附近的人、地点推荐等)的一个良好选择。通过地理位置数据结构存储经纬度信息,并使用地理位置计算命令进行距离计算和位置查询,可以实现许多有趣的地理位置应用。

总结:

Redis 是一个功能强大、用途广泛的数据存储系统,可以应用于缓存、数据库、分布式锁、消息队列、实时计数器、地理位置应用等众多场景。其快速、高效、稳定的特性使其成为众多互联网应用的首选,是一个非常受欢迎的开源项目。

redis报文 详解

在 Redis 中,通信是通过简单的文本协议进行的,称为 Redis 协议(Redis Protocol)。Redis 协议是一种基于文本的、简单易懂的协议,它使用 RESP(REdis Serialization Protocol)格式来进行数据的序列化和反序列化。下面是关于 Redis 协议报文的详细解释:

1. RESP 格式:

RESP 是 Redis 自定义的一种序列化协议,用于在客户端和服务器之间传输数据。RESP 格式有以下几种类型:

  • 单行字符串(Simple Strings):以 “+” 开头,例如:+OK\r\n
  • 错误消息(Errors):以 “-“ 开头,例如:-Error message\r\n
  • 整数值(Integers):以 “:” 开头,例如::1000\r\n
  • 批量字符串(Bulk Strings):以 “$” 开头,例如:$6\r\nfoobar\r\n
  • 数组(Arrays):以 “*” 开头,例如:*3\r\n:1\r\n:2\r\n:3\r\n

2. Redis 协议报文示例:

下面是一个 Redis 协议报文的示例:

1
2
3
4
*3\r\n
$3\r\nSET\r\n
$5\r\nmykey\r\n
$7\r\nmyvalue\r\n

这个报文表示一个数组,包含三个元素,分别是一个字符串 SET、一个字符串 mykey 和一个字符串 myvalue。这个报文表示的操作是向 Redis 数据库中设置一个键值对,键为 mykey,值为 myvalue。

3. 报文的解析与处理:

在 Redis 客户端和服务器之间的通信过程中,客户端会向服务器发送一系列的命令请求报文,服务器接收到请求后进行解析和处理,然后返回相应的响应报文给客户端。客户端收到响应后进行解析并根据需要进行后续的操作。

4. 客户端和服务器之间的通信:

在实际的使用中,Redis 客户端和服务器之间的通信是通过套接字(Socket)来实现的。客户端通过套接字向服务器发送请求报文,服务器接收到请求后进行处理,并根据请求发送响应报文给客户端。

5. 序列化与反序列化:

Redis 协议中的报文需要进行序列化和反序列化操作,以便在网络上传输和在客户端/服务器中进行处理。客户端和服务器需要实现相应的序列化和反序列化算法来处理 Redis 协议报文。

总的来说,Redis 协议是一种简单易懂的文本协议,用于客户端和服务器之间的通信。通过使用 RESP 格式的报文,客户端可以向服务器发送命令请求,服务器接收到请求后进行处理,并返回相应的响应给客户端。这种基于文本的通信协议使得 Redis 在网络传输和数据处理方面具有良好的可扩展性和易用性。

redis有哪些数据结构

Redis 是一个支持多种数据结构的内存数据库,每种数据结构都有其特定的用途和优势。以下是 Redis 中常见的数据结构:

  1. 字符串(String):
    • 最基本的数据结构,存储一个键值对,键是字符串,值可以是字符串、整数或浮点数。
  2. 哈希表(Hash):
    • 类似于关联数组,存储字段和与其关联的值的映射关系,用于存储对象。
  3. 列表(List):
    • 双向链表结构,支持插入、删除、查找等操作,可以用作队列、栈等数据结构。
  4. 集合(Set):
    • 无序集合,元素唯一,支持添加、删除、查找等操作,可以用于存储唯一值。
  5. 有序集合(Sorted Set):
    • 类似于集合,每个元素都关联了一个分数(score),元素按照分数从小到大排序,支持添加、删除、查找等操作。
  6. 位图(Bitmap):
    • 由二进制位组成的数据结构,支持位运算操作,可以用于表示用户在线状态、标记用户行为等。
  7. HyperLogLog:
    • 用于基数估计的数据结构,用于估算集合中元素的数量。
  8. 地理空间索引(GeoSpatial):
    • 存储地理位置信息的数据结构,支持添加、删除、查找等操作,可以用于位置信息检索和计算。

这些数据结构使 Redis 能够满足不同场景下的需求,例如缓存、计数器、消息队列、排行榜等。在使用 Redis 时,根据具体需求选择合适的数据结构能够更好地发挥其性能和功能优势。

连接操作命令

  • quit : 关闭连接
  • auth : 简单密码认证
  • help cmd : 查看cmd帮助,例如:help quit

持久化

  • save : 将数据同步保存到磁盘
  • bgsave : 将数据异步保存到磁盘
  • lastsave : 返回上次成功将数据保存到磁盘的Unix时戳
  • shundown : 将数据同步保存到磁盘,然后关闭服务

远程服务控制

  • info : 提供服务器的信息和统计
  • monitor : 实时转储收到的请求
  • slaveof : 改变复制策略设置
  • config : 在运行时配置Redis服务器

对value操作的命令

  • exists (key) : 确认一个key是否存在
  • del (key) : 删除一个key
  • type (key) : 返回值的类型
  • keys (pattern) : 返回满足给定pattern的所有key
  • randomkey : 随即返回key空间的一个
  • keyrename(oldname, newname) : 重命名key
  • dbsize : 返回当前数据库中key的数目
  • expire : 设定一个key的活动时间(s)
  • ttl : 获得一个key的活动时间
  • select (index) : 按索引查询
  • move (key, dbindex) : 移动当前数据库中的key到dbindex数据库
  • flushdb : 删除当前选择数据库中所有key
  • flushall : 删除所有数据库中的所有key

List

  • rpush(key, value) : 在名称为key的list尾部添加一个值为value的元素
  • lpush(key, value) : 在名称为key的list头部添加一个值为alue的元素
  • llen(key) : 返回名称为key的list长度
  • lrange(key, start, end) : 返回名称为key的list中start至end之间的元素
  • ltrim(key, start, end) : 截取名称为key的list
  • lindex(key, index) : 返回名称为key的list中index位置的元素
  • lset(key, index, value) : 给名称为key的list中index位置的元素赋值
  • lrem(key, count, value) : 删除count个key的list中值为value的元素
  • lpop(key) : 返回并删除名称为key的list中的首元素
  • rpop(key) : 返回并删除名称为key的list中的尾元素
  • blpop(key1, key2, ... key N, timeout) : lpop命令的block版本
  • brpop(key1, key2, ... key N, timeout) : rpop的block版本