Redis:五种数据类型数据结构讲解与实战演练

String(字符串)

Redis命令在线网站

可在网站实现Redis命令:try.redis.io

String是最常用的一种数据类型,普通的key/value存储都可以归为此类

连接redis命令 ./redis-cli -p 6379

set/get

set:设置key对应的值为String类型的value

get:获取key对应的值

在这里插入图片描述

mget(mget = many get)

批量获取多个key的值,如果可以不存在则返回null
在这里插入图片描述

incr&&incrby

(如果值不是Interger类型会报错)

incr:key对应的值进行加加操作,并返回新的值 i++

incrby:加指定值
在这里插入图片描述

decr&&decrby

decr:key对应的值进行减减操作,并返回新的值 i–

decrby:减指定值
在这里插入图片描述

setnx

set if not exist

设置key对应的的为String的value,如果key已经存在则返回0
在这里插入图片描述

setex

set expire 单位:秒

设置key的值为String类型的value,并设定有效期

添加key age1 并设置30s过期 值为10
在这里插入图片描述

其它命令

getrange:获取key对应value的子字符串
在这里插入图片描述

mset:批量设置多个key的值,如果成功表示所有值都被设置,否则返回0表示没有任何值被设置

在这里插入图片描述

msetnx:同mset,不存在就设置,不会覆盖已有的key 有一个key存在旧返回0

getset:设置key的值,并返回key旧的值
在这里插入图片描述

append:给指定的key的value追加字符串,并返回新字符串的长度
在这里插入图片描述

存储中既有String类型又有int类型,Redis是怎么区分的呢?

redis多是用C++作为源码编写的

String编码:

定义type 表示数据类型 int/string标识

struct sdshdr{

​ int len;//表示buf中存储的字符串的长度

​ int free; //free表示buf中空闲空间的长度

​ char buf[]; //buf用于存储字符串内容

}

Hash(散列)

类似于HashMap 以key/value数据结构存储 Map<String,Map<String,String>>

第一个String,也就是Map<String,String>的名称,再存多个Map<String,String>。通过第一个String作为key用来区分

  • Hash是一个String类型的field和value之间的映射表
  • redis的Hash数据类型的key(hash表名称)对应的value实际的内部存储结构为一个HashMap
  • Hash特别适合存储对象
  • 相对于把一个对象的每个属性存储为String类型,将整个对象存储在Hash类型中会占用更少内存。
  • 所存储的成员较少时数据存储为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

创建hash

myinfo ->第一个String hash的key

age name salary ->对应hashMap的key

35 jack 10000 ->对应hashMap的value

在这里插入图片描述

获取hash中hashMap的值

先根据hash的key值再根据hashmap的key的获取value
在这里插入图片描述

获取hash所有key/value

在这里插入图片描述

批量存储

在这里插入图片描述

批量获取value

在这里插入图片描述

获取hash键值长度
在这里插入图片描述

删除value值

hdel hash键名称 hashmap键名称

被删除的value值会显示nil

在这里插入图片描述

List(队列)

使用场景:用户:消息队列 比如消息队列数量少不像跨系统不适用MQ等产品 就可以使用队列

添加队列命令

在这里插入图片描述

获取队列值

从第0个开始到-1 也就是拿所有

问题 拿出来的顺序是倒序:按照先进后出的数据结构类型 以栈进行存储
在这里插入图片描述

尾部删除一个元素

从key对应的list尾部删除一个元素,并返回该元素
在这里插入图片描述

rpush在key对应的list尾部添加一个元素

数据结构从左边推进去 出从右边开始

在这里插入图片描述

rpop–从key对应的list的尾部删除一个元素,并返回该元素

查看列长度:llen key名称

根据下标取值:lindex key名称 下标

删除指定队列值:lrem key名称 1 值名称

Set(集合)

补充知识点:HashSet是无需、唯一的 底层使用hashmap 添加的值作为hashmap的key 而value统一都是Objcet对象

set最大的功能就是排重

添加set

得到的结果是只添加了三个 因为news1有重复,同样的值会排重
在这里插入图片描述

列出set所有成员
在这里插入图片描述

随机移除一个元素
在这里插入图片描述

差集:sdiff 集名称 集名称

会显示后者没有的数据

并集:sunion 集名称 集名称

合并两个集合,并返回结果

交集:sunion 集名称 集名称

SortSet(有序集合)

在set基础上增加了顺序score,再根据score进行排序 倒序拿出! 倒序拿出!

应用场景:使用SortSet实现排行榜 比如用户积分排行榜 粉丝数量排行榜 性能会比Mysql高很多

zadd —在key对应的zset中添加一个元素
在这里插入图片描述

zrange:获取key对应的zset中指定范围的元素 -1表示获取所有元素
在这里插入图片描述

获取对应分数

1、2、3对应的是score
在这里插入图片描述

zrem:删除key对应的zset中的一个元素
在这里插入图片描述

zrangebyscore:返回有序集key中,指定分数范围的元素列表,排行榜中运用

先多添加几个元素 获取3到6的元素
在这里插入图片描述

zrank——返回key对应的zset中指定member的排名。其中member按score值递增(从小到大); 排名以0为底,也就是说,score值最小的成员排名为0,排行榜中运用

意思也就是获取对应排名 可以看到two为0 倒序拿出也就是最后一名
在这里插入图片描述

zcard:查看当前有序集合元素个数
在这里插入图片描述

sortset是怎么实现存储排序的呢?

set是通过hashmap存储 key对应set的元素 value是空对象

同样采取hashmap存储,还加了一层跳跃表

数据存储是从最顶层开始的 比如数字是32 进入-1 到21 到37进行比较 37比32大 会进入下一层 32比较37 还会进入下一层 也就是21和32之间 直到发现找到合适的位置。相当于双向链表 在此基础上添加前往比当前元素大的跳转链接。存储空间比树小很多

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/113836618