Redis6之数据类型

news/2024/7/2 23:15:37

常见数据类型

String字符串

简介

        String是最基本的数据类型,是二进制安全的,一个key对应一个value

常用命令

        1.set <key> <value> :添加键值对

        2.get <key>:查询对应键值对

        3.append <key> <value>:将给定的值添加到原值的末尾

        4.strlen <key>:获取值的长度

        5.setnx <key> <value>:设置值;只有key不存在时才能设置;如果存在就设置不成功,不会覆盖

        6.incr <key>:将key中存储的数字加一,只能对数字操作,如果为空,就新增值为1

        7.decr <key>:将key中存储的数字减一,只能对数字操作,如果为空,就新增值为-1

        8.incrby/decrby <key> <步长>:将key中的数字增减,自定义步长

        9.mset <key1> <key2> <key3>...:同时设置多个键值对

        10.mget <key1> <key2> <key3>...:同时获取多个value        

        11.msetnx <key1> <value1> <key2> <value2>:同时设置一个或多个键值对,仅当key不存在(具有原子性,有一个失败全部失败)

        12.getrange <key> <起始位置> <结束位置>:获取值的范围

        13.setrange <key> <起始位置> <value>:用<value>覆写<key>所存储的字符串值,从<起始位置>开始

        14.setex <key> <过期时间> <value> :设置键值的同时设置过期时间,单位为秒

        15.getset <key> <value>:以旧换新,设置新值同时获取了旧值

数据结构

        String的数据结构是动态字符串;是可以修改的字符串,采用预分配冗余空间的方式来减少内存的频繁分配。

        内部为当前字符串分配的空间一般要高于实际长度;当字符串的长度小于1M时,扩容都是加倍现有空间,如果超过1M,扩容时一次只会多扩展1M的空间。字符串的最大长度为512M。

List列表

简介

        单键多值;

        是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部或者尾部;底层是双向链表,对两端的操作性能很高,通过索引下标操作中间的元素性能较差

常用命令

        1.lpush/rpush <key> <value1> <value2> <value3>....,:从左边或者右边插入一个或多个值

        2.lpop/rpop <key> :从左边或者右边读出值,读出后键值消失

        3.rpoplpush <key1> <key2>:从key1列表的右边读出一个值,插入到<key2>的左边

        4.lrange <key> <start> <stop>:按照索引下标获取元素(从左到右)

        如:lrange <key> 0 -1:0是左边第一个,-1是右边第一个;(0 -1表示获取所有)

        5.lindex <key> <index>:按照下标获取元素(从左到右)

        6.llen <key> :获取列表长度

        7.linsert <key> before <value> <newvalue> :在<value>后插入<newvalue>值

        8.lrem <key> <n> <value>:从左边删除n个value(从左到右)

        9.lset <key> <index> <value>:将列表key下标为index的值替换为<value>

数据结构

        Redis3.2前,底层是用压缩列表zipList、双向循环链表linkedList

        Redis3.2及之后的底层实现方式:quickList(quickList)

Hash哈希

简介

        是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象

常用命令

        1.HDEL <key>field2 [field2]:删除一个或多个hash字段。
        2.HEXISTS <key> field:确定hash字段是否存在。
        3.HGET <key> field:获取存储在指定键处的hash字段的值。
        4.HGETALL <key>:获取按指定键存储在hash中的所有字段和值
        5.HINCRBY <key>field increment:将哈希字段的整数值递增到给定的数字
        6.HINCRBYFLOAT <key> field increment :将哈希字段的浮点值按给定的量递增
        7.HKEYS <key>:获取hash中的所有字段
        8.HLEN <key>:获取hash中的字段数
        9.HMGET <key> field1 [field2] :获取所有给定哈希字段的值
        10.HMSET <key> field1 value1 [field2 value2 ] :将多个哈希字段设置为多个值
        11.HSET <key> field value:设置hash字段的字符串值
        12.HSETNX <key> field value :仅在hash字段不存在时设置该字段的值
        13.HVALS <key> :获取hash中的所有值
        14.HSCAN <key> cursor [MATCH pattern] [COUNT count]  :递增地迭代哈希字段和关联值

 数据结构

        hash底层的结构是 ziplist 和 hashtable

默认情况下:

  1. 当ziplist中entry的数量超过512的时候,会转成hashtable

  2. 单个元素的值超过64字节的时候,会转成hashtable

Set集合

简介

        set对外提供的功能与list类似,特殊之处在于可以自动排重;同时提供了判断某个成员是否在集合内的判断;

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

常用命令

        1.sadd <key> <value1> <value2> <value3>:将一个或者多个元素加入到集合中,已经存在的被忽略

        2.smembers <key>:取出该值的所有集合

        3.sismember <key> <value>:判断集合<key> 是否含有该<value>的值,有1,没有0

        4.scard <key>:返回集合个数

        5.srem <key> <value1> <value2> ...:删除集合中的某个元素

        6.spop <key>:随机从集合中吐出一个值

        7.srandmember <key> <n>:随机从该集合中取出n个值,不会从集合中删除

        8.smove <key1> <key2>:返回两个集合中的元素交集

        9.sunion <key1> <key2>:返回两个集合中的元素并集

        10.sdiff <key1> <key2>:返回两个集合的元素差集(key1中的,不包含key2)

数据结构

        set的数据结构是dict字典,字典是用hash表实现的

ZSet有序集合

简介

        Redis有序集合zset 与普通集合set非常相似;

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

常用命令      

        1.zadd <key><score1><value1><score2><value2>... :将一个或多个member元素及其score值加入到有序集key当中。
        2.zrange <key><start><stop>[WITHSCORES]:返回有序集key中,下标在<start><stop>之间的元素
        3.zrangebyscore key min max [withscores] [limit offset count]:返回有序集 key 中,所有score值介于min和max 之间(包括等于min或max )的成员
        4.zincrby <key><increment><value>:为元素的score加上增量

        5.zrem <key><value>:删除该集合下,指定值的元素v
        6.zcount <key><min><max>:统计该集合,分数区间内的元素个数。
        7.zrank <key><value>:返回该值在集合中的排名,从0开始。

数据结构

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

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

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

新数据类型

BitMaps

简介

        BitMap可以理解为存储bit的数组,多个bit存储后组成的一个特定结构,每个位置只能存储1和0

常用命令

        1.setbit <key> <offset> <value>:设置bitmap中的值,指定offset,即下标,从0开始

        2.get <key> <offset>:获取bitmap的值,指定offset下标,有则返回1,没有则返回0,不存在的下标也返回0

        3.bitcount <key> [start end]:统计设置为1的bit数量,可以指定获取的范围

        4.bitop <operation> <destkey> <keys...>:bitop可以进行多种操作是一个复合操作, 它可以对多个Bitmaps做and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 等操作,将结果保存在目标destkey中

注意

        需要注意一点,所说Bitmaps能够节省内存,但是并不适用所有情况。

        假设网站有1000万用户,但是其中的活跃用户只有10万。此时Bitmaps存储了绝大多数的僵尸用户,但是bit位的值都是0,是无效的,只有百分之一的利用率,还是浪费了绝大部分的内存。

        而如果使用map或者set存储这10万用户,可能还用不了这么多内存

HyperLogLog

简介

        HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的

常用方法

        1.PFADD <key> element [element …]:添加

        2.PFCOUNT  <key>:获得基数值

        3.PFMERGE <key1> <key2>:  合并多个key值

Geospatial

简介

        地理空间(geospatial),主要用在需要地理位置的应用上。将指定的地理空间位置(经度、纬度、名称)添加到指定的 key 中,这些数据将会存储到 sorted set;推算地理位置的信息,两地之间的距离,周围方圆的人等等场景都可以用它实现

常用方法

        1.geoadd key longitude latitude member [longitude latitude member …]:添加地理位置,可以将指定的地理空间位置(经度、纬度、名称)添加到指定的 key 中

        2.geopos key member [member …]:获取指定城市的地理位置经纬度,可以从 key 里返回所有给定地理位置的经纬度

        3.geodist key member1 member2 [unit]:返回两个坐标之间的距离,也就是两个人之间的距离(指定单位的参数 unit)

        4.georadius key lopngitude latitude radius unit [WITHCOORD] [WITHDIST] [COUNT count] [ASC|DESC] […]:以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素

        5.georadiusbymember key member radius unit […(跟 georadius 一致)]:都可以找出位于指定范围的位置元素,但是这里不是指定中心点坐标,而是指定以哪个元素为中心点

        6.geohash key member [member …]:将二维的经纬度转换成一维的字符串,也就是对经纬度进行 hash 计算

数据结构

        geo 底层原理是使用 zset来实现的,因此我们也可以使用 zset 的命令操作 geo


http://lihuaxi.xjx100.cn/news/1241531.html

相关文章

微信小程序开发大坑盘点

微信小程序开发大坑盘点 起因 前几天心血来潮&#xff0c;想给学校设计个一站式校园小程序&#xff0c;可以查询成绩&#xff0c;考试信息&#xff0c;课表之类的&#xff08;本来想法里是还想包括一些社交功能的&#xff0c;但这个因为资质问题暂且搁置了&#xff09;。其实…

pandas---数据合并(concat、append、merge)

1. concat函数 pd.concat([data1, data2], axis1) 按照行或列进行合并&#xff0c;axis0为列索引&#xff0c;axis1为行索引。 df1 make_df([1, 2], [A, B]) df2 make_df([3, 4], [A, B]) display(df1, df2) # 默认上下合并&#xff0c;垂直合并 pd.concat([df1, df2]) …

RabbitMq消息堆积问题及惰性队列

消息堆积问题 当生产者发送消息的速度超过了消费者处理的速度&#xff0c;就会导致队列的消息堆积&#xff0c;知道队列存储消息达到上限。最早接受的消息&#xff0c;可能就会成为死信&#xff0c;会被丢弃&#xff0c;这就是消息堆积问题。 解决消费对接问题 1.增加更多的消…

希尔贝壳邀您参加2023深圳国际人工智能展览会

2023深圳国际人工智能展览会“AIE”将于2023年5月16-18日在深圳国际会展中心 (宝安)举办&#xff0c;希尔贝壳受邀参加&#xff0c;展位号&#xff1a;A331。 伴随着智能行业的快速发展&#xff0c;展会已被越来越多的企业列入每年必选展会&#xff0c;也成为各采购商选购的理…

Android-MTK平台功能需求解决:客户电池NTC功能(高低温报警功能)--第2天分析与解决

一、进一步修改代码内容-过程 今日了解到&#xff0c;昨日所修改的kernel层的mtk_charger.h文件位于A13部分&#xff0c;然6769平台A13部分的kernel层不参与编译&#xff0c;那么修改后再编译等等后续操作验证结果自然无效&#xff0c;参与编译kernel层是A12部分的kernel-4.19…

springcloud 父项目建立(一)

我们开发项目&#xff0c;现在基本都用到maven&#xff0c;以及用父子项目&#xff0c;以及公共模块依赖&#xff0c;来构建方便扩展的项目体系&#xff1b; 首先我们建立父项目 microservice &#xff0c;主要是一个pom&#xff0c;管理module&#xff0c;以及管理依赖&#x…

是德DSOX3014T MSOX3014T数字逻辑示波器

概述&#xff1a; keysight是德DSOX3014T MSOX3014T数字逻辑示波器8.5 英寸电容触摸屏让操作和归档变得更加简单&#xff0c;可以加速您的测试&#xff0c;独有的区域触控触发技术支持您在几秒钟内轻松隔离信号&#xff0c;独有的区域触控触发技术支持您在几秒钟内轻松隔…

面向对象练习(3)

封装与继承 目录 1.使用封装实现企鹅类 2.选民投票 3.使用继承实现电子宠物系统 4.游戏开发-面向对象 5.信息输出-面向对象 6.电子宠物系统 7.程序分析 1.使用封装实现企鹅类 package dh03;/*** * author XXX 保证健康值的有效性&#xff08;0-100&#xff09;&#xf…