Redis5种数据类型

2024-02-13 13:18
文章标签 数据类型 redis5

本文主要是介绍Redis5种数据类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、String(字符串)

在任何一种编程语言里,字符串String都是最基础的数据结构, 那你有想过Redis中存储一个字符串都进行了哪些操作嘛?

RedisString是可以修改的,称为动态字符串(Simple Dynamic String 简称 SDS),说是字符串但它的内部结构更像是一个 ArrayList,内部维护着一个字节数组,并且在其内部预分配了一定的空间,以减少内存的频繁分配

Redis的内存分配机制是这样:

  • 当字符串的长度小于 1MB时,每次扩容都是加倍现有的空间。

  • 如果字符串长度超过 1MB时,每次扩容时只会扩展 1MB 的空间。

这样既保证了内存空间够用,还不至于造成内存的浪费,字符串最大长度为 512MB

 

 

1、应用场景:

存储key-value键值对,这个比较简单不细说了

 

2、字符串(String)常用的命令:

set   [key]  [value]   给指定key设置值(set 可覆盖老的值)get  [key]   获取指定key 的值del  [key]   删除指定keyexists  [key]  判断是否存在指定keymset  [key1]  [value1]  [key2]  [value2] ...... 批量存键值对mget  [key1]  [key2] ......   批量取keyexpire [key]  [time]    给指定key 设置过期时间  单位秒setex    [key]  [time]  [value]  等价于 set + expire 命令组合setnx  [key]  [value]   如果key不存在则set 创建,否则返回0incr   [key]           如果value为整数 可用 incr命令每次自增1incrby  [key] [number]  使用incrby命令对整数值 进行增加 number

 

二、list(列表)

Redis中的listJava中的LinkedList很像,底层都是一种链表结构, list的插入和删除操作非常快,时间复杂度为 0(1),不像数组结构插入、删除操作需要移动数据。

像归像,但是redis中的list底层可不是一个双向链表那么简单。

当数据量较少的时候它的底层存储结构为一块连续内存,称之为ziplist(压缩列表),它将所有的元素紧挨着一起存储,分配的是一块连续的内存;当数据量较多的时候将会变成quicklist(快速链表)结构。

可单纯的链表也是有缺陷的,链表的前后指针 prevnext 会占用较多的内存,会比较浪费空间,而且会加重内存的碎片化。在redis 3.2之后就都改用ziplist+链表的混合结构,称之为 quicklist(快速链表)

 

1、应用场景:

由于list它是一个按照插入顺序排序的列表,所以应用场景相对还较多的,例如:

  • 消息队列:lpoprpush(或者反过来,lpushrpop)能实现队列的功能

  • 朋友圈的点赞列表、评论列表、排行榜:lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表。

2、list操作的常用命名:

127.0.0.1:6379> lpush summer xiaxinyu
(integer) 1
127.0.0.1:6379> lpush summer 30
(integer) 2
127.0.0.1:6379> lpush summer "java engineer"
(integer) 3
127.0.0.1:6379> lrange summer 0 10
1) "java engineer"
2) "30"
3) "xiaxinyu"

 

三、hash (字典)

Redis 中的 Hash和 Java的 HashMap 更加相似,都是数组+链表的结构,当发生 hash 碰撞时将会把元素追加到链表上,值得注意的是在 Redis 的 Hash 中 value 只能是字符串.

HashString都可以用来存储用户信息 ,但不同的是Hash可以对用户信息的每个字段单独存储;String存的是用户全部信息经过序列化后的字符串,如果想要修改某个用户字段必须将用户信息字符串全部查询出来,解析成相应的用户信息对象,修改完后在序列化成字符串存入。而 hash可以只对某个字段修改,从而节约网络流量,不过hash内存占用要大于 String,这是 hash 的缺点。

 

1、应用场景:

  • 购物车:hset [key] [field] [value] 命令, 可以实现以用户Id商品Idfield,商品数量为value,恰好构成了购物车的3个要素。
  • 存储对象:hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。

 

2、hash常用的操作命令:

127.0.0.1:6379> HMSET summer name "xiaxinyu" description "java engineer" age 30 colleage "sz university"
OK
127.0.0.1:6379> HGETALL summer
1) "name"
2) "xiaxinyu"
3) "description"
4) "java engineer"
5) "age"
6) "30"
7) "colleage"
8) "sz university"
127.0.0.1:6379> HGET summer name
"xiaxinyu"

 

四、set(集合)

Redis 中的 setJava中的HashSet 有些类似,它内部的键值对是无序的、唯一 的。它的内部实现相当于一个特殊的字典,字典中所有的value都是一个值 NULL。当集合中最后一个元素被移除之后,数据结构被自动删除,内存被回收。

 

1、应用场景:

  • 好友、关注、粉丝、感兴趣的人集合:
    1. sinter命令可以获得A和B两个用户的共同好友;
    2. sismember命令可以判断A是否是B的好友;
    3. scard命令可以获取好友数量;
    4. 关注时,smove命令可以将B从A的粉丝集合转移到A的好友集合
  • 首页展示随机:美团首页有很多推荐商家,但是并不能全部展示,set类型适合存放所有需要展示的内容,而srandmember命令则可以从中随机获取几个。
  • 存储某活动中中奖的用户ID ,因为有去重功能,可以保证同一个用户不会中奖两次。

 

2、set的常用命令:

127.0.0.1:6379> sadd lang java
(integer) 1
127.0.0.1:6379> sadd lang c#
(integer) 1
127.0.0.1:6379> sadd lang javascript
(integer) 1
127.0.0.1:6379> sadd lang java
(integer) 0
127.0.0.1:6379> SMEMBERS lang
1) "c#"
2) "javascript"
3) "java"
127.0.0.1:6379> scard lang
(integer) 3

 

五、zset(有序集合)

zset也叫SortedSet一方面它是个 set ,保证了内部 value 的唯一性,另方面它可以给每个 value 赋予一个score,代表这个value的排序权重。它的内部实现用的是一种叫作“跳跃列表”的数据结构。

 

1、应用场景:

zset 可以用做排行榜,但是和list不同的是zset它能够实现动态的排序,例如: 可以用来存储粉丝列表,value 值是粉丝的用户 ID,score 是关注时间,我们可以对粉丝列表按关注时间进行排序。

zset 还可以用来存储学生的成绩, value 值是学生的 ID, score 是他的考试成绩。 我们对成绩按分数进行排序就可以得到他的名次。

 

2、zset有序集合的常用操作命令:

127.0.0.1:6379> zadd lang 1 java
(integer) 1
127.0.0.1:6379> zadd lang 2 c#
(integer) 1
127.0.0.1:6379> zadd lang 3 javascript
(integer) 1
127.0.0.1:6379> zadd lang 3 javascript
(integer) 0
127.0.0.1:6379> zadd lang 4 grovy
(integer) 1
127.0.0.1:6379> zrange lang 0 10
1) "java"
2) "c#"
3) "javascript"
4) "grovy"
127.0.0.1:6379> zrange lang 0 10 withscores
1) "java"
2) "1"
3) "c#"
4) "2"
5) "javascript"
6) "3"
7) "grovy"
8) "4"
127.0.0.1:6379> zrange lang 2 3 withscores
1) "javascript"
2) "3"
3) "grovy"
4) "4"

 

这篇关于Redis5种数据类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705619

相关文章

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

Redis地理数据类型GEO

通常要计算两个地理位置的距离不是很方便,这里可以直接通过Redis提供的GEO操作来完成地理位置相关的计算 1)添加地理位置 语法:geoadd key longitude latitude member [longitude latitude member] ...字段说明:key:存放地理位置的集合名称longitude:地理坐标的经度latitude:地理坐标的纬度member:表示这

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log

【MySQL】MySQL常用的数据类型——表的操作

前言: 🌟🌟本期讲解关于MySQL常用数据类型,表的简单使用,希望能帮到屏幕前的你。 🌈上期博客在这里:http://t.csdnimg.cn/wwaqe 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客   目录 前言: 📚️1.MySQL常用的数据类型 1.1数值类型 1.2字符串类型 1.3日期类型  📚️2.表的简单操作 2.1创建

c语言(三种语言对比、数据类型及输出、变量存储、内存分配)

数据类型: 变量的输出: c语言不能直接打印数字,字符,只能将他们转化成字符串打印, printf("%d\n", num); %d 是整数占位符,将来由逗号右边的变量的值占据这个位置。(%i和%d是一样的) %f 是浮点数占位符,默认输出小数点后6位,若只想输出小数点后两位:%.2f %c 是字符型数据占位符。

SpinalHDL之数据类型(一)

本文作为SpinalHDL学习笔记第五十四篇,介绍SpinalHDL的Bool数据类型。 SpinalHDL技术交流QQ群: Note: 1.本群是个人技术交流群,不是什么官方答疑群; 2.提问是你的权利,但回答不是别人的义务; 3.可以潜水,不能灌水; 4.请文明交流,做这行的都算高层次人才,希望你有对应的高素质; 5.不强制改名,但希望统一格式:姓名(昵称也行)-公司/学校-

MySQL数据类型和Schema优化(二)

MySQL数据类型和Schema优化 MySQL合适的数据类型日期和时间类型(datetime、timesamp)整数类型实数类型(float\double\decimal)字符串类型(Varchar、Char) Schema设计缓存表和汇总表 MySQL 良好的逻辑设计与物理设计是高性能的基石,应该根据具体业务需求的查询语句来设计schema,这往往需要权衡各种因素。 比如

【R语言数据类型】深入了解 向量、矩阵、数据框、列表

R语言数据类型有向量、矩阵、数据框、列表。下面我们来深入了解下: vector 的划分 R中的vector分为两类,atomic和list,二者的区别在于,前者元素类型必须相同,后者可以不同。前者的代表是向量和矩阵,后者的代表是list和数据框。 创建向量、矩阵、数据框、列表 # atomica <- 1:5b <- letters[1:5]c <- 1:10mat <- matr

openCV 基本数据类型

结构成员涵义CvPointint x, y图像中的点CvPoint2D32ffloat x, y二维空间中的点CvPoint2D64fdouble x, y二维空间中的点CvPoint3D32ffloat x, y, z三维空间中的点CvPoint3D64fdouble x, y, z三维空间中的点CvSizeint width, height图像的尺寸CvRectint x, y, width,