Reids命令原理与应用1 - Redis命令与原理

个人代码仓库:橘子真甜 (yzc-YZC) - Gitee.com

目录

[一. Redis简介](#一. Redis简介)

[1.1 Redis是什么?](#1.1 Redis是什么?)

[1.2 redis的存储结构是什么?](#1.2 redis的存储结构是什么?)

[二. Redis支持的数据类型与命令](#二. Redis支持的数据类型与命令)

[2.1 数据类型和特性](#2.1 数据类型和特性)

[2.2 string类型和命令](#2.2 string类型和命令)

[a string 操作命令](#a string 操作命令)

[b string 存储结构](#b string 存储结构)

[c string 类型应用](#c string 类型应用)

[2.3 list类型和命令](#2.3 list类型和命令)

[a list 操作命令](#a list 操作命令)

[b list 存储结构](#b list 存储结构)

[c list 类型应用](#c list 类型应用)

[2.4 hash类型和命令](#2.4 hash类型和命令)

[a hash 操作命令](#a hash 操作命令)

[b hash 存储结构](#b hash 存储结构)

[c hash 类型应用](#c hash 类型应用)

[2.5 set 类型和命令](#2.5 set 类型和命令)

[a set 操作命令](#a set 操作命令)

[b set存储结构](#b set存储结构)

[c set 类型应用](#c set 类型应用)

[2.6 zset 类型和命令](#2.6 zset 类型和命令)

[a zset 操作命令](#a zset 操作命令)

[b zset 存储结构](#b zset 存储结构)

[c zset 类型应用](#c zset 类型应用)

[三. Redis 的 key value 设计](#三. Redis 的 key value 设计)

[3.1 key设计](#3.1 key设计)

[3.2 value设计](#3.2 value设计)

[四. redis删除数据策略](#四. redis删除数据策略)


一. Redis简介

1.1 Redis是什么?

reids是远程字典服务<key, value>来存储数据。reids-server存储kv数据,我们可以通过命令来存储/查询数据。

redis是请求-响应模型,server发起请求,redis返回响应。

由于redis是内存数据库,所有数据存储在内存中,增删查改效率较高。内存操作速度大约是磁盘操作速度的 10w倍。

1.2 redis的存储结构是什么?

redis通过一个全局字典(哈希表)来存储<key, value>。针对不同的value,redis提供了不同的数据类型。

可以看下图,详细说明了redis的存储结构

二. Redis支持的数据类型与命令

Reids命令不区分大小写。

2.1 数据类型和特性

为了方便用户使用,redis的key都使用的字符串,value则提供了多种不同的类型和命令。主要的5种类型是**:string(二进制安全的字节串),list(列表),hash(哈希字典),set(无序集合),zset(有序集合)。**

这些数据的特性如下:

string:redis中string类型是一个二进制安全的字节串,可以存储文本/数字/图片

list:列表,本质是双向链表,支持头尾删除/插入,保证插入/删除的数据的顺序是固定的。根据不同的应用可以作为栈/队列使用,比如消息队列,任务队列,生产者消费者模型等。

hash:哈希字典,不关注顺序,field是唯一的。<field, data>。常用于存储用户/物品的信息数据方便查找。

set:无序集合,由集合的数学定义,内部数据是唯一的,支持交集/并集/补集 等集合运算。可用于标签,交集可以获取两数据共同信息,差集可以用于获取推荐两人的的其他信息

zset:有序集合,有一个 score 和 value,内部是根据score来排序的。score可重复,value是唯一的,可以支持范围查询。可用于热搜榜,排行榜,带权的任务调度。

2.2 string类型和命令

string类型是二进制安全字节串,小于1MB时候翻倍扩容,大于1MB时候每次扩容1MB。

a string 操作命令

复制代码
# 设置string的 key-value 
SET key value

# 获取string key 对应 value
GET key

# 获取所有的key
keys *

# 如果key是整数,对其原子++
INCR key

# 如果key是整数,对其原子 + 任意数字
INCR key increment

# 如果key是整数,对其原子++
DECR key

# 如果key是整数,对其原子 - 任意数字
DECRBY key decrement

# 如果key不存在,相当于SET,若存在什么也不做
SETNX key value

# 删除key-value
DEL key

# 设置或者清空key的value(字符串)在offset处的bit值。
SETBIT key offset value

# 返回key对应的string在offset处的bit值
GETBIT key offset

# 统计字符串被设置为1的bit数.
BITCOUNT key

原子+1,有什么用呢?在分布式场景,通过原子+1返回新id以获取一个全局节点的id

incr操作时候,如果对应的key不存在,则会创建一个key,并将其value设置为1

redis支持一定时间后删除某个数据:

set name yzc ex 60 这个ex 60 表示60秒后会惰性删除这个数据

b string 存储结构

string内部是如何实现的呢?

长度小于等于20字节且为整数,使用int存储。

长度小于等于44字节,使用embstr存储。

长度大于44字节,使用raw存储。

为何以44字节做分割?由于一个缓存的catch line 是64字节,为了缓存高效读取,embstr内部其他字段占用了20字节,剩下44字节用于存储string。

c string 类型应用

可以实现简单的对象存储

可以作为累加器

可以做分布式锁

还能做位运算

2.3 list类型和命令

list是双向链表,支持头尾删除效率O(1),查找O(n)。

a list 操作命令

cpp 复制代码
# 从队列的左侧入队一个或多个元素
LPUSH key value [value ...]

# 从队列的左侧弹出一个元素
LPOP key

# 从队列的右侧入队一个或多个元素
RPUSH key value [value ...]

# 从队列的右侧弹出一个元素
RPOP key

# 返回从队列的 start 和 end 之间的元素 0, 1 2
LRANGE key start end

# 从存于 key 的列表里移除前 count 次出现的值为 value 的元素
LREM key count value

# 裁剪l r位置的数据,即保留 l-r范围内的数据,删除其他数据
LTRIM key start end

# 它是 RPOP 的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接
BRPOP key timeout # 超时时间 + 延时队列

lrem 删除一定数量数据

ltrim裁剪数据

阻塞删除:如下图,由于没有数据,会阻塞5秒。如果此时有其他客户端插入数据就会删除,否则会等待5秒后返回nil

b list 存储结构

list内部使用双向链表,间接使用压缩列表。压缩的依据是:

c list 类型应用

由于list是双向链表,可以实现栈/队列的操作。

实现栈: 每次lpush/rpop 或者 rpush/rpop

实现队列: 每次lpush/lpop 或者 rpush/rpop

实现阻塞队列 每次blpush/blpop 或者 brpush/brpop

其他还有消息队列/生产者消费者模型/环形队列等..

2.4 hash类型和命令

hash是哈希字典(哈希表)。支持增删查改效率O(1),只能修改value无法修改key

a hash 操作命令

cpp 复制代码
# 获取 key 对应 hash 中的 field 对应的值
HGET key field

# 获取key对应hash中的所有 field - value
HGETALL key

# 设置 key 对应 hash 中的 field 对应的值
HSET key field value

# 设置多个hash键值对
HMSET key field1 value1 field2 value2 ... fieldn valuen

# 获取多个field的值
HMGET key field1 field2 ... fieldn

# 给 key 对应 hash 中的 field 对应的值加一个整数值
HINCRBY key field increment

# 获取 key 对应的 hash 有多少个键值对
HLEN key

# 删除 key 对应的 hash 的键值对,该键为field
HDEL key field

b hash 存储结构

hash使用哈希表和压缩列表作为存储结构

c hash 类型应用

得益于哈希高效查找,哈希结构一般用于存储对象的信息。比如学生/用户/商品等信息

2.5 set 类型和命令

set是无序集合,数据是唯一的,支持集合操作。

a set 操作命令

cpp 复制代码
# 添加一个或多个指定的member元素到集合的 key中
SADD key member [member ...]

# 计算集合元素个数
SCARD key

# SMEMBERS key
SMEMBERS key

# 返回成员 member 是否是存储的集合 key的成员
SISMEMBER key member

# 随机返回key集合中的一个或者多个元素,不删除这些元素
SRANDMEMBER key [count]

# 从存储在key的集合中移除并返回一个或多个随机元素
SPOP key [count]

# 返回一个集合与给定集合的差集的元素
SDIFF key [key ...]

# 返回指定所有的集合的成员的交集
SINTER key [key ...]

# 返回给定的多个集合的并集中的所有成员
SUNION key [key ...]

对于 spop,删除随机一个数据并返回(利用这个随机性可以用于抽奖

b set存储结构

数据量少使用数组,数据量大使用哈希字典

c set 类型应用

1 pop随机删除返回,可以用于抽奖

2 两个集合交集求共同的信息(共同关注等)

3 两个集合差集可以各自推荐

4 两个集合并集可以构成推荐池等,合并商品等。

2.6 zset 类型和命令

zset是有序集合,分为 score value,按照score排序

a zset 操作命令

cpp 复制代码
# 添加到键为key有序集合(sorted set)里面
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

# 从键为key有序集合中删除 member 的键值对
ZREM key member [member ...]

# 返回有序集key中,成员member的score值
ZSCORE key member

# 为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member

# 返回key的有序集元素个数
ZCARD key

# 返回有序集key中成员member的排名
ZRANK key member

# 返回存储在有序集合key中的指定范围的元素 order by id limit 1,100
ZRANGE key start stop [WITHSCORES]

# 返回有序集key中,指定区间内的成员(逆序)
ZREVRANGE key start stop [WITHSCORES]

b zset 存储结构

为了支持排序和范围查询,zset使用跳表作为存储结构(查询效率为O(logN))。

c zset 类型应用

可以用于实现热搜榜,排行榜。

使用 score作为时间可以实现延时队列

生产者将定时任务 hash 到不同的 redis 实体中,为每一个 redis 实体分配一个 dispatcher 进程, 用来定时获取 redis 中超时事件并发布到不同的消费者中;这样可以实现分布式定时器

还能限制某段时间内某个用户的操作,实现时间窗口限流

三. Redis 的 key value 设计

3.1 key设计

如果某一个功能只有一个,那么直接使用单一的key:比如 name,直接使用单一的key即可

如果有多个相同功能的key,比如 student1 student2 .. 。建议使用:分割,student:1

3.2 value设计

redis value支持多种类型,我们的实际应用根据使用场景选择不同类型的value。

并且我们还没有对我们的类型进行组合实现不同的功能。

hash + list 实现购物车

hash + set 实现 用户标签

hash + zset 实现 排行榜 + 信息

四. redis删除数据策略

Redis 的两种过期删除策略:
1. 定期删除(主动)

  • Redis 每秒执行 10 次(默认)的过期键扫描
  • 每次随机抽取一些设置了过期时间的键检查
  • 如果过期就立即删除
    2. 惰性删除(被动)
  • 当客户端尝试访问一个键时,Redis 会检查该键是否过期
  • 如果过期才删除,然后返回 nil
  • 如果没人访问,过期的键可能暂时还在内存中
相关推荐
钓鱼的肝2 小时前
GESP系列(3级)小杨的储蓄
开发语言·数据结构·c++·笔记·算法·gesp
ZePingPingZe2 小时前
不使用Spring事务的管理—原生JDBC实现事务管理
java·数据库·spring
与遨游于天地2 小时前
了解Redis
数据库·redis·缓存
TG:@yunlaoda360 云老大2 小时前
如何了解华为云国际站代理商CDN主要有什么作用呢?
大数据·数据库·华为云
毕设十刻2 小时前
基于Vue的家教预约系统7fisz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
lightningyang2 小时前
渗透入门之SQL 注入(1)
数据库·sql·渗透·sql注入·天枢一体化虚拟仿真平台
阿坤带你走近大数据2 小时前
Oracle专家级数据库工程师的认知与经验
数据库·oracle
ZePingPingZe2 小时前
MySQL-InnoDB锁与事务
数据库·mysql
一个不知名程序员www3 小时前
算法学习入门---C/C++输入输出
c语言·c++