Redis常用命令详解

news/2024/12/21 18:56:16/

Redis 是Remote Dictionary Service 的简称;也是远程字典服务。它是内存数据库,KV 数据库,数据结构数据库。它是一个单线程的单reactor模型。其交互方式是请求响应方式。在正常情况下,如果向redis发出请求,则一定会有响应。

Redis 应用非常广泛,如Twitter、暴雪娱乐、Github、Stack Overflow、腾讯、阿里巴巴、京东、华为、新浪微博等,很多中小型公司也在使用。

Redis 命令查看:http://redis.cn/commands.html。

一 认识Redis

redis数据的基本结构:

img

redis的存储结构为键值对,其中键为字符串,值可能为很多种数据结构,比如字符串、hash、list等。reds的存储结构和c++ 的unordered_map<string, T>比较像,其中T代表泛型。它共有16个数据库。

redis存储结构(KV):

img

redis中value编码:

img

二 Redis值的数据结构及其操作

2.1 string

字符数组,该字符串的编码方式有三种,分别是int方式、raw方式和embstr方式。

  • 当字符串长度不大于20时且能转成整数时,使用int方式存储;
  • 当字符串长度大于20且不大于44时,使用embstr存储。
  • 当字符串长度大于44时,使用raw存储。

embstr 编码是 raw 编码的一种优化方式,其底层数据结构都是简单动态字符串。所以 embstr编码和 raw 编码实现的字符串对象,都包含两部分的结构:redisObject 和 sdshdr.

Note: redisObject是Redis用来表示任意一种类型对象的通用结构体, 其中包含了该对象的类型和编码方式,以及指向底层数据结构的指针邓信息. sdshdr则是Redis专门用来表示简单动态字符串的结构体.

不同的是,raw 编码方式会调用两次内存分配函数来分别创建 redisObject 结构和 sdshdr 结构;而 embstr 编码方式只调用一次内存分配函数为 redisObject 结构和 sdshdr 结构同时分配内存空间, 其原理就是将字符串内容直接存储在redisObject的结构体中.

和raw相比,embstr的优点是:

  1. 创建对象时,内存分配函数从两次降为一次
  2. 销毁对象时,内存释放函数从两次降为一次
  3. embstr编码的字符串,redisObject 结构和 sdshdr 结构处于连续的内存空间中,能更好地利用缓存带来的优势
  4. Embstr 存储较短的字符串时采用一种优化的编码方式,可以减少内存占用;而 Raw 则没有进行任何优化,直接存储字符串的内容。

动态字符串 raw,字符串长度小于1M 时,加倍扩容;超过 1M 每次只多扩1M;字符串最大长度为 512M;

redis 字符串不同于C语言中的字符串,这里是安全字符串,长度是由结构体中的一个成员变量标识的,内容由柔性数组存储。还有一个成员变量描述可用空间,它可以存储图片,二进制协议等二进制数据。

基础命令:

# 设置 key 的 value 值
SET key val
# 获取 key 的 value
GET key
# 执行原子加一的操作
INCR key
# 执行原子加一个整数的操作
INCRBY key increment
# 执行原子减一的操作
DECR key
# 执行原子减一个整数的操作
DECRBY key decrement
# 如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做
SETNX key value
# 删除 key val 键值对
DEL key
# 设置或者清空key的value(字符串)在offset处的bit值。
SETBIT key offset value
# 返回key对应的string在offset处的bit值
GETBIT key offset
# 统计字符串被设置为1的bit数.
BITCOUNT key

2.2 list

双向链表实现,列表首尾操作(删除和增加)时间复杂度O(1) ;查找中间元素时间复杂度为
O(n) ;
列表中数据是否压缩的依据:

  1. 元素长度小于 48,不压缩;
  2. 元素压缩前后长度差不超过 8,不压缩;

基础命令:

# 从队列的左侧入队一个或多个元素
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
# 它是 RPOP 的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接
BRPOP key timeout # 超时时间 + 延时队列

应用:

异步消息队列:
操作与队列一样,但是在不同系统间;

img

实际项目中需要保证命令的原子性,所以一般用 lua 脚本 或者使用 pipeline 命令;

-- redis lua脚本
local record = KEYS[1]
redis.call("LPUSH", "says", record)
redis.call("LTRIM", "says", 0, 4)

2.3 hash

存储结构
节点数量大于 512(hash-max-ziplist-entries) 或所有字符串长度大于 64(hash-max-ziplistvalue),则使用 dict 实现;

节点数量小于等于 512 且有一个字符串长度小于 64,则使用 ziplist 实现;

dict和ziplist的区别:

  • dict 用于实现哈希表数据类型,支持高效的数据查找和插入;ziplist 用于实现列表数据类型,可以高效地存储一系列连续的元素。
  • 相对于 ziplistdict 数据结构需要占用更多的内存。因为 dict 存储键和值都需要分配内存,并且需要维护哈希表的结构;而 ziplist 存储的是压缩过的连续元素,不需要分配额外的内存用于维护链表结构。
  • 相对于 ziplistdict 数据结构的查询效率更高。因为 dict 的底层实现是哈希表,支持 O(1) 时间复杂度的查找操作;而 ziplist 的底层实现是链表,查找元素的时间复杂度为 O(n)。

基础命令:

# 获取 key 对应 hash 中的 field 对应的值
HGET key field
# 设置 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

2.4 set

集合;用来存储唯一性字段,不要求有序;
存储不需要有序,操作(交并差集)的时候需要有序。

存储结构
元素都为整数且节点数量小于等于 512(set-max-intset-entries),则使用整数数组存储;
元素当中有一个不是整数或者节点数量大于 512,则使用hash存储;

基础命令

# 添加一个或多个指定的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 ...]

2.5 zset

有序集合;用来实现排行榜;它是一个有序唯一;

存储结构:
节点数量大于 128或者有一个字符串长度大于64,则使用跳表(skiplist);
节点数量小于等于128(zset-max-ziplist-entries)且所有字符串长度小于等于64(zset-maxziplist-value),则使用 ziplist 存储;
数据少的时候,注重节省空间;
数量多的时候,注重访问性能;

基础命令:

# 添加到键为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]

三 Redis发布订阅

Redis发布订阅是为了支持消息的多播机制,关键命令如下:

# 订阅频道
subscribe 频道
# 订阅模式频道
psubscribe 频道
# 取消订阅频道
unsubscribe 频道
# 取消订阅模式频道
punsubscribe 频道
# 发布具体频道或模式频道的内容
publish 频道 内容
# 客户端收到具体频道内容
message 具体频道 内容
# 客户端收到模式频道内容
pmessage 模式频道 具体频道 内容

发布订阅功能一般要区别命令连接而重新开启一个连接。因为命令连接严格遵循请求回应模式;而pubsub能收到redis主动推送的内容;所以实际项目中如果支持pubsub的话,需要另开一条连接用于处理发布订阅;

缺点

发布订阅的生产者传递过来一个消息,redis会直接找到相应的消费者并传递过去;

假如没有消费者,消息直接丢弃;

假如开始有2个消费者,一个消费者突然挂掉了,另外一个消费者依然能收到消息,但是如果刚挂掉的消费者重新连上后,在断开连接期间的消息对于该消费者来说彻底丢失了。stream的方式,确保消息一定可达。

另外,redis停机重启,pubsub的消息是不会持久化的,所有的消息被直接丢弃;

本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接,详细查看详细的服务:链接


http://www.ppmy.cn/news/80762.html

相关文章

【JAVA进阶】Stream流

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;JAVASE基础 目录 1.Stream流的概述 2.Stream流的获取 3.Stream流的常用方法 1.Stream流的概述 什么是Stream流&#xff1f; 在Java 8中&#xff0c;得益于Lambda所带来的函数式编程&#xff0…

Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)

目录 ①. 什么是内部类 ②. 内部类的共性 ③. 为什么需要内部类 ④. 成员内部类 ⑤. 局部内部类 ⑥. 静态内部类&#xff08;嵌套类&#xff09; ⑦. 匿名内部类 ①. 什么是内部类 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员&#xff0c;并…

【IP转换】

ip转换 //点分十进制转换成大端 #include <arpa/inet.h> int inet_pton(int af, const char *src, void *dst); 功能: 将点分十进制串 转成32位网络大端的数据("192.168.1.2" > ) 参数: af : AF_INET IPV4 AF_INET6 IPV6 src: 点分十…

STP 生成树协议

STP&#xff08;Spanning-Tree Protocol&#xff09;的来源 在网络三层架构中&#xff0c;我们会使用冗余这一技术&#xff0c;也就是对三层架构中的这些东西进行备份。冗余包含了设备冗余、网关冗余、线路冗余、电源冗余。 在二层交换网络中进行线路冗余&#xff0c;如图&am…

## 如何顺序处理设备上报的数据

1. 引言 随着智能技术的发展&#xff0c;市场上出现了很多的智能设备&#xff0c;其具有连接网络的能力。用户可以实现远程控制&#xff0c;并且设备也可上报自己的状态&#xff0c;实现云端对设备的运行情况分析。在某些情况下需要保证设备上报状态的有序性&#xff0c;例如传…

CSS布局:浮动与绝对定位的异同点

CSS布局&#xff1a;浮动与绝对定位的异同点_cherry_vincent的博客-CSDN博客 浮动 ( float ) 和绝对定位 ( position:absolute ) 相同点&#xff1a; &#xff08;1&#xff09;都是漂起来( 离开原来的位置 ) &#xff08;2&#xff09;并且都不占着原来的位置 &#xff08;3…

抖音账号矩阵系统源码开发之——视频发布功能开发

视频发布权限在账号矩阵系统研发之初&#xff0c;都是一个备受争议的功能&#xff0c;最早之前我们使用的视频发布权限名字是Video.creat, video.delete权限&#xff0c;但是该权限于2022年10月份做了权限的收回&#xff0c;后又在上架了一个能力叫发布内容至抖音&#xff1a;…

高级第一个月考试题

1.什么是Vue框架&#xff1f; Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;并且还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工具链以及各种支持…