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:123
、product:456
。
- 例如:
- 后缀:使用后缀可以进一步细化键的内容。
- 例如:
user:123:profile
、product: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,再加1 | INCR 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.应用场景
- 排行榜:存储用户的得分,按分数排序显示排行榜。
- 优先级队列:存储任务,按优先级(分数)排序处理任务。
- 时间线:存储事件,按时间戳(分数)排序显示事件。
- 推荐系统:存储用户的兴趣评分,按评分排序推荐内容