Redis学习笔记:数据结构和命令

news2024/11/26 5:21:36

本文是自己的学习笔记。主要参考资料如下:
马士兵

  • 4、Redis的五大数据类型
    • 1.1、String
      • 1.1.1、String 类型的命令
      • 1.1.2、存储对象
    • 1.2、List
      • 1.2.1、List基本命令
      • 1.2.2、List高级命令
    • 1.3、Set
      • 1.3.1、Set基本命令
    • 1.4、HashMap
      • 1.4.1、HashMap基本命令
    • 1.5、ZSet(有序集合)
      • 1.5.3、ZSet的指令
    • 1.6、BitMap
      • 1.6.1、BitMap的数据结构
      • 1.6.2、BitMap的命令
    • 1.7、HyperLogLog
      • 1.7.1、应用场景
      • 1.7.2、命令
      • 1.7.3、原理
    • 1.8、GEO
      • 1.8.1、命令
  • 2、Redis全局命令
    • 2.1、获取数据库大小
    • 2.2、设置有效时间
      • 2.2.1、设置有效时间需要注意的坑
    • 2.1、存储与读取键值对
      • 2.1.1、高级的set和get

4、Redis的五大数据类型

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库缓存消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。

1.1、String

1.1.1、String 类型的命令

  1. 对value追加字符串:append key value。比如说,原有key -> “v”,append key hello,则key -> “vhello”。
  2. 获取字符串的长度:strlen key
  3. 获取字符串的某一部分:getrange key start end,start和end都是闭区间。比如"hello’',执行命令getrange key 0 3可以得到"hell"。
  4. 对替换字符串某个字符替换成指定字符串:setrange key start value。比如"hello",执行setrange key 1 xx可以得到"hxxllo"。

1.1.2、存储对象

使用json格式存储对象,比如set user1 {name:name1 age:1}

或者使用多个key存储对象的属性,比如mset user1:name name1 user1:age 1

后者与其前者相比,省略了取值后解析的逻辑。

1.2、List

redis中没有空链表的概念,如果一个链表的元素被清空,那么这个链表和对应的key也跟着消失。

redis中List的结构是链表不是数组,所以对于表头和表尾操作要比表中间的操作快很多。因为redis提供了链表和链尾的push和pop操作,所以我们可以将其当做栈或者队列使用。

List的命令支持链尾和链头操作,链头的有关命令带有l,比如在链头push一个元素lpush list value;链尾有关的命令带有r,比如链尾push一个元素rpush list value。所以链表的命令有l就多半有r,下面就只介绍其中一种,不重复介绍了。

1.2.1、List基本命令

  • 存储:lpush list value,向list左端中存入value,这里可以一次性存入多个值;rpush list value,向list右端存入value,可以一次性存入多个值。
  • 读取链表中的一段:和存储不一样,这个只有从链表左边开始读取的命令lrange list start end。注意是从链表左边开始读取,我们可以看示例。
    在这里插入图片描述
  • 通过下标获取链表中的某个值:读取第index个元素的值。lindex list index
  • 获取链表长度:llen list
  • 移除链表中队尾或队头的元素:移除操作有左右之分,可以移除左边第一个元素,也可以移除右边第一个元素。lpoprpop
  • 移除链表中值为value的元素:lrem list count value,移除链表中值为value的元素,count是移除的个数。移除过程是从左往右移除元素,不是从右往左。下面是示例。

在这里插入图片描述

  • 裁剪链表:ltrim list start end只保留链表中start到end中的元素,两者都是闭区间。

在这里插入图片描述

  • 将一个列表的队尾元素移除,并将该值加入到另一个列表的队头:rpoplpush source dest

  • 将列表中的下标为index的元素的值替换成value:lset list index value,如果index越界,或者list不存在该命令报错。

  • 判断列表是否存在:exists list,存在返回1,不存在返回0。redis没有空链表的概念,链表元素被排空了,该链表则是不存在的状态
    在这里插入图片描述

  • 向某个元素的之前/之后插入一个元素:linsert list before/after pivot value,向值为pivot的元素之前或者之后插入一个置为value的元素。redis会从左往右查找,在第一个值为pivot的元素附件插入。


1.2.2、List高级命令

  • 阻塞式pop:blpop list timeout,对listpop操作,但如果当前列表为空(链表不存在也当它是一个空链表),或者其他的原因导致没有元素pop,那该操作会阻塞线程timeout秒,中途有元素可pop就pop元素提前结束阻塞。timeout设为0则无限阻塞线程。
    下面就在一个空链表链表中阻塞式pop,然后开启另一个线程在链表中pop一个元素,最后可以看到阻塞提前终止。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述




1.3、Set

1.3.1、Set基本命令

  • 存储:sadd set value,可以向一个set中一次存储多个value,操作不具有原子性,可以一些失败一些成功。
  • 读取一个set的所有元素:smembers set
  • 判断set中是否有这个值:sismember set value,返回1存在,返回0不存在。
  • 获取set的大小:scard set
  • 删除元素:srem set value,可一次性删除多个值,也不具有原子性。
  • 随机从集合中拿出n个元素:srandmember set n
  • 随机从集合中删除一个元素:spop set
  • 将集合中的一个元素移动到另一个集合:smove source dest value,非原子性,只要从souce中取出了元素,哪怕没有dest没有添加成功,也返回1。
  • 集合的交集、并集和差集:sdiff set1 set2sunion set1 set2sinter set1 set2,上面三个指令都可以有多个参数
  • 将交集、并集和差集存储:上面的命令指示返回计算结果,这个命令是将结果存入指定的key。在以上的命令后加一个store即可。比如sdiffstore newKey set1 set2
    在这里插入图片描述



1.4、HashMap

redis里的HashMap其实Java里面的Map<String, Map<String, String>>。key String类型,但是对应的value是Map类型。

1.4.1、HashMap基本命令

  • 存储:hset map key value

  • 获取:hget map key

  • 获取或读取多个键值对:hmset map key valuehmget map key

  • 获取一个map里的所有键值对:hgetall map

  • 删除map里的键值对:hdel map key,可以删除多个key,非原子操作。

  • 获取map的长度:hlen map

  • 判断某个键值对是否存在:hexists map key

  • 获取map中所有的key,或者所有的value:hkeys maphvals map

  • 给一个value增加数字:
    map key increment。比如有这样一个map,map1 -> key1:1我们可以对key1```的值自增。
    在这里插入图片描述

  • 与setex和setnx功能一样的指令:hsetex map key valuehsetnx map key value



1.5、ZSet(有序集合)

有序集合是在集合的一个升级。其他部分和集合一样,但是value部分多加了一个score用于排序。


1.5.3、ZSet的指令

  • 存储:zadd set score key,score是分数,系统根据这个值给key排序。
  • 按默认顺序获取多个值:zrange set start end,闭区间。
  • 按默认排序获取score在一定区间的值:zrangebyscore set min max [withscore],获取set中,score在[min, max]中的元素,默认是闭区间,可以写成(min来代表开区间。我们可以使用-inf和+inf分别代表负无穷大和正无穷大。如果带上后面的参数withscore,那返回结果不止返回key,还返回对应的score。

在这里插入图片描述

  • 按逆序获取元素:与zrangebyscorezrange一样,只要将range换成revrange即可。
  • 删除元素:zrem set key,可以删除多个key,非原子操作。
  • 查看长度:zcard set
  • 查看score在某个区间的值:zcount set min max,默认闭区间,同样可以使用(min表示开区间。
  • 查看keyscorezscore zset key
  • 查看key的的名次:查看默认排序下的名次,zrank zset key;查看倒序下的名词,revrank zset key
  • keyscore自增或自减:zincrby zset increment key
  • 集合的计算:和set的交集,并集,差集计算一样,只不过指令由s变成z,比如sunionstore set1 set2对应zunionstore zset1 zset2



1.6、BitMap

1.6.1、BitMap的数据结构

BitMap有些类似于HashMap,但它只能存储某个元素是0还是1,这个数据结构的优点是极大地节省空间。

列举一个应用场景,用一个数据结构记录这节课哪些人到,哪些人没到。

此时对于一个人来说要么到要么不到,不到就可以是0表示,到就是1表示。这种场景就适合BitMap。假设这个班有8个人,那么对应的BitMap就是一个bit[8]的空间。如下图所示。
在这里插入图片描述


1.6.2、BitMap的命令

  • set:setbit key offset valuevalue只能是0或1,其他值会报错。offset相当于是index
  • get: getbit key offset
  • 统计value为1的个数:bitcount key start endstartend是闭区间,忽略startend则不计范围。这个命令关于范围的参数非常容易让人误解。比如bitcount bitmap 0 2很容易让人以为是统计bitmap[0]bitmap[2]总计三个比特位上,值为1的个数,但其实这个错误的。
    这里的0 2的单位是byte不是bit,一个byte是8个bit,所以这命令的含义是统计bitmap[0]bitmap[23]总计3个byte位,24bit位上值为1的个数,下面可看例子。
    我将0, 1, 8位设为1,bitcount bitmap 0 0统计前8位,即[0-7],所以返回结果为2;
    bitcount bitmap 0 1统计前16位,即[0 15],所以返回结果为3。
    在这里插入图片描述

1.7、HyperLogLog

1.7.1、应用场景

一个大型网站需要统计每天的UV数据(UV,Unique-Visitor),即每天的用户访问量,但是得去重,同一个用户的多次访问只能算成一次。

HyperLogLog就是这种数据量很大,可以去重的数据结构。虽然它的去重有误差,不是百分百的去重,标准误差是0.81%,但这样的精准度已经能满足需求了。比如说实际值是100.81万,而统计值是100W,在百万数量级前,0.81万是可以忽略的。

最重要的一点是,相比于使用set来统计数据,它所需要的空间几乎可以忽略不计。

下面是对比图。

在这里插入图片描述

1.7.2、命令

  • 添加:pfadd key element,可以一次性添加多个。
  • 计数:pfcount key
  • 合并集合:pfmerge destKey sourceKey

1.7.3、原理

HyperLogLog基于概率论的伯努利实验,并结合极大似然估算方法,并做了分桶优化,所以占用空间才这么小。


1.8、GEO

GEO 3.2以后提供了GEO(地理信息定位)功能,支持存储地理信息用来实现诸如摇一摇附近位置等基于地理信息的功能。

地理信息使用二维的的经纬度表示。经度范围(-180,180),维度范围(-90,90)。

业界比较通用的地理距离计算排序算法是GeoHash算法,redis也是用该算法。


1.8.1、命令

  • 添加:geoadd key longtitude latitude location。在一个key当中添加经度和纬度,然后是地名。比如geoadd map 123.43 39.42 Beijinggeoadd map 132.49 49.29 Hebei
  • 获取位置:geopos key location,可一次性获取多个location的经纬度。请添加图片描述
  • 经纬度信息转成hash:geohash key location,可一次性转换多个。
  • 请添加图片描述



2、Redis全局命令

2.1、获取数据库大小

有一个命令是keys *,后面的*可以换成其他的正则表达式。这个命令用来显示符合正则表达式的所有键值对。请添加图片描述
但是不推荐使用这个命令,因为键值对很多的时候,这个命令会打印很多数据。比如说有十万条数据,那就要打印十万行数据,这个非常消耗内存。如果想知道数据库大小,可以使用dbsize命令,它是直接读取计数器,时间是O(1)。

请添加图片描述

2.2、设置有效时间

有下面三种设置有效时间的方式。

给指定key设置过期时间:expire key seconds,seconds秒后指定key失效。也可以指定时间单位是毫秒,pexpire key millionseconds.

另外就是设置key在什么时候失效expireat key timestamp.

查看当前key还剩多少有效时间:ttl key。如果正数,表示还有x秒后就过期;返回-1,表示永远不会过期;返回-2表示已经过期。

2.2.1、设置有效时间需要注意的坑

当对一个键值对设置时间后,不要去修改它的value(可以用rename修改key)。一旦修改后之前设置的过期时间会自动失效。

比如下面就是对一个键值对设置过期时间,然后改变它的value,最后会发现过期时间失效了。
请添加图片描述

2.1、存储与读取键值对

  1. 存储和读取:get和set。
  2. 批量读取和批量设值:mget和mset,比如mset key1 value key2 value2,这里就是设置了两个键值对,key1 -> value1key2 -> value2
  3. 先读取后写入:getset key value。该指令返回key原有的值,如果这个key为null或者value为null,那指令会返回null。之后key的value会刷新成新的值。
  4. 清除指定键值对:move key
  5. 查询当前数据库是否存有指定的key:exists key,返回1存在,返回0则不存在。
  6. 列出当前数据库中的所有key:key *
  7. 查看当前key的存储的数据类型:type key
  8. 重命名key:rename key newKey、需要注意的是,如果新的key是已经存在的,那他会覆盖已经存在的那个key。所以重命名最好使用renamenx key newkey,如果newkey没有被使用,那修改成功返回1;如果newkey已经被使用,修改失败,返回0。

2.1.1、高级的set和get

  1. 如果key存在(一个键值对过期了也算是不存在)则set(并且可以设置过期时间),不存在就不set:setex key n value。n是过期时间,单位是秒。

  2. 如果key不存在才set,存在就set失败:setnx key n value

  3. 批量的msetexmsetnx:他们是原子性的操作,只要有一个key没设值成功,那所有的key都不会设值成功。

  4. 自增和自减:incr keydecr key。key类型可以是字符串。

  5. 加减n:incrby key ndecrby key n

  6. 先get,然后立刻set新值:getset key value。 这个效果和set一样,不同的是该命令会返回以前的值。

  7. 清空当前数据库的所有数据:flushdb

  8. 清空所有数据库的所有数据:flushall

  9. 查看当前数据库的大小:dbsize,这是查看当前数据库,不是查看所有数据库。

  10. 选择数据库:select n,选择第几个数据库,从0开始编号,默认选择第0个数据库,总共有16个数据库。

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

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

相关文章

【数据结构】7.4 散列表的查找

文章目录7.4.1 散列表的基本概念7.4.2 散列函数的构造散列函数的构造方法7.4.3 处理冲突的方法1. 开地址法1.1 线性探测法1.2 二次探测法2. 链地址法7.4.4 散列表的查找散列表的查找效率分析总结7.4.1 散列表的基本概念 基本思想&#xff1a;根据要存储的关键字的值&#xff0…

计算机网络-杂项

目录 1、蜂窝移动网络 2、TCP和UDP 3、5层架构 4、在浏览器中输入url地址显示主页的过程 5、TCP的基本操作 6、三次握手&#xff0c;四次挥手 6.1、三次握手&#xff1a;双方保证自己和对方都能接收和发送数据。 6.2、三次握手中&#xff0c;为什么客户机最后还要再向服…

【计算机网络】应用层体系

我们知道现代常用的计算机网络模型为5层模型&#xff0c;其中应用层是直接与我们平时常见的软件对接的最高层&#xff0c;所以先来学习应用层就显得很有必要了。其中在应用层我们需要学习网络应用程序的实现、原理并且了解网络应用程序所需要的网络服务、客户和服务器、进程和运…

DW 2023年1月Free Excel 第七次打卡 动态函数

第七章 Excel函数-动态函数 数据下载地址与参考链接&#xff1a;https://d9ty988ekq.feishu.cn/docx/Wdqld1mVroyTJmxicTTcrfXYnDd 1.FILTER函数 在工作中&#xff0c;根据指定的条件&#xff0c;将符合条件的所有记录从数据源表格式查找过来&#xff0c;一是可以用高级筛选。…

两个实用的shell命令:sed和awk用法

&#x1f34e;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;Linux系统编程 本文目录 sed的用法 sed常用场景 awk的用法 awk常用场景 我们先来看一下力扣上的shell题库中的一题&#xff1a; 实现这个功能一般来说我们会想到tail和head命令来指定打印前几行或者后几…

string的模拟实现(下)

目录 string的模拟实现下 析构函数&#xff1a; 完善函数 空对象的构造函数&#xff1a; 头插函数的一些修正&#xff1a; 构造函数的完善&#xff1a; 实现append 插入函数&#xff1a; 插入函数(字符串&#xff09; erase删除函数&#xff1a; 实现find函数&#…

【读论文】Spiking-YOLO Spiking Neural Network for Energy-Efficient Object Detection

AAAI-20 摘要 本文提出两个新方法为深度SNN提供快速、准确的信息传递&#xff1a;通道归一化和具有不平衡阈值的带符号神经元&#xff1b;本文也提出了一个基于脉冲的目标检测模型&#xff1a;Spiking-YOLO&#xff0c;并且在non-trivial datasets, PASCALVOC 和 MS COCO数据…

指针与数组

目录指针运算&#xff08;补&#xff09;指针指针指针的关系运算&#xff08;补&#xff09;指针与数组数组名二级指针指针数组指针运算&#xff08;补&#xff09; 指针指针 上一篇博客我们介绍了指针运算中的三种常见运算&#xff1a;指针整数&#xff0c;指针关系运算&…

23.1.27打卡 Codeforces Round #846 (Div. 2) A~D

https://codeforces.com/contest/1780A题给你一个长度为n的数组, 问你是否能找出三个数字, 使得这三个数字之和为奇数简单的小学数学奇偶奇偶偶偶所以我们只要找到三个奇数或者两个偶数一个奇数就好了/* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿…

简单复现 残差网络、Googlenet、mobilenet、SqueezeNet、ShuffleNet

1.残差网络 1&#xff09;网络结构 当对x求偏导的时候&#xff0c;F&#xff08;x&#xff09;对x求偏导的值很小的时候&#xff0c;对整体求x的偏导会接近于1 这样解决了梯度消失问题&#xff0c;我们可以对离输入很近的层进行很好的更新。 要注意的是F&#xff08;x&#…

【REACT-redux】

1. redux介绍 1.1 描述 Redux最主要是用作应用状态的管理。简言之&#xff0c;Redux用一个单独的常量状态树&#xff08;state对象&#xff09;保存这一整个应用的状态&#xff0c;这个对象不能直接被改变。当一些数据变化了&#xff0c;一个新的对象就会被创建&#xff08;使…

JDK SPI 和 Dubbo SPI

SPI &#xff08;Service Provider Interface&#xff09;&#xff0c;简单翻译就是服务提供接口&#xff0c;这里的“服务”泛指任何一个可以提供服务的功能、模块、应用或系统&#xff0c;会预留一些口子或者扩展点&#xff0c;只要按照既定的规范去开发&#xff0c;就可以动…

MES和金蝶云星空接口打通对接实战

四化智造MES&#xff08;WEB&#xff09;和金蝶云星空接口打通对接实战数据源平台:四化智造MES&#xff08;WEB&#xff09;MES建立统一平台上通过物料防错防错、流程防错、生产统计、异常处理、信息采集和全流程追溯等精益生产和精细化管理&#xff0c;帮助企业合理安排生产排…

机器视觉_HALCON_HDevelop用户指南_2.Getting Started

文章目录前言二、Getting Started2.1. 运行HDevelop2.2. 运行示例程序前言 标题本来想用“开始使用”或“快速上手”&#xff0c;不过感觉怪怪的&#xff0c;干脆就叫Getting Started吧&#xff0c;因为许多开发手册&#xff0c;开始上手的那节就叫这个名字。 本文是接上一篇…

【人工智能原理自学】LSTM网络:自然语言处理实践

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解LSTM网络&#xff1a;自然语言处理实践&#xff0c;一起卷起来叭&#xff01; 目录一、“RNN”二、编程实验一、“RNN” 上节课我们利用词嵌入把句子转化为词向量序列…

手把手本地搭建服务器笔记1

需要的下载的东西&#xff1a; vmware (百度网盘)银河麒麟镜像xshell,xftp安装vmware&#xff1a; 下载的包里有密钥&#xff0c;安装的时候就直接把密钥扔里面就好了 镜像处理&#xff1a; vmware左上角文件-新建虚拟机-典型&#xff0c;下一步 -安装程序光盘映像文件&am…

基于嵌入式物联网技术的智慧病房方案设计

文章目录前言1、要求2、系统设计3、功能模块3、系统功能模块图一、stm32控制模块原理图二、各功能模块的实现1、整个系统的基本配置2、RTOS多任务1、设计线程2、配置主函数代码3、温湿度读取模块(I2C)4、LED定时开关灯(pwm)5、按键实现报警信号6、脉搏&血氧数据读取7、UART…

【HTML】基础的入门学习

HTML 菜鸟教程 简介 一般结构&#xff1a; <!DOCTYPE html> 声明为 HTML5 文档<html> 元素是 HTML 页面的根元素<head> 元素包含了文档的元&#xff08;meta&#xff09;数据&#xff0c;如 <meta charset"utf-8"> 定义网页编码格式为 ut…

proteus仿真软件中芯片的命名规则与封装方法(详细版)

第一&#xff1a;PCB封装库命名规则 1、集成电路&#xff08;直插&#xff09; 用DIP-引脚数量尾缀来表示双列直插封装​ 尾缀有N和W两种,用来表示器件的体宽​ 为体窄的封装&#xff0c;体宽300mil,引脚间距2.54mm​ 为体宽的封装, 体宽600mil,引脚间距2.54mm​ 如&#…

11、关联数据库

文章目录11、关联数据库11.1 常规方式11.2 常规操作【尚硅谷】idea实战教程-讲师&#xff1a;宋红康 生活是属于每个人自己的感受&#xff0c;不属于任何别人的看法 11、关联数据库 11.1 常规方式 找到数据库选项&#xff1a; 添加指定数据库&#xff1a; 配置MySQL数据库…