Redis数据结构与连接

1 基本的数据结构

1.1 string

string的实现有多种

  • int:字符串长度小于等于20且能转成整数
  • raw:字符串长度大于44
  • embstr:字符串长度小于等于44

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

string是二进制安全字符串,可以存储图片,二进制协议等二进制数据

基本命令:

  • SET key val
  • GET key
  • INCR key
  • INCRBY key increment
  • DECR key
  • DECRBY key decrement
  • SETNX key value(set not exist)
  • DEL key
  • SETBIT key offset value
  • GETBIT key offset
  • BITCOUNT key
# 月签到功能 2021年6月份的第1天
setbit sign:10001:202106 1 1
# 计算 2021年6月份 的签到情况
bitcount sign:10001:202106
# 获取 2021年6月份 第二天的签到情况 1 已签到 0 没有签到
getbit sign:10001:202106 2

1.2 list

  • 双向链表实现,列表首尾操作(删除和增加)时间复杂度 O(1) ;查找中间元素时间复杂度为O(n)

基本命令:

  • LPUSH key value [value …]
  • LPOP key
  • RPUSH key value [value …]
  • RPOP key
  • LRANGE key start end
  • LREM key count value 移除前 count 次出现的值为 value 的元素
  • BRPOP key timeout RPOP 的阻塞版本,这个命令会在给定list无法弹出任何元素的时候阻塞连接
  • LTRIM key start stop

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

存储结构:

  • quicklist(双向链表)
  • ziplist(压缩列表)

1.3 hash

散列表

基本命令

  • HGET key field
  • HSET key field value
  • HMSET key field1 value1 field2 value2 … fieldn valuen
  • HMGET key field1 field2 … fieldn
  • HGETALL key
  • HINCRBY key field increment
  • HLEN key
  • HDEL key field

存储结构:

  • 节点数量大于 512(hash-max-ziplist-entries) 或所有字符串长度大于 64(hash-max-ziplist-value),则使用 dict 实现
  • 节点数量小于等于 512 且有一个字符串长度小于 64,则使用 ziplist 实现

1.4 set

基本命令

  • SADD key member [member …]
  • SCARD key
    • Get the number of members in a set
  • SMEMBERS key
  • SISMEMBER key member
  • SRANDMEMBER key [count]
  • SPOP key [count]
  • SDIFF key [key …] 差集
  • SINTER key [key …] 交集
  • SUNION key [key …] 并集

存储结构:

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

1.5 zset

有序集合

基本命令:

  • ZADD key [NX|XX] [CH] [INCR] score member [score member …]
  • ZREM key member [member …]
  • ZSCORE key member
  • ZINCRBY key increment member
  • ZCARD key
  • ZRANK key member 返回有序集key中成员member的排名
  • ZRANGE key start stop [WITHSCORES]
  • ZREVRANGE key start stop [WITHSCORES]

存储结构:

  • 节点数量大于 128 或者有一个字符串长度大于 64,则使用跳表(skiplist)
  • 节点数量小于等于 128(zset-max-ziplist-entries)且所有字符串长度小于等于 64(zset-max-ziplist-value),则使用 ziplist 存储

2 redis pipeline

redis pipeline 是一个客户端提供的机制,而不是服务端提供的

在这里插入图片描述

可以一次性发多条指令,减少网络交互

3 redis事务

  • MULTI 开启事务,事务执行过程中,单个命令是入队列操作,直到调用 EXEC 才会一起执行

  • 乐观锁实现,所以失败需要重试

相关指令:

  • MULTI 开启事务
  • EXEC 提交事务
  • DISCARD 取消事务
  • WATCH 检测 key 的变动,若在事务执行中,key 变动则取消事务

4 lua脚本

实际使用,并不是使用MULTI等命令,而是使用lua脚本实现原子性。

Redis中内嵌一个lua虚拟机,用来执行Redis lua 脚本,Redis lua脚本可以执行多个命令,并保证原子性

127.0.0.1:6379> set lua_test 100
OK
127.0.0.1:6379> eval 'local key = KEYS[1]; local val = redis.call("get", key); redis.call("set", key, 2*val); return 2*val;' 1 lua_test
(integer) 200

语法:

EVAL script numkeys key [key ...] arg [arg ...]

可通过script load获取lua脚本的hash字符串

127.0.0.1:6379> SCRIPT LOAD 'local key = KEYS[1]; local val = redis.call("get", key); redis.call("set", key, 2*val); return 2*val;'
"5640042b18b79e5405b722cf97c15d87768a3ce9"
127.0.0.1:6379> SCRIPT EXISTS "5640042b18b79e5405b722cf97c15d87768a3ce9"
1) (integer) 1

使用EVALSHA执行

EVALSHA sha1 numkeys key [key ...] arg [arg ...]
127.0.0.1:6379> EVALSHA 5640042b18b79e5405b722cf97c15d87768a3ce9 1 lua_test
(integer) 400

实际应用中,会在服务器启动时,将所有的lua脚本先获取到对应的哈希值,然后存在一个unordered_map中,这样后序可直接使用EVALSHA执行

# 清除所有脚本缓存
> script flush
OK
# 如果当前脚本运行时间过长(死循环),可以通过 script kill 杀死当前运行的脚本
> script kill

5 ACID特性

A(atomic):原子性,事务中的多个操作要么都成功,要么都失败。

  • redis不支持回滚,即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。

C(consistent):一致性

  • Redis满足数据库层面的一致性,即对于string类型,不能使用lpush操作
  • Redis不满足逻辑上的一致性,对于lua脚本,假如有多条指令,分别是A、B、C、D,若B指令出错,后面的指令都不会执行,但A指令仍然生效。
    • 一个扣钱一个加钱;可能出现扣钱执行错误,加钱执行正确,那么最终还是会加钱成功;系统凭空多了钱

I(isolation):隔离性

  • redis 是单线程执行,天然具备隔离性

D(duration):持久性

  • redis 只有在 aof 持久化策略的时候,并且需要在 redis.conf 中appendfsync=always 才具备持久性;实际项目中几乎不会使用 aof 持久化策略

lua 脚本满足原子性和隔离性;一致性和持久性不满足

6 Redis同步连接

hiredis已封装了相关的接口

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis/hiredis.h>int main() {unsigned int j, isunix = 0;redisContext *c;redisReply *reply;const char *hostname = "127.0.0.1";int port = 6379;struct timeval timeout = { 1, 500000 }; // 1.5 secondsc = redisConnectWithTimeout(hostname, port, timeout);if (c == NULL || c->err) {if (c) {printf("Connection error: %s\n", c->errstr);redisFree(c);} else {printf("Connection error: can't allocate redis context\n");}exit(1);}int roleid = 10001;reply = redisCommand(c, "hgetall role:%d", roleid);if (reply->type != REDIS_REPLY_ARRAY) {printf("reply error: %s\n", reply->str);} else {printf("reply:number of elements=%lu\n", reply->elements);for (size_t i = 0; i < reply->elements; i++) {printf("\t %lu : %s\n", i, reply->element[i]->str);}}freeReplyObject(reply);/* Disconnects and frees the context */redisFree(c);return 0;
}

编译

$ gcc test.c -o test -lhiredis

7 Redis异步连接

hiredis提供了适配reactor网络模型的异步驱动方式(adapters文件夹)。

在这里插入图片描述

libevent.h中

在这里插入图片描述

可以看到有addRead(注册读事件)、delRead(注销读事件)、addWrite(注册写事件)、delWrite(注销写事件)

可替换成自己设计的接口。

参考链接:https://xxetb.xetslk.com/s/1QH6AQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1523687.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL:表创建指南

前言 随着信息技术的飞速进步&#xff0c;数据库设计的优劣对系统性能产生了决定性影响。 一个精心设计的数据库不仅能显著提升应用效率&#xff0c;还能确保数据的安全和一致性。 本文将以一张具体的实体-关系图&#xff08;E-R图&#xff09;为基础&#xff0c;详细阐述如…

HarmonyOS NEXT开发:UI导航栏组件-NavigationBarView

NavigationBarView 是什么&#xff1f; NavigationBarView是ArkTS上的UI自定义导航栏组件&#xff0c;内置了导航栏的返回按钮、标题、搜索入口、右侧按钮等常用微功能。NavigationBarView结构展示 NavigationBarView ├── back │ ├── back_icon │ …

全倒装COB超微小间距LED显示屏比正装COB小间距的优势在哪些方面

在全倒装COB超微小间距LED显示屏与正装COB小间距显示屏的激烈对比中&#xff0c;我们不得不深入探讨其各自在技术创新、显示效果、以及应用领域的独特优势。 全倒装技术作为LED显示领域的一项重大突破&#xff0c;其核心在于将LED芯片直接倒装焊接在基板上&#xff0c;这一创新…

RFID光触发标签与端口自检功能新型光交箱哑资源管理方案

在通信行业的快速发展进程中&#xff0c;光交箱作为关键的网络节点&#xff0c;其哑资源的有效管理对于保障通信服务的质量和稳定性至关重要&#xff0c;传统的管理方式在面对日益庞大和复杂的光交箱哑资源时&#xff0c;逐渐显露出诸多弊端&#xff0c;如资源信息不准确、故障…

PDF转PPT,四款神器助你一臂之力!

亲爱的朋友们&#xff0c;你们在日常的工作和生活中有没有遇到过需要将PDF文件转换成PPT格式的情况呢&#xff1f;今天&#xff0c;我就来给大家推荐四款非常好用的工具&#xff0c;让你轻松应对PDF转PPT的难题&#xff01; 一、福昕转换器 直通车&#xff08;粘贴到浏览器打…

最新版php进销存系统源码 ERP进销存专业化管理 永久免费升级更新+完整图文搭建教程

在当今信息化时代&#xff0c;企业管理的高效性与精确性是企业竞争力的关键。分享一款最新版的PHP进销存系统源码&#xff0c;一款专为企业设计的ERP进销存管理工具&#xff0c;其丰富的功能、灵活的子账号设置、强大的权限控制、以及独家升级的合同管理和报价单打印功能&#…

数据仓库系列11:ETL的主要步骤是什么,它们分别有什么作用?

你是否曾经感觉被海量数据淹没?是否在寻找一种方法来有效地整合、转换和加载这些数据?如果是,那么你来对地方了。今天,我们将深入探讨ETL(Extract, Transform, Load)过程的三个关键步骤,这是每个大数据开发者都应该掌握的核心技能。准备好踏上成为数据整合大师的旅程了吗?让…

[B站大学]Zotero7教程

参考资料: https://www.bilibili.com/video/BV1PSvUetEQX 2. 账号注册与同步 本节内容参考zotero中文社区文档&#xff1a;https://zotero-chinese.com/user-guide/sync 2.1 数据同步 首先注册一个Zotero官方账户。登录账号密码。 2.2 文件同步 按照文档&#xff0c;推荐…

Kafka3.x 使用 KRaft 模式部署 不依赖 ZooKeeper

前言 Kafka 从 2.8.0 版本开始引入了 Kafka Raft Metadata Mode&#xff08;KRaft 模式&#xff09;&#xff0c;这个模式允许 Kafka 在不依赖 ZooKeeper 的情况下进行元数据管理。KRaft 模式在 Kafka 3.0.0 中进入了稳定版本,本文部署的 Kafka_2.12-3.6.0 单机模式 环境 Ce…

从Deepfake事件透视:人工智能如何重塑安防监控的未来

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;特别是深度伪造&#xff08;Deepfake&#xff09;技术的出现&#xff0c;引发了社会各界的广泛关注与讨论。Deepfake技术通过深度学习算法&#xff0c;将个人的声音、面部表情及身体动作拼接合成虚假内容&#xff0c;…

什么是基于云的 SIEM

随着企业不断将业务迁移到数字世界&#xff0c;网络威胁的领域也在不断扩大&#xff0c;随着时间流逝&#xff0c;新的威胁不断出现&#xff0c;手段也变得更加巧妙。一个关键问题出现了&#xff1a;组织如何保护其敏感数据、资产和声誉免受网络威胁&#xff1f;这就是基于云的…

10.5 传输层协议(TCP和UDP)

传输层协议 TCP 关键特性 传输层协议 TCP 头部 传输层协议 TCP 三次握手 传输层协议 UDP 真题 1

raksmart香港大带宽服务器地址

RAKsmart香港大带宽服务器的地址是由RAKsmart公司提供的香港机房所在地&#xff0c;具体地址未在公开资料中披露&#xff0c;但其主要特点是提供高带宽且不限制流量的服务。 RAKsmart是一家成立于2012年的美国公司&#xff0c;其香港机房以提供大带宽、直连内地的优化线路和丰富…

9/4 链表-力扣 234、19

234.回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表&#xff1b;如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 思考&#xff1a;链表遍历只能从前往后&a…

【Redis】缓存击穿、缓存穿透、缓存雪崩原理以及多种解决方案

一、前言 在 Spring Cloud 微服务集群项目中&#xff0c;客户端的请求首先会经过 Nginx&#xff0c;Nginx 会将请求反向代理到 Gateway 网关层&#xff0c;接着才会将请求发送到具体的服务 service。 在 service 中如果要查询数据&#xff0c;则会到缓存中查询&#xff0c;如…

2024年最强图纸加密软件大揭秘!图纸加密软件推荐

在数字化时代&#xff0c;信息安全成为企业发展的重要保障&#xff0c;尤其是对于设计图纸等敏感数据的保护&#xff0c;选择一款可靠的图纸加密软件尤为重要。本文将为您推荐2024年十大图纸加密软件&#xff0c;帮助企业在日常工作中更好地保护知识产权和商业机密。 2024年最强…

宽带和带宽分不清楚

如何理解带宽 我们平时经常听到的带宽其实是宽带&#xff0c;举个栗子&#xff1a;我家用的是xx运营商提供的&#xff0c;号称1000M宽带&#xff0c;这其实指是的网络数据传输的速率是&#xff1a;1000Mbs&#xff08;即125MBps&#xff09;。 那么既然有宽带&#xff0c;就有…

OSS上传文件

注册阿里云账号 开通oss服务 创建accesskey和secret 进入oss选项&#xff0c;根据sdk开发代码

网站开发:XTML+CSS - 网页文档结构

1. 前言 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是构建网页和 web 应用程序的标准标记语言。它定义了网页的结构和内容&#xff0c;允许开发者创建有组织、语义化的文档。 HTML 使用一系列的元素&#xff08;elements&#xff09;和…

如何轻松开启美股交易之旅?

你是否正在考虑进入美股市场&#xff0c;却不知道从哪里开始&#xff1f;“如何投资美股”的具体步骤和技巧&#xff0c;你是否已经掌握&#xff1f; 掌握美股交易时间与规则 1. 美股交易时间&#xff1a;灵活安排交易计划的基础 如何投资美股&#xff1f;首先&#xff0c;你…