【Redis】Resdis介绍及5种常用数据结构

Redis介绍

简介

Redis(Remote Dictionary Server)是一种开源的键值存储系统,它支持多种数据结构如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)以及有序集合(sorted sets)。Redis 的主要特点是其内存中的数据存储方式,这使得 Redis 能够实现非常高的读写速度。此外,Redis 还支持数据持久化,可以将内存中的数据异步写入硬盘中。

Redis具有以下的优点:

1、高性能:由于数据存放在内存中,Redis 提供了非常快的数据访问速度。

2、丰富的数据类型:支持多种数据结构,方便实现不同的应用场景。

3、持久化机制:支持 RDB 快照和 AOF 日志两种持久化方式,保证数据安全。

4、高可用:通过主从复制和哨兵系统,实现高可用性和故障恢复。

5、功能丰富:提供事务、发布/订阅、Lua脚本等功能

使用场景

  • 缓存功能‌:Redis可以作为高性能缓存系统,将热门数据存储在内存中,提升数据访问速度并减轻后端数据库的压力。
  • ‌排行榜和热数据:Redis的Sorted Set数据结构非常适合用于排行榜和实时热数据的场景。可以将数据按照某个指标排序,并实时更新排名。
  • ‌计数器和限流:利用INCR和DECR命令,Redis可以用于实现计数器和限流功能。例如,可以通过设置访问者的IP和其他信息作为key,限制在一定时间内的访问次数,超过次数则拒绝服务。‌
  • 会话存储‌:Redis可以用于存储会话信息,通过在用户登录时将会话数据存储在Redis中,并在无状态的服务器之间共享,提高系统的扩展性和可靠性。
  • 分布式锁:通过设置具有唯一性的锁标识来实现分布式环境下的同步控制。
  • 其他一些利用各种数据类型实现的功能(位统计、全局ID等)

键(key)

Redis 是一种高级的key-value的存储系统,我们所说的数据结构是指Value中存储的数据类型。而键(key)是数据存储的基本单位之一,用于标识存储的数据。合理的键设计对于 Redis 的高效使用至关重要,以下是在实际开发中, Redis 键的一些定义要求和最佳实践:

键的命名规则

  • 长度限制:键的最大长度为 512 MB,但实际上建议键的长度不能过长,过长的键不仅是因为占用内存,而且太长会影响查询的速度。也不宜过短,过短的key可能会降低可读性
  • 命名规范:键的命名应该清晰、简洁且具有描述性,便于理解和维护,避免使用生僻或特殊的字符。

键的设计原则

  • 前缀:使用前缀可以帮助组织和分类键,便于管理和查询。
    • 例如:user:123product:456
  • 后缀:使用后缀可以进一步细化键的内容。
    • 例如:user:123:profileproduct:456:details
  • 层次结构:使用冒号(:)分隔不同层级的信息。
    • 例如:user:123:orders:2023-01-01

数据结构

字符串(String)

字符串类型是Redis中最为基础的数据存储类型,它在Redis中以二进制保存,没有编码和解码的过程,无论存入的是字符串、整数、浮点类型都会以字符串写入。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

1. 基本概念

  • 键值对:字符串类型表示为一个键(key)和一个值(value)的组合。
  • 值类型:值可以是任何二进制数据,包括文本、数字或其他二进制序列。

2.常用命令

命令描述例子
SET key value设置键 key 的值为 value。SET name "Tome"
GET key获取指定 key 的值。GET name
INCR key将 key 中储存的数字值增一。如果没有key,先初始化为0,再加1INCR pageSize
DECR key将 key 中储存的数字值减一。DECR pageSize
SETNX key value只有在 key 不存在时设置 value值。成功返回1,失败放回0。SETNX  age  12
DEL key删除指定的键和值,返回成功的个数。DEL name

 列表(List)

Redis 的列表(List)类型是一种常用的数据结构,用于存储多个元素的有序集合(元素有序可以重复)。列表中的每个元素都是一个字符串,可以包含任意二进制数据。List中可以包含的最大元素数量是40亿个。 列表非常适合用于实现消息队列、任务队列等场景。

1.数据结构

Redis 列表类型内部使用双向链表(linked list)实现。这种数据结构支持高效的插入和删除操作,特别是在列表的两端。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表,如果这个键已经存在,则是向list添加元素。与此相反,如果链表中所有的元素均被移除,那么该键也将会被删除。

2.常用命令

命令描述
LPUSH key value [value ...]从列表的头部(左侧)插入一个或多个元素。
RPUSH key value [value ...]从列表的尾部(右侧)插入一个或多个元素。
LPOP key从列表的头部(左侧)弹出一个元素并返回
RPOP key从列表的尾部(右侧)弹出一个元素并返回。
LRANGE key start stop获取列表中指定范围内的元素,从左边数起从0开始,从右边数起从-1开始。如果要取整个列表,开始是0,结束是-1
LINDEX key INDEX获取列表中指定索引位置的元素。
LLEN key获取列表的长度

3.应用场景

  • 消息队列:使用列表存储待处理的消息,前端从头部弹出消息进行处理。
  • 任务队列:存储待执行的任务,后台从列表尾部弹出任务进行处理。
  • 最近操作记录:存储用户的最近操作记录,通过列表的头部和尾部进行操作。
哈希类型(Hash)

Redis 的哈希类型(Hash)是一种非常灵活的数据结构,用于存储键值对集合。哈希类型非常适合存储对象,每个对象由多个字段组成。每个字段都有一个对应的值,这些字段和值都是字符串类型。每一个Hash可以存储40亿个键值对。

1. 数据结构

Redis 的哈希类型内部使用哈希表(hash table)实现。每个哈希表都由多个键值对组成,每个键值对称为一个字段(field)和值(value)。

2. 常用命令

命令描述

HSET key field value

向指定的键中添指定的字段名和值

HGET key field

取出指定键的指定字段的值

HMSET key field1  value1 field2 value2

一次向某个键中设置多个字段名和值

HMGET key field1  field2

一次从指定的键中得到多个字段的值

HDEL key field1  field2

删除一个键中的一个或多个字段

HGETALL key

得到某个键所有的字段值

3.哈希冲突

当哈希表中数据越来越多后,会出现哈希冲突,也就是多个key的哈希值可能对应到同一个哈希桶中。Redis使用链式哈希来解决哈希冲突,就是将同一个哈希桶中的多个元素用一个链表来保存,元素之间依次用指针链接。

如果哈希冲突越来越多,会导致哈希冲突链过长,进而导致查找元素耗时长、效率低。为了解决这个问题,Redis会对哈希表进行rehash操作,将多个entry元素分散保存,减少单个哈希桶中的元素个数,从而减少单个桶中的冲突。 

4.应用场景

  • 用户信息存储:存储用户的详细信息,如姓名、年龄、电子邮件等。
  • 商品信息存储:存储商品的详细信息,如名称、价格、库存等。
  • 配置信息存储:存储应用程序的配置信息,如服务器地址、端口等。
  • 统计信息存储:存储统计数据,如用户访问次数、商品销售数量等。 
 集合(Set)

Redis 的 Set 类型是一种无序且不重复的字符串集合。Set 类型非常适合用来存储一组唯一的元素,例如用户好友列表、标签集合等。Set 类型内部使用哈希表实现,确保了元素的唯一性。Set可包含的最大元素数量是40亿。

1. 数据结构

Redis 的 Set 类型内部使用哈希表(hash table)实现。每个元素都是一个字符串,且集合中的元素不允许重复。

2.常用命令

命令描述

SADD key value1 value2 ...

向set集合中添加1个或多个元素

SMEMBERS key

查询指定的集合中所有的元素

SISMEMBER key value

判断指定的元素是否在某个集合中,如果存在返回1,否则返回0

SCARD key获取集合中的成员数量

SREM key value1 value2 ...

remove 删除指定的一个或多个元素

SUNION key1 kye2

返回给定集合的并集。不存在的集合 key 被视为空集。

3. 应用场景

  • 用户好友列表:存储用户的多个好友,确保每个好友只出现一次。
  • 标签集合:存储文章或产品的多个标签,确保每个标签只出现一次。
  • 权限管理:存储用户的多个权限,确保每个权限只出现一次。
  • 去重操作:存储需要去重的元素集合。 
 有序集合(Zset)

 Redis 的有序集合(Sorted Set,简称 ZSet)是一种特殊的集合类型,它不仅存储了一组唯一的元素,还为每个元素关联了一个分数(score),使得集合中的元素可以根据分数进行排序。ZSet 非常适合用于排行榜、优先级队列等场景

1. 数据结构
Redis 的 ZSet 内部使用跳表(skip list)和哈希表(hash table)实现。跳表用于按分数排序,哈希表用于快速查找元素。

  • 跳表:用于按分数排序,支持高效的范围查询和排序操作。
  • 哈希表:用于快速查找元素,确保元素的唯一性

2.常用命令

命令描述

ZAAD key score1 value1  score2 value2 ...

向有序集合添加一个或多个成员

ZRANGE key start stop

通过索引区间返回有序集合中指定区间内的成员

ZREM key value1 value2 ...

移除有序集合中的一个或多个成员

ZRANK key value

返回有序集合中指定成员的索引

ZCARD key

获取有序集合的成员数

ZSCORE key  value

得到指定成员的分数

  3.应用场景

  • 排行榜:存储用户的得分,按分数排序显示排行榜。
  • 优先级队列:存储任务,按优先级(分数)排序处理任务。
  • 时间线:存储事件,按时间戳(分数)排序显示事件。
  • 推荐系统:存储用户的兴趣评分,按评分排序推荐内容

更多命令操作请参考菜鸟教程Redis中文网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cz_mooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值