Redis 学习笔记

一、简介

1、纯内存操作(理解成容量就是内容条)

2、作为缓存使用(因为内存条操作,比磁盘速度快)

二、 常见命令

类型命令
string

set、get、mset、mget、setrange、getrange、

incr、decr、incrby、decrby、incrbyfloat、

append、del、strlen、

list

lrange、lindex、llen、

rpush、lpush、linsert、lset

lpop、rpop、lrem、ltrim

blpop、brpop

zset

zadd、zcard、zscore、zcount、zincrby、

zrank、zrevrank、zrange、zrevrange、zrangebyscore、zrevrangebyscore

zrem、zremrangebyrank、zremrangebyscore、

zinterstore、zunionstore、

set

sadd、srem、scard、sismember、srandmember、

spop、smembers

sinter、sunion、sdiff

hash

hset、hget、hgetall、hmget、hmset、hsetnx、

hdel、hlen、hexists、hekys、hvals、hstrlen、

hincrby、hincrbyfloat、

类型内部编码备注
stringint - embstr - raw

int 或者 str.length=39

listziplist - linkedlist

64byte 或者 count = 512

list-max-ziplist-entries=512

list-max-ziplist-value=64

zsetziplist - skiplist

64byte 或者 count = 512

zset-max-ziplist-entries=128

zset-max-ziplist-value=64

hashziplist - hashtable

64byte 或者 count = 512

hash-max-ziplist-entries=512

hash-max-ziplist-value=64

setintset - hashtable

int 或者  count = 512

set-max-intset-entries=512

三、其他功能

功能备注
慢查询分析

slowlog-log-slower-than 单位:微秒,默认10毫秒,比如keys* 命令会引起慢查询

slowlog-max-len:慢查询日志存储多少条

Redis Shell

redis-cli --slave 把当前客户端模拟成从节点

redis-cli --rdb 生成rdb持久化文件在本地

redis-cli --pipe 命令封装,批量发送

redis-cli --bigkeys 使用scane命令对Redis采样,找出内存占用多的key

redis-cli --eval 执行执行Lua脚本

redis-cli --latency、latency-history、--latency-dist 检测网络延迟

---

redis-benchmark 基准性能测试

Pipeline

Redis命令执行步骤:1、发送命令 2、执行命令 3、返回结果。步骤1-3称为RTT(Round Trip Time,往返时间)

Pipeline的目的就是为了减少N次 RTT

原生批量命令是原子的,比如mget、mset

Pipeline是非原子的 

事务

multi事务开始,exec事务结束,discard放弃事务、

事务异常的2种处理方式:

1、命令错误不执行,比如set写成sett

2、运行时错误会执行,比如sadd写成zadd

watch某个key,该key变化则事务不执行.

Lua

Lua的优势:原子执行、可以复用、多命令打包可以减少网络开销

数据类型:booleans(布尔)、numbers(数值)、string(字符串)、tables(表格,类似于数组)

执行lua脚本:

redis-cli --eval 字符串,执行脚本,

redis-cli --evalsha SHA字符串,执行对应的lua脚本

redis-cli script load "lua脚本" 把命令加载到Redis内存中,生成sha字符串

redis-cli script exists sha1字符串,判断该lua脚本是否已经加载到内存中了

redis-cli script flush 清除Redis内存中所有Lua脚本

redis-cli script kill 杀掉正在执行的Lua脚本(比如长耗时或者死循环)

Bitmaps

1、Bitmaps不是一种数据结构,实际上就是存放0和1的字符串

2、数组的下标在Bitmaps中叫做偏移量。

---

setbit key offset value 设置数组中的某个下标是0或者1

getbit key offset 或者下标的value

bitcount key [start][end] 获取某个bitcount的1的数量

bitop op destkey key[key ...] 复合操作,op可以是 and、or、not、xor

bitops key value [start] [end] 查看指定范围内targetBit的偏移量

---

BITPO 可以用于以下几个场景:

1、OR 统计某个时间段内的用户活跃度

可以使用 BITOP OR 命令将某个时间段内所有用户的活跃状态合并到一个 key 中,进而使用 BITCOUNT 统计该时间段内活跃用户的数量。

2、AND 实现布隆过滤器

布隆过滤器是一种由一个比特位向量和一系列随机映射函数组成的快速查找算法。可以使用 BITSET 命令将每条数据的多个哈希值对应的二进制序列值设为 1,然后对多个二进制序列使用 BITOP AND 命令, 以判断某个数据是否存在于布隆过滤器中

---

BITPOS 可以用于以下几个场景:

1、统计在线时长

比如,在线游戏中,可以通过记录玩家的登录、退出时间,然后通过对这两个时间点之间的每一分钟(或某个时间间隔)使用 Bitmap 记录玩家是否在线,并且用 BITPOS 命令获取玩家下线时间点之后的第一个 0(即离线时间点),从而计算出玩家的在线时长。

2、统计压缩存储

可以使用 BITPOS 命令查找某个二进制存储空间中最后一个为 0 的位置,并将该位置后的所有位清空,从而实现一种简单的压缩存储方式,节约存储空间。

---

Bitmap 场景:

  • 统计用户订阅/取消订阅某个频道的状态;
  • 统计某网站某段时间内用户的购买/未购买状态;
  • 统计用户某段时间内的登录/退出状态;
  • 统计某个广告的展示/未展示状态。
HyperLogLog

不是新的数据结构,实际类型为字符串类型

优势:占用空间小,为了计算总数

劣势:统计数量不是100%准确

---

常见命令:

pfadd key element1 [element2 ...] 添加元素

pfcount key 统计key中元素数量,不是100%准确

pfmerge destkey sourcekey[sourcekey ...] 合并去重

HyperLogLog 场景:

  • 统计网站某个页面的独立访问量;
  • 统计某个品牌的独立消费者数量;
  • 统计某个社交媒体账号的独立观众数量;
  • 统计某个游戏的独立玩家数量。

因为 Bitmap 只能处理二分类状态,因此如果需要处理的数据是多分类状态,如用户等级、网站地域等,就不适合使用 Bitmap。相应地,如果需要精确度较高的计数,不适合使用 HyperLogLog,因为它的误差可能会比较大,不适合要求精度的统计场合。

发布订阅

publish channel1 msg 发布消息

subscribe channel1 [channel2 ...] 订阅多个频道

unsubscribe channel1 [channel2 ...] 取消订阅

psubscribe pattern1 [pattern2] 正则模式订阅N个频道

punsubscribe pattern1 [pattern2] 取消订阅

pubsub channels 查看最少有一个订阅者的频道(活跃频道)

pubsub channels pattern

pubsub numsub channel1 查看channel的消费者数量

pubsub numpat 查看正则模式的消费者数量,对于psubscribe

---

Redis 是一个基于内存的缓存数据库,而 Kafka 是一个分布式的高吞吐量消息系统。二者在设计和应用场景上有较大的差异,因此在消息订阅方面也有一些差别。具体原因如下:

1、内存存储和磁盘存储的区别:

Redis 以内存存储为主,而 Kafka 以磁盘存储为主。内存存储在读取速度和写入速度方面都有很大的优势,而磁盘存储则更适合海量存储和长时间存储。

2、订阅类型的区别:

Redis 基于 Pub/Sub 模式实现订阅,支持消息的发布和订阅,支持多种消息类型,但不支持持久化。而 Kafka 基于发布订阅模式实现订阅,支持各种响应式消息处理,允许多个订阅者同时订阅同一个 topic,支持持久化和重放功能,更加适合于复杂多变的消息场景。

3、可扩展性的不同:

Redis 支持cluster 模式,允许将数据分散到多个节点,并充分利用多台机器的内存容量。但是,当 Redis 集群中某个节点故障时,数据仍然只能从其他节点中恢复,无法像 Kafka 那样快速恢复。而 Kafka 具有很高的可扩展性,支持通过更多的机器添加到组中实现水平扩展,因此也更适合于需要快速适应业务增长的场景。

综上所述,Redis 在消息订阅方面的局限性主要来自其内存存储的特点和 Pub/Sub 模式的限制,以及缺乏持久化和复杂多变的消息处理机制。而 Kafka 则相对更加灵活和可扩展,具有更强大的消息处理和持久化能力,因此也更适合大规模消息场景的处理。

GEO

geo数据类型是zset

 删除GEO的key, zrem cities:localtions

geoadd key longitude latitude member 添加元素(经纬度、城市)

geoadd cities:locatoins 116.28 39.55 beijing 

geopos key member 获取北京的经纬度

geodist key beijing tianjing 获取距离(北京天津之间)

georadius key longitude latitude radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key] georadiusbymember key member 

georadius与georadiusbymember的区别在于一个传入的是经纬度,一个是城市

georadiusbymember cities:locations beijing 150 km 找出距离北京150km内的城市

geohash key member 把经纬度转成字符串

--

通常来说,类似高德地图、Google 地图这样的地理位置数据,并不是使用 Redis 进行存储与管理,而是采用专门的地理位置数据库,例如 PostGIS、MongoDB 等。

这些数据库支持空间数据类型,可以用来表示点、线、面等信息,支持空间索引,可以高效地查询区域内的数据。存储经纬度信息通常是使用 Point 等数据类型,将经纬度信息存储为一个二维坐标系中的点。

---

MongoDB 中的 GeoSpatial 索引是一种支持地理位置数据存储和查询的方法,通常用于处理基于地理位置的应用,例如附近的人、地理位置搜索等。与 Redis 中的 Geo 模块不同,MongoDB 中的 GeoSpatial 索引使用 B 树或 R 树等数据结构进行存储和查询,并且支持更灵活的地理查询操作。

具体来说,MongoDB 中的 GeoSpatial 索引支持存储点、线、面等不同类型的地理数据,并支持各种空间查询操作,例如查询指定半径内的点、查询在指定区域内的点、查询最近的点等。与 Redis 不同的是,MongoDB 支持更多种类的地理查询操作,并且查询效率也比 Redis 更高。

此外,MongoDB 还支持基于地理位置的聚合操作,例如计算指定区域内的点的数量、计算指定区域内的点的平均值等。这些聚合操作可以很方便地对地理位置数据进行统计和分析,为基于地理位置的应用提供了更多的支持。

因此,虽然 Redis 中的 Geo 模块也支持存储和查询地理位置数据,但与 MongoDB 相比,MongoDB 在地理查询和聚合操作方面具有更高的灵活性和更高的效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python3的tkinter Text文本框加滚动条显示信息

用tkinter进行界面程序开发中,经常需要将信息展示到界面上,给用户及时的反馈和想要看到的结果。Text控件允许用户以不同的样式、属性来显示和编辑文本,它可以包含纯文本或者格式化文本,同时支持嵌入图片、显示超链接以及带有 CSS …

【纳什博弈、ADMM】基于纳什博弈和交替方向乘子法的多微网主体能源共享研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Spring 注解之@RestController与@Controller的区别

目录 1:介绍 2:区别 3:总体来说 4:社区地址 1:介绍 RestController 和 Controller 是 Spring MVC 中常用的两个注解,它们都可以用于定义一个控制器类。 2:区别 返回值类型不同:…

使用插件快速生成代码

使用插件快速生成代码 咋们常说,授人以鱼不如授人以渔,在这里给大家提供一些技巧性的东西,方便一些新手同学可以快速上手,同时,也提高我们的开发兴趣与开发热情! 主要讲什么呢,我们来学一学如何…

让AI来告诉你什么叫幽灵堵车

使用环境参考 CocosCreator v3.7.2 ChatGPT 正文 什么是幽灵堵车 堵车,大家都不陌生! 堵车时我就思维发散,用 CocosCreator 模拟下堵车应该挺好玩,网上总说高速上最前面如果有个龟速的车,后面能堵车堵个两三公里。…

文本三剑客之sed

sed 一.概念 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储一个命令文本文件中。二.工作流程 读取: sed从输入…

【论文阅读】MINOTAUR: Multi-task Video Grounding From Multimodal Queries

背景动机 细粒度的视频理解已经成为增强现实(AR)和机器人应用开发的关键能力。为了达到这种级别的视频理解,智能体(例如虚拟助手)必须具备识别和推理视频中捕获的事件和对象的能力,处理一系列视觉任务,如活动检测、对象检索和(空间)时间基础…

ChatGPT教程(终极版)

纯小白关于ChatGPT入门,你看我这篇文章就够了。 如果你已经用上了ChatGPT,更要恭喜你挖到宝藏,后面的高级技巧一定能让你有收获。 文章包含以下内容: 一、ChatGPT是啥?有什么用; 二、ChatGPT如何注册&…

jetson nx 用windows远程连接

VNC Viewer远程连接 一、jetson nx配置vnc 1、安装客户端 sudo apt-get install xrdp vnc4server xbase-clients2、进入nano/nx桌面,打开“Setting–>Desktop sharing”,没反应,据说是bug,我试过nano和nx都一样。首先输入下…

【c语言】组件化打包—静态库

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

IoT -- 解读物联网四层架构

本文以物联网四层架构为基础&#xff0c;从物联网产品设计的角度来解读每层架构的功能以及主要内容&#xff0c;旨在为物联网产品设计以及实现思路感兴趣的物联网产品或研发人员有些帮助。 通过互联网&#xff0c;人和人之间可以传递和交流信息。物联网&#xff0c;IoT&#x…

网络安全:Hydra 端口爆破工具.(九头蛇)

网络安全&#xff1a;Hydra 端口爆破工具.&#xff08;九头蛇&#xff09; Hydra 也叫九头蛇&#xff0c;是一款开源的暴力PJ工具&#xff0c;集成在kali当中。可以对多种服务的账号和密码进行爆破&#xff0c;包括 Web 登录、数据库、SSH、FTP 等服务. 目录&#xff1a; 网络…

调用api实现ChatGPT接口余额查询

在ChatGPT官网可以查询接口使用额度&#xff0c;但是官方并没有提供相应的API给开发者调用。我们可以通过破解的方式找到它的API。方法如下&#xff1a; 1. 使用Chrome浏览器打开https://platform.openai.com/account/usage 2. 打开开发者工具&#xff0c;然后刷新网页&#xf…

我让gpt写了一段正则表达式代码,可是运行报错,可以帮忙看看哪里出了问题?...

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 忽闻海上有仙山&#xff0c;山在虚无缥缈间。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【HZL】问了一个Python正则表达式的问…

ES6知识点

目录 1、let、cons、var的区别 2、const对象的属性可以修改吗 3、如果new一个箭头函数会怎么样 4、箭头函数和普通函数的区别&#xff1a; 5、扩展运算符的作用及使用场景 1、let、cons、var的区别 1️⃣&#xff1a;块级作用域&#xff1a;块作用域由{}包括&#xff0c;le…

ERM LABS 与 The Sandbox 战略合作,将真人密室逃脱游戏引进元宇宙

将现实生活中的体验带入一个全新的维度&#xff01;ERM LABS 专注于将现实生活中的娱乐及冒险体验以游戏独特架构设计扩展到元宇宙裡。与 The Sandbox 合作&#xff0c;该项目旨在为全球合作的真人密室逃脱场所提供无限开放形的线上虚拟世界&#xff0c;让玩家尽情享受考验智商…

09——svg中path的使用

一、path 是 svg 中最强大的图形 用于定义一个 路径所有命令均允许小写字母。大写 表示绝对定位&#xff0c;小写 表示 相对定位 &#xff08;相对于上一个结束的坐标&#xff09;d 属性中包含所有路径的点&#xff0c;可根据命令缩写 自由组合 命令 名称 …

最全的分布式事务详情,它来啰~

我们首先得理解什么是分布式事务呢&#xff1f;分布式事务是指在分布式系统中&#xff0c;涉及多个计算机或服务器的操作序列&#xff0c;这些操作需要满足一致性和可靠性的要求。每个操作要么全部成功执行&#xff0c;要么全部回滚&#xff0c;以保持数据的一致性和完整性。 …

假期出行小程序+chatgpt旅游攻略

马上五一了,如果想出去旅游,需要提取规划好路线图,我们可以借助chatgpt的路线规划功能帮我们生成一份攻略,按照攻略我们就可以愉快的出去玩耍了。 本文结合chatgpt,利用低代码工具帮我们制作一份旅行导览小程序,可以按照行程方便的出行。 1 制定攻略 我们在聊天窗口输…

从小白到黑客高手:一份全面详细的学习路线指南

前言 黑客从入门到精通需要经过深入的学习和实践&#xff0c;这是一个需要长时间投入和大量精力的过程。在这份学习路线中&#xff0c;我将为你介绍黑客学习的基本知识和技能&#xff0c;帮助你逐步掌握黑客技能。 黑客 一、入门阶段 1.了解计算机基础知识 学习计算机基础知…