Redis学习笔记(持续更新中...)

2023-11-04

学习课程:尚硅谷Redis6

目录

NoSQL简介

NoSQL概述

NoSQL的特点

适用场景

NoSQL不适用场景

几种常见的NoSQL数据库

Memcache

Redis

MongoDB

Redis

Redis的底层

Redis的五大数据类型

1、String类型

2、List类型

3、Set类型

4、Hash

 5、zset类型


NoSQL简介

NoSQL概述

NoSQL(Not Only SQL),意即“不仅仅是SQL”,泛指非关系型数据库

NoSQL不依赖于业务逻辑方式存储,而以简单的key-value模式存储,因此大大的增加了数据库的扩展能力

NoSQL的特点

1、不遵循SQL的规则

2、不支持ACID(并不是不支持事务,只是不支持ACID)

3、远超于SQL的性能

适用场景

1、对数据高并发的读写

2、海量数据的读写

3、对数据的可扩展性的

NoSQL不适用场景

1、需要事务支持

2、基于sql的结构化查询存储,处理复杂的关系,需要即席查询

几种常见的NoSQL数据库

Memcache

1、数据都在内存中,一般不持久化

2、支持简单的key-value数据结构,支持类型单一

3、一般作为缓存数据库辅助持久化数据库

Redis

1、几乎包含Memcache的绝大数功能

2、数据在内存中,支持持久化,可以用来备份恢复

3、除了支持key-value之外,还有多种数据结构,例如list、set、hash、zset等

4、一般作为缓存数据库辅助持久化数据库

MongoDB

1、高性能、开源、模式自由的文档型数据库

2、数据都在内存中,如果内存不足,吧不常用的数据保存到硬盘中

3、虽然是key-value模式,但是对value(尤其json)提供了丰富的查询功能

4、支持二进制数据及大型对象

5、可以根据数据的特点替代RDBMS,成为独立的数据库。或者配合RDBMS,存储特定的数据

Redis

Redis的底层

Redis的底层采用单线程+多路IO复用

举例说明:

假设在火车站买票的时候需要托靠黄牛(倒票的人),这时候有三个人分别找黄牛帮忙买票,黄牛在火车站买票是单线程的,因为只有他一个人在跟火车站交易。但是在买票过程中,这需要票的这三个人不需要一直等待,他们可以去做其他的事情,等黄牛买到某个人需要的票时 ,就通知那个人来取,比如买到了到深圳的票,就会通知2号过来取,这就是多路IO复用

Redis的五大数据类型

1、String类型

String类型的数据结构是简单动态字符串。是可以修改的字符串,内部实现类似于Java中的ArrayList,采用预分配冗余空间的方式来减少频繁内存的频繁分配。

如图所示,为字符串预分配的空间是capacity,一般要高于字符串的实际长度len。在字符串内存小于1M时,扩容时会按内存大小成倍扩容,但是大于1M以后,每次扩容只扩大1M,其内存分配上限是512M。

一些key键操作

1、set  key value  向数据库中保存key-value键值对

2、keys *  查看数据库中有多少个键值对

3、exists key  查询当前键是否存在 1表示存在 0表示不存在

4、type key 查询当前key对应value的类型

5、del key 删除此键值对

6、unlink key 根据value选择非阻塞删除,仅将keys将keyspace元数据中删除,真正的删除会在后续异步操作

7、expire key second 给此键值对设置生命周期,单位为秒

8、ttl key 查看此键值对的是否过期  -1永不过期,-2已结过期,其他大于0的值是剩余时间

9、select index 切换数据库(默认在0)

10、dbsize 查看当前数据库有多少个键值对

11、flushdb 清空当前库

12、flushall 通杀所有的库

13、get key 查看此键值对的value

14、append key value 在此键值对后面拼接value,返回值是拼接完成后键值对value的长度

15、strlen key 查看此键值对的长度

16、setnx key value  向库中添加键值对(set 和 setnx 的区别:set key 如果该key存在,就覆盖原来的value,setnx key 如果该key存在就不添加,不存在才会添加)

17、incr/decr key 该键值对的value值加/减1(value得是数字类型的)  具有原子性!!!

18、incrby/decrby key value   该键值对的value值加/减value值

19、mset  <key> <value> <key> <value> <key> <value> 同时添加多个键值对到库中

20、mget <key> <key> <key> 同时查询多个键值对的value

21、getrange  <key> <起始位置> <结束位置> 查询该键值value从起始位置到结束位置的值

22、getset <key> <value2> 查询该键值对的值,并把原value的值替换新的value2值,返回值是原来value的值

2、List类型

简介

List类型简单介绍就是一个键对应多个值。

Redis列表的是一个简单的字符串列表,按照插入顺序排序,可以在头部或者尾部添加值。

其底层是一个双向链表,对两端的操作非常高效,但是通过索引操作中间的节点性能很差。

常用命令

1、lpush/rpush <key> <value> <value> <value>  从左边或者右边插入一个或者多个值

2、lrange <key> <起始位置> <结束位置> 查询该键值对从起始位置到结束位置的元素(0,-1)表示查询所有元素

3、lpop/rpop <key> 从该键值对的左边/右边移除一个元素,当所有value移除完,该键也消失

4、rpoplpush <k1> <k2> 从k1中右边拿出一个元素添加到k2的左边

5、lindex <key> <index> 查看该键值对第index个元素

6、llen <key> 查询该键值对value的List长度

7、linsert <key> before/after <value> <newvalue> 在该键值对的某个元素前/后插入一个新的元素

数据结构

List的数据结构是快速链表quickList。

当元素较少时,会使用一块连续的内存,这个结构是zipList,也就是压缩链表。它将所有的元素紧挨着存储,就是用一块连续的内存空间。

当有大量元素时,zipList就会链接成为quickList。

Redis把zipList和quickList结合起来,就是把多个zipList采用双向指针链接起来,形成quickList,这样就会既能有高效的插入删除性能,也不会出现太多冗余的空间。普通链表的附加指针空间太大,比如一个链表存储的是int类型数据,但是需要加上pre 和 next 两个指针,就会浪费存储空间。

3、Set类型

简介

Redis set 对外提供的功能与 List 类似,是一个列表功能。区别在于 Set 可以自动排重,当你需要存储一个列表数据,同时又不希望列表中存储重复数据时,Set 就是一个非常好的选择。Set还提供判断某个元素是否在 Set 集合内的接口,这是 List 所不能做到的。

Set 是 string 类型的无序集合,底层是一个 value 为 null 的 hash 表,所以添加、删除、查找的复杂度都是 O(1)。

常用命令

1、sadd <k> <v1> <v2> <v3> ... 向库中添加 set 集合,键为 k,元素为 v1、v2、v3...

2、smembers <key> 查询该键值对存储的 set 集合有哪些元素

3、sismenmber <k> <v> 查询该 set 集合中是否存在该元素

4、scard <key> 查询该 set 集合中多少个元素

5、srem <k> <v1> ... 删除集合中的v1...

6、spop  <k> 从集合中随机弹出一个元素,元素全部弹完,集合 key 也消失

7、srandmember <key>  <n> 随机从该 set 集合中查询 n 个元素,但集合内部元素不减少

8、smove <k1> <k2> <v> 把 k1 键值对中集合的元素 v 取出放到 k2 键值对 set 集合中

9、sinter <k1> <k2> 查询两个 set 集合中的交集元素

10、sunion <k1> <k2> 查询两个 set 集合中的并集元素

11、sdiff <k1> <k2> 查询两个 set 集合中的元素的差集(k1 中有而 k2 没有的) 

数据结构

Set 数据结构是 dict 字典,字典使用哈希表实现的。

Java 中的 HashSet 的内部实现是 HashMap,只不过所有的 value 都指向同一个对象。Redis 的 set 结构也是一样,它的内部也使用 hash 结构,所有的 value 都指向同一个内部值。

4、Hash

简介

Redis hash 是一个键值对集合。

Redis hash 是一个 string 类型的 filed 和 value 的映射表,hash 特别适合用于存储对象,类似Java 中的 Map<String,Object>。

如图中所示,value 中有 field 和 value,这样就可以存储对象的属性和属性值。

常用命令

1、hset <key> <field><value> 给 key 集合中的 field 键赋值为 value

2、hget <key> <field> 查询 key 集合中 field 键对应的值

3、hmset <key> <f1> <v1> <f2> <v2>... 批量添加键值对到库中

4、hexists <key> <field> 查询 key 集合中是否存在field键

5、hkeys <key>查询 key 集合中所有的键

6、hvals <key>查询 key 集合中有哪些 value 值

7、hincrby <key> <field> <increment> 将 key 集合中 filed 键的 value 增加 increment

8、hsetnx <key><field><value>向库中添加键值对,如果已经存在就不进行添加

数据结构

Hash 类型对应的数据结构有两种:zipList 和 hashTable。当 filed-value 长度较短且个数较少时,使用 zipList,否则使用 hashTable。

 5、zset类型

简介

Redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。

不同之处是有序集合的每个成员都关联了一个评分(score),这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。

常用命令

1、zadd <key> <s1> <v1> <s2><v2>... 向库中key集合中添加评分分别为s1、s2...的值v1、v2...

2、zrange <key> <start> <stop> (withscores) 查询key集合中从start到stop的value(带着分数显示)

3、zrangebyscore <key> <min> <max> (withscores)查询key集合中分数从min 到 max 区间的值

4、zrevrangebyscore <key> <max> <min> 跟上述查询一样,顺序颠倒

5、zincrby <key> <n> <value> 给key集合中value值的评分加上n

6、zrem <key> <v>删除可以集合中的v

7、zcount <key> <min><max>查询key集合中分数从min到max的value有多少个

8、zrank <key> <vlaue>查询key集合中的value,根据评分排序显示

数据结构

zset是Redis提供的一种非常特别的数据结构,一方面它等价于Java的数据结构Map<String,Double>,可以给每个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次。还可以通过score的范围来获取元素的列表。

zset底层使用了两个数据结构

(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。

(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis学习笔记(持续更新中...) 的相关文章

  • 如果另一个键中的计数器低于零,则从集合中原子删除一个项目?

    雷迪斯2 0 3 在我的 Redis DB 中 我有一组项目 每个项目都有一个与其关联的计数器 MULTI SADD items set foo INCRBY items foo 10000 EXEC 新项目会以随机间隔添加到集合中 当用户
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • Spring Redis删除不删除key

    我正在尝试删除一个 Redis 键 但由于某种原因它没有删除 但也没有抛出异常 这是我要删除的代码 import com example service CustomerService import com example model Cu
  • 创建 C++ Redis 模块 - “不导出 RedisModule_OnLoad() 符号”

    我在加载 Redis 模块时遇到一些问题 我只是复制来自的示例https redis io topics modules intro https redis io topics modules intro 但我把它剥下来了 include
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • 当 Jedis 与 Spring Data 一起使用时,为什么数据会以奇怪的键存储在 Redis 中?

    我将 Spring Data Redis 与 Jedis 一起使用 我正在尝试存储带有密钥的哈希值vc list id 我能够成功插入到redis 但是 当我使用 redis cli 检查密钥时 我没有看到密钥vc 501381 相反我看到
  • Spring Data Redis 覆盖默认序列化器

    我正在尝试创建一个RedisTemplatebean 将具有更新的值序列化器来序列化对象JSONredis 中的格式 Configuration class RedisConfig Bean name redisTemplate Prima
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • Web API 缓存 - 如何使用分布式缓存实现失效

    我有一个 API 目前不使用任何缓存 我确实有一个正在使用的中间件 它可以生成缓存标头 Cache Control Expires ETag Last Modified 使用https github com KevinDockx HttpC

随机推荐

  • [Load balancer does not contain an instance for the service xxx]和项目正常启动但注册不上nacos

    文章目录 可能一 可能二 可能一 远程服务没有注册到nacos 特点 springcloud使用nacos作为注册中心之项目正常启动但注册不上nacos 而且service中不显示端口号 springcloud使用nacos作为注册中心时
  • XSS-Game level 9

    第九关过滤的很严 使用编码绕过 先看源码 过滤了大小写 on 事件 script 以及一些属性 把参数拼接到 value值的时候 还编译了 htmlspecialchars 把预定义字符 lt gt 转换为HTML实体 也就是不起作用 并且
  • 2021 年最新基于 Spring Cloud 的微服务架构分析

    Spring Cloud 是一个相对比较新的微服务框架 2016 年才推出 1 0 的 release 版本 虽然 Spring Cloud 时间最短 但是相比 Dubbo 等 RPC 框架 Spring Cloud 提供的全套的分布式系统
  • C#:转换成中文数字

    代码
  • excel熵值法计算权重_如何用熵值法确定指标权重?

    记得点击蓝字关注我们哦 首先 要运用熵值法当然要理解它 搞懂它 熵值法是一种理论的数学方法 从计算机科学角度上看 属于一种算法 一 熵值法原理 熵的概念源于热力学 是对系统状态不确定性的一种度量 在信息论中 信息是系统有序程度的一种度量 而
  • [第一章 web入门]SQL注入-1

    拿到题目是一篇日记 是GET型请求方式 我们可以直接在url栏中注入数据 判断注入类型 页面有回显所以不是整型注入 id 1 and 1 2 id 1 页面无回显 判断为字符型注入 闭合符应该就是单引号 id 1 order by 4 无回
  • 深度学习之注意力机制(Attention Mechanism)和Seq2Seq

    这篇文章整理有关注意力机制 Attention Mechanism 的知识 主要涉及以下几点内容 1 注意力机制是为了解决什么问题而提出来的 2 软性注意力机制的数学原理 3 软性注意力机制 Encoder Decoder框架与Seq2Se
  • 电商购物网站(登陆注册购物车详情页等)(仿jd)

    电商购物网站 仿jd 源码链接 https gitee com ZRXXUAN shopping https github com ZRXXUAN shopping 介绍 仿照jd写的电商购物网站 可以实现基本功能 登录 注册与数据库交互
  • 排序算法c语言描述---双向冒泡排序

    排序算法系列学习 主要描述冒泡排序 选择排序 直接插入排序 希尔排序 堆排序 归并排序 快速排序等排序进行分析 文章规划 一 通过自己对排序算法本身的理解 对每个方法写个小测试程序 具体思路分析不展开描述 二 通过 大话数据结构 一书的截图
  • Linux shell与expect配合完成自动打包资源并scp到另一台Linux电脑的例子

    有时我们想使用shell脚本做一些自动操作 例如ssh或scp时自动输入密码 可以使用expect工具来实现 需求 使用shell与expect混合编程 将一个文件从机器A Ubuntu16 04 中的目录mydata打包为mydata t
  • 嵌入式工程师老了怎么办_老刘工程师睡前故事5-EMC 辐射发射超标怎么办?

    老刘工程师睡前故事 EMC 辐射发射超标怎么办 今天的工程师睡前故事讲讲汽车EMC测试中辐射发射超标了怎么办 首先来聊聊辐射发射的基本知识 辐射发射英文简称RE 检测的是产品对外的辐射干扰 国际标准参考CISPR25 国标参考GBT1865
  • outlook出现"定位链接浏览器"错误的解决办法

    打开我的电脑 单击 工具 文件夹选项 文件类型 在列表中选中 无 URL 超文本传输通讯协议 单击 高级 按钮 把原来项目删除 点新建 操作名称 处输入 OPEN 用于执行操作的应用程序 处输入 C Program Files Intern
  • GIT撤销远程MERGE

    GIT撤销远程MERGE 关于GIT撤销 网上有很多教程 基本都提到RESET或者REVERT 等我们自己按照教程搞的发现搞不了 我也跟大家有同样的困惑 这里把这个问题详细的说明一下 方法一 通过RESET撤销 我用的工具是Tortoise
  • 毕业设计-基于 MATLAB的红外图像预处理算法对比研究

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • codeforces - 920B(贪心)

    B Tea Queue time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output
  • 在没有自己的服务器的情况下,搭建自己的网站-开发自己的小程序接口

    目标 场景一 在没有自己的服务器的情况下 搭建自己的网站 并通过微信小程序给自己的网站引流 场景二 在没有自己的服务器的情况下 开发自己的小程序 后端接口使用第三方网站的某些功能完成小程序前后端数据交互能力 实现 场景一 使用gitee的g
  • 分贝dB的换算

    1dB 0 115Np 公式 公式 d B 10 l g
  • adworld.xctf-web-新手练习区刷题

    1 View Source 根据题目 就能猜到 此处是查看页面源码 在查看的过程中发现右键不能使用了 那就用F12吧 2 Robots 这题是考察Robots协议 访问的时候页面是一片空白 直接输入robots txt 在地址栏输入robo
  • 微信小程序滚动Tab选项卡:左右可滑动切换

    最终效果如上 问题 1 tab标题总共8个 所以一屏无法全部显示 2 tab内容区左右滑动切换时 tab标题随即做标记 active 3 当active的标题不在当前屏显示时 要使其能显示到当前屏中 一 wxml结构 tab标题因一排八个
  • Redis学习笔记(持续更新中...)

    学习课程 尚硅谷Redis6 目录 NoSQL简介 NoSQL概述 NoSQL的特点 适用场景 NoSQL不适用场景 几种常见的NoSQL数据库 Memcache Redis MongoDB Redis Redis的底层 Redis的五大数