问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

深入理解使用Redis:API详解与实战

创作时间:
作者:
@小白创作中心

深入理解使用Redis:API详解与实战

引用
CSDN
1.
https://blog.csdn.net/littleMonster_LC/article/details/137589417

Redis是一种开源的内存数据结构存储系统,常被用作数据库、缓存和消息中间件。它支持多种数据结构,包括字符串、哈希、列表、集合和有序集合。本文将深入探讨Redis的基础知识、数据结构、键管理、数据库管理等内容,帮助读者全面理解Redis的使用方法。

前言

Redis提供了五种数据结构,理解每种数据结构非常重要,同时掌握Redis的单线程命令处理机制,会使数据结果和命令的选择事半功倍,本次大概类容如下:

  1. Redis基础知识
  2. 5种数据结构
  3. 键的管理、遍历、数据库管理

一、基础知识

了解一下Redis的一些全局命令、数据结构和内部编码、单线程命令处理机制很有必要,为以后的学习和使用打下坚实基础

1.全局命令

  1. 查看所有的键
    keys *
  2. 键总数
    dbsize
    注:keys和dbsize,在正式环境中如果需要查看键的数量或者键值,如果存在大量键时,禁止使用keys,因为keys会遍历所有键。dbsize直接获取的Redis内置的键总数变量,可以使用
  3. 检查键是否存在
    exists key
  4. 删除键
    del key [key ....]
  5. 键过期
    expire key seconds
    当超过过期时间后,会自动删除键,可以通过ttl命令来观察剩余过期时间
  6. 键的数据结构类型
    type key

2.数据结构和内部编码

3.单线程架构

Redis使用单线程架构和I/O多路复用模型来显示高性能的内存数据库服务,一般来说单线程的处理能力要比多线程的差,那为什么redis会达到每秒万级的处理能力,有以下三点原因:

  1. 纯内存访问
  2. 非阻塞I/O
  3. 单线程避免了线程切换和竞态产生的消耗

二、Redis数据结构详解

1.字符串

字符串类型时Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型的基础上构建的。字符串类型的值可以时字符串,数字,甚至是二进制(图片,音视频),但是不能超过512M

1.1 字符串常用的命令:

  1. 设置值
    set key value
  2. 批量设置值
    mset key value [key value .....]
  3. 获取值
    get key
  4. 批量获取值
    mget key [key .....]
  5. 计数
  • 对值做自增操作,其中值必须是整数
    incr key
  • 对值做自减操作,其中值必须是整数
    decr key
  • 对值做自增指定数字操作,其中值必须是整数
    incrby key increment
  • 对值做自减指定数字操作,其中值必须是整数
    decrby key decrement
  • 对值做自增浮点数操作
    incrbyfloat key increment
  1. 追加值
    append key value
    ,可以向字符串尾部追加值
  2. 字符串长度
    strlen key
    注每个中文占用3个字节,相当于一个中文返回的长度为3
  3. 设置并返回原值
    getset key value
  4. 设置指定位置的字符
    setrange key offeset value
  5. 获取部分字符串
    getrange key start end

1.2 内部编码:

字符串的内部编码有三种:

  1. int:8个字节的长整型
  2. embstr: 小于等于39个字节的字符串
  3. raw: 大于39个字节的字符串

1.3 使用场景:

  1. 缓存功能,Redis作为缓存层,关系型数据库如MySql作为存储层,大部分请求的数据从Redis中获取,可以加速读写和降低后端压力。
  2. 计数,常用场景比如视频播放数,点赞收藏数。不过实际开发过程中需要考虑防作弊,不同维度计数,和数据库持久化等问题
  3. Session共享
  4. 限制访问频率,比如限制验证码获取频率,相同IP的不同接口访问次数、页面重复点击等

2.哈希

哈希是一种常见的类型,也有叫法可能是字典、关联数组。在Redis中哈希类型的键值本身也是一个键值对结构

2.1 常用的命令:

  1. 设置值
    hset key field value
  2. 批量设置值
    hmset key field value [field value .....]
  3. 获取值
    hget key
  4. 批量获取值
    hmget key field [field .....]
  5. 删除field
    hdel key field [field..........]
  6. 计算field个数
    hlen key
  7. 判断field是否存在
    hexists key field
  8. 获取所有field
    hkeys key
  9. 获取所有的value
    hvals key
  10. 获取所有的field-value
    hgetall key
    慎用,当哈希元素个数比较多的时候,可能会阻塞Redis

2.2 内部编码:

哈希类型的内部编码有俩种:

  1. ziplist(压缩列表):当哈希类型的元素个数小于512个同时所有值都小于64字节时,Redis会使用ziplist作为哈希的内部实现
  2. hashtable(哈希表):反之就用哈希表来实现

2.3 使用场景:

缓存

3 列表

列表List类型时用来存储多个有序的字符串,可参考上图的数据结构。每个字符串称为一个元素,一个列表最多可以存储2的32次方-1个元素,可以充当对于和栈的角色

3.1 常用的命令:

  1. 添加
  1. 从右边插入元素
    rpush key value[value.........]
  1. 从左边插入元素
    lpush key value[value.........]
  1. 从某个元素前或者后边插入元素
    linsert key before|after pivot value
  2. 查询
  1. 获取指定范围内的元素
    lrange key start end
  1. 获取列表指定索引下标的元素
    lindex key index
  1. 获取列表长度
    llen key
  2. 删除
  1. 从列表左侧弹出元素
    lpop key
  1. 从列表右侧弹出元素
    rpop key
  1. 删除指定元素
    lrem key count value
    其中count大于0 从左到右删除最多count个元素,小于0则从右到左,等于0即删除所有元素
  1. 按照索引范围裁剪列表
    ltrim key start end
  2. 修改
  1. 修改指定索引下标的元素
    lset key index newvalue
  2. 阻塞操作
    blpop|brpop key [key.........] timeout

3.2 内部编码:

list类型的内部编码有俩种:

  1. ziplist(压缩列表):当哈希类型的元素个数小于512个同时所有值都小于64字节时,Redis会使用ziplist作为哈希的内部实现
  2. linkedlist(链表):反之就用链表来实现

3.2 常用场景:

  1. 消息队列
  2. 文章列表

4 集合

集合(set)类型 也是保存多个字符串,与list不同的是,set集合不允许有重复的元素,且集合中的元素是无序的,不能通过索引去获取元素

4.1 常用的命令:

  1. 添加
    asdd key element [element..............]
  2. 删除
    srem key element [element..............]
  3. 计算元素个数
    scard key
  4. 判断元素是否在集合中
    sismember key element
  5. 随机从集合返回指定个数元素
    srandmenber key [count ]
  6. 从集合随机弹出元素
    spop key
    ,会删除对应元素
  7. 获取所有元素
    smembers key
    ,无序
  8. 集合间的操作
  • 多个集合的交集
    sinter key [ key ..........]
  • 多个集合的并集
    sunion key [key .........]
  • 多个集合的差集
    sdiff key [key ............ ]
  • 计算的结果保存,每次计算比较耗时,
    sinter|sunion|sdiff+store key [key ......... ]

4.2 内部编码:

set类型的内部编码有俩种:

  1. intset(整数集合):当集合的元素都是整数且个数小于512,Redis会使用整数集合作为内部实现
  2. hashtable(哈希表):反之就用哈希表来实现

4.3 常见使用场景:

  1. 标签

5 有序集合

有序集合保留了集合不能重复的特性,但是不同的是,有序集合中的元素可以排序。

5.1 常用的命令:

对命令有疑问或者指正的请留言或者私信

  1. 添加成员
    zadd key score element [score element..............]
  2. 计算某个成员分数
    zscore key member
  3. 计算成员个数
    zcard key
  4. 计算成员的排名
    zrank|zrevrank key member
  5. 删除成员
    zrem key member [member ..........]
  6. 增加成员分数
    zincrby key increment member
  7. 返回指定排名范围的成员
    zrange|zrevrange key start end
  8. 返回指定分数范围的成员
    zrangebyscore|zrevrangebyscore
  9. 返回指定分数范围的成员个数
    zcount
  10. 删除指定排名内的升序元素
    zremrangebyrank
  11. 删除指定分数范围的成员
    zremrangebyscore
  12. 集合间的操作
  • 多个集合的交集
    zinterstore destinnation numkeys key [key..............]
  • 多个集合的并集 z
    unionstore destinnation numkeys key [key..............]

5.2 内部编码:

set类型的内部编码有俩种:

  1. ziplist(压缩列表):当集合的元素个数小于128,且每个元素的值小于64字节 Redis会使用ziplist作为内部实现,可以有效减少内存的使用
  2. skiplist(跳跃表):反之就用跳跃表来实现

5.3 常见使用场景:

  1. 排行榜

三、键管理

  1. 重命名键
    rename key newkey
  • 注意事项:
  • 重命名键期间会指向del删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能
  • renamenx 命令可以确保只有newkey 不存在的时候才能被覆盖,反正如果键存在就会被强行覆盖
  1. 随机返回一个键
    randomkey
  2. 键过期
    expire key seconds
  3. 迁移键
    move key db
    dump+restore
  4. 遍历键 keys pattern
  5. 渐进式遍历 scan

四、数据库管理

  1. 切换数据库
    select dbindex
  2. 清除数据库
    flushdb/flushall

总结

以上就是今天要讲的内容,总结如下:

  1. Redis提供五种数据结构,每种数据结构有多种内部实现
  2. 纯内存存储、I/O多路复用技术、单线程架构 是Redis高性能三大因素
  3. 保证每个命令能被快速执行完,否则会出现阻塞的可能
  4. 合理使用批量操作能提高效率
  5. 了解每个命令对于不同的数据规模的影响,对于时间复杂度高的,慎用
  6. scan 命令可以解决keys命令带来的阻塞问题
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号