深入理解使用Redis:API详解与实战
深入理解使用Redis:API详解与实战
Redis是一种开源的内存数据结构存储系统,常被用作数据库、缓存和消息中间件。它支持多种数据结构,包括字符串、哈希、列表、集合和有序集合。本文将深入探讨Redis的基础知识、数据结构、键管理、数据库管理等内容,帮助读者全面理解Redis的使用方法。
前言
Redis提供了五种数据结构,理解每种数据结构非常重要,同时掌握Redis的单线程命令处理机制,会使数据结果和命令的选择事半功倍,本次大概类容如下:
- Redis基础知识
- 5种数据结构
- 键的管理、遍历、数据库管理
一、基础知识
了解一下Redis的一些全局命令、数据结构和内部编码、单线程命令处理机制很有必要,为以后的学习和使用打下坚实基础
1.全局命令
- 查看所有的键
keys * - 键总数
dbsize
注:keys和dbsize,在正式环境中如果需要查看键的数量或者键值,如果存在大量键时,禁止使用keys,因为keys会遍历所有键。dbsize直接获取的Redis内置的键总数变量,可以使用 - 检查键是否存在
exists key - 删除键
del key [key ....] - 键过期
expire key seconds
当超过过期时间后,会自动删除键,可以通过ttl命令来观察剩余过期时间 - 键的数据结构类型
type key
2.数据结构和内部编码
3.单线程架构
Redis使用单线程架构和I/O多路复用模型来显示高性能的内存数据库服务,一般来说单线程的处理能力要比多线程的差,那为什么redis会达到每秒万级的处理能力,有以下三点原因:
- 纯内存访问
- 非阻塞I/O
- 单线程避免了线程切换和竞态产生的消耗
二、Redis数据结构详解
1.字符串
字符串类型时Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型的基础上构建的。字符串类型的值可以时字符串,数字,甚至是二进制(图片,音视频),但是不能超过512M
1.1 字符串常用的命令:
- 设置值
set key value - 批量设置值
mset key value [key value .....] - 获取值
get key - 批量获取值
mget key [key .....] - 计数
- 对值做自增操作,其中值必须是整数
incr key - 对值做自减操作,其中值必须是整数
decr key - 对值做自增指定数字操作,其中值必须是整数
incrby key increment - 对值做自减指定数字操作,其中值必须是整数
decrby key decrement - 对值做自增浮点数操作
incrbyfloat key increment
- 追加值
append key value
,可以向字符串尾部追加值 - 字符串长度
strlen key
注每个中文占用3个字节,相当于一个中文返回的长度为3 - 设置并返回原值
getset key value - 设置指定位置的字符
setrange key offeset value - 获取部分字符串
getrange key start end
1.2 内部编码:
字符串的内部编码有三种:
- int:8个字节的长整型
- embstr: 小于等于39个字节的字符串
- raw: 大于39个字节的字符串
1.3 使用场景:
- 缓存功能,Redis作为缓存层,关系型数据库如MySql作为存储层,大部分请求的数据从Redis中获取,可以加速读写和降低后端压力。
- 计数,常用场景比如视频播放数,点赞收藏数。不过实际开发过程中需要考虑防作弊,不同维度计数,和数据库持久化等问题
- Session共享
- 限制访问频率,比如限制验证码获取频率,相同IP的不同接口访问次数、页面重复点击等
2.哈希
哈希是一种常见的类型,也有叫法可能是字典、关联数组。在Redis中哈希类型的键值本身也是一个键值对结构
2.1 常用的命令:
- 设置值
hset key field value - 批量设置值
hmset key field value [field value .....] - 获取值
hget key - 批量获取值
hmget key field [field .....] - 删除field
hdel key field [field..........] - 计算field个数
hlen key - 判断field是否存在
hexists key field - 获取所有field
hkeys key - 获取所有的value
hvals key - 获取所有的field-value
hgetall key
慎用,当哈希元素个数比较多的时候,可能会阻塞Redis
2.2 内部编码:
哈希类型的内部编码有俩种:
- ziplist(压缩列表):当哈希类型的元素个数小于512个同时所有值都小于64字节时,Redis会使用ziplist作为哈希的内部实现
- hashtable(哈希表):反之就用哈希表来实现
2.3 使用场景:
缓存
3 列表
列表List类型时用来存储多个有序的字符串,可参考上图的数据结构。每个字符串称为一个元素,一个列表最多可以存储2的32次方-1个元素,可以充当对于和栈的角色
3.1 常用的命令:
- 添加
- 从右边插入元素
rpush key value[value.........]
- 从左边插入元素
lpush key value[value.........]
- 从某个元素前或者后边插入元素
linsert key before|after pivot value - 查询
- 获取指定范围内的元素
lrange key start end
- 获取列表指定索引下标的元素
lindex key index
- 获取列表长度
llen key - 删除
- 从列表左侧弹出元素
lpop key
- 从列表右侧弹出元素
rpop key
- 删除指定元素
lrem key count value
其中count大于0 从左到右删除最多count个元素,小于0则从右到左,等于0即删除所有元素
- 按照索引范围裁剪列表
ltrim key start end - 修改
- 修改指定索引下标的元素
lset key index newvalue - 阻塞操作
blpop|brpop key [key.........] timeout
3.2 内部编码:
list类型的内部编码有俩种:
- ziplist(压缩列表):当哈希类型的元素个数小于512个同时所有值都小于64字节时,Redis会使用ziplist作为哈希的内部实现
- linkedlist(链表):反之就用链表来实现
3.2 常用场景:
- 消息队列
- 文章列表
4 集合
集合(set)类型 也是保存多个字符串,与list不同的是,set集合不允许有重复的元素,且集合中的元素是无序的,不能通过索引去获取元素
4.1 常用的命令:
- 添加
asdd key element [element..............] - 删除
srem key element [element..............] - 计算元素个数
scard key - 判断元素是否在集合中
sismember key element - 随机从集合返回指定个数元素
srandmenber key [count ] - 从集合随机弹出元素
spop key
,会删除对应元素 - 获取所有元素
smembers key
,无序 - 集合间的操作
- 多个集合的交集
sinter key [ key ..........] - 多个集合的并集
sunion key [key .........] - 多个集合的差集
sdiff key [key ............ ] - 计算的结果保存,每次计算比较耗时,
sinter|sunion|sdiff+store key [key ......... ]
4.2 内部编码:
set类型的内部编码有俩种:
- intset(整数集合):当集合的元素都是整数且个数小于512,Redis会使用整数集合作为内部实现
- hashtable(哈希表):反之就用哈希表来实现
4.3 常见使用场景:
- 标签
5 有序集合
有序集合保留了集合不能重复的特性,但是不同的是,有序集合中的元素可以排序。
5.1 常用的命令:
对命令有疑问或者指正的请留言或者私信
- 添加成员
zadd key score element [score element..............] - 计算某个成员分数
zscore key member - 计算成员个数
zcard key - 计算成员的排名
zrank|zrevrank key member - 删除成员
zrem key member [member ..........] - 增加成员分数
zincrby key increment member - 返回指定排名范围的成员
zrange|zrevrange key start end - 返回指定分数范围的成员
zrangebyscore|zrevrangebyscore - 返回指定分数范围的成员个数
zcount - 删除指定排名内的升序元素
zremrangebyrank - 删除指定分数范围的成员
zremrangebyscore - 集合间的操作
- 多个集合的交集
zinterstore destinnation numkeys key [key..............] - 多个集合的并集 z
unionstore destinnation numkeys key [key..............]
5.2 内部编码:
set类型的内部编码有俩种:
- ziplist(压缩列表):当集合的元素个数小于128,且每个元素的值小于64字节 Redis会使用ziplist作为内部实现,可以有效减少内存的使用
- skiplist(跳跃表):反之就用跳跃表来实现
5.3 常见使用场景:
- 排行榜
三、键管理
- 重命名键
rename key newkey
- 注意事项:
- 重命名键期间会指向del删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能
- renamenx 命令可以确保只有newkey 不存在的时候才能被覆盖,反正如果键存在就会被强行覆盖
- 随机返回一个键
randomkey - 键过期
expire key seconds - 迁移键
move key db
dump+restore - 遍历键 keys pattern
- 渐进式遍历 scan
四、数据库管理
- 切换数据库
select dbindex - 清除数据库
flushdb/flushall
总结
以上就是今天要讲的内容,总结如下:
- Redis提供五种数据结构,每种数据结构有多种内部实现
- 纯内存存储、I/O多路复用技术、单线程架构 是Redis高性能三大因素
- 保证每个命令能被快速执行完,否则会出现阻塞的可能
- 合理使用批量操作能提高效率
- 了解每个命令对于不同的数据规模的影响,对于时间复杂度高的,慎用
- scan 命令可以解决keys命令带来的阻塞问题