首页 > 编程知识 正文

redis常用的数据类型,redislist数据类型及场景

时间:2023-05-06 03:07:19 阅读:33449 作者:2967

redis8种基本数据类型及其应用文章目录redis8种基本数据类型及其应用1 .概述2 .安装redis3.基本命令3.1SET命令4 .基本数据类型4.1 String字符串存储原理String三种编码redis sdsembbbby h散列ziplist压缩列表ht(hashtable )哈希表应用场景4.3列表列表列表列表存储原理(quicklist )应用场景4.4集集合存储结构应用场景4.5 ZSet规则集合存储结构应用场景4.6 bitmaps 4.7 hyperlogs

1 .前言

Redis是一个开源内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。

支持多种类型的数据结构

字符串strings哈希列表lists集合sets排序集合sorted setsbitmapshyperloglogs地理空间地理空间地理索引半径查询支持每秒10w的查询请求

安装redis Linux CentOS7并启动redis

将alias设置为易于操作

查找ls|grepredis#redis安装路径aliasrcli='/usr/mm DLR/redis-CLI ' #设置别名使用#别名rcli 3.基本命令推荐站点http://reredis

3.1SET命令网站上介绍得很清楚,所以本文省略。 直接看看效果吧。

这有一个小问题(error ) NOAUTH Authentication required .提示没有认证。 必须输入密码

自动密码。

set ggdwl 666设置key=ggdwl value=666get ggdwl获取key=ggdwl的value值那么我们一般 set 的数据在redis中是什么类型?

类型gg dwl-string

4 .基本数据类型官方网站数据类型介绍地址https://redis.io/topics/data-types-intro

官网有8种,前5种是常用的数据结构

string二进制文件中安全字符串Lists:按插入顺序排序的字符串元素的集合。 他们基本上是链表(linked lists )。 Sets:不重复的无序字符串元素的集合。 与Sets类似的Sorted sets,但每个字符串元素都有一个称为“浮动数值”(floating number value )的值。 中的元素始终按score排序,因此不同的是一组可搜索的元素。 例如,你可能会问“请给我前面10个或后面10个要素”。 由Hashes、field和关联的value组成的映射。 field和value都是字符串。 这和Ruby和Python的hashes很像。 位阵列(或简单位) :可以将字符串值视为一组位。 您可以设置和清除单个bits,计数设置为1的所有bits的数量,以及找到设置为开头1或0的bit。 HyperLogLogs:这是用于估计一个set中的元件数的概率的数据结构。 Streams:5.0发行版中的新功能,append-onlycollectionsofmap-likeentriesthatprovideanabstractlogdatatype .是永久消息队列4.1条消息

set hello word

三种类型的String编码int存储8字节长整数(long,2^63-1 ) embstr、embstr格式的SDS (simpledynamicstring ) raw和SDS,并且包含44字节或更大的字符串33555

主要是为了解决c语言char[]的四个问题

字符数组必须先为目标变量分配足够的空间。 否则,查询字符数组的长度时间复杂度O(N )的长度可能会发生变化,需要重新分配内存以从字符串的开头到结尾标记字符串的结尾,因此图像、音频、视频、压缩文件等字节二进制不安全的redis SDS可以不担心内存溢出问题。 根据需要扩展SDS是因为定义了len属性。 查询数组的长度时间复杂度o(1)定长空间的预分配、惰性空间的释放以长度len结束,(判断不是 embstr和raw

如果value的值为整数,则将其编码为int。 如果value的值为字符,则存储的编码为embstr,是连续的内存区域。 如果value值的字符长度超过44,则只分配一次存储的编码

raw,不是连续的内存空间,需要分配两次如果 value 的值为 int 或者 embstr ,然后通过 append 添加字符的时候,也会转化为 raw 类型(因为 embstr 设计的是只读的,如果发生变化只能再开辟一块空间),而且这个过程是不可逆的。 应用场景 缓存,热点数据分布式sessionset key value NX EX 分布式锁INCR计数器 文章的阅读量,微博点赞数,允许一定的延迟,先写入 Redis 再定时同步到数据库 全局ID INT 类型,INCRBY,利用原子性 INCR 限流 以访问者的 IP 和其他信息作为 key,访问一次增加一次计数,超过次数则返回 false。 setbit 位操作 4.2 Hash 哈希

对于这种类似于数据库表的结构,redis中可以使用hash进行存储

批量设置

hmset coder:xwf age 30 addr wuhan tag java

批量获取

hmget coder:xwf age addr tag

执行效果:

**同样是存储字符串,Hash 与 String 的主要区别? **

1、把所有相关的值聚集到一个 key 中,节省内存空间

2、只使用一个 key,减少 key 冲突

3、当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU 的消耗

Hash 不适合的场景:

1、Field 不能单独设置过期时间

2、没有 bit 操作

3、需要考虑数据量分布的问题(value 值非常大的时候,无法分布到多个节点)

hash表有两种存储的数据编码

如果Field的个数超过 512 个 或者 Field 中任意一个 键或者值 的长度大于 64个字节,hash表会用ht来存储

redis配置文件

hash-max-ziplist-entries 512hash-max-ziplist-value 64 ziplist 压缩列表

ziplist 是一个经过特殊编码的双向链表,它不存储指向上一个链表节点和指向下一 个链表节点的指针,而是存储上一个节点长度和当前节点长度,通过牺牲部分读写性能, 来换取高效的内存空间利用率,是一种时间换空间的思想。只用在字段个数少,字段值小的场景里面

ht(hashtable) 哈希表

在 Redis 中,hashtable 被称为字典(dictionary),它是一个数组+链表的结构。

为什么有 ht[0] 和 ht[1] 两个hash表,是为了扩容。

应用场景

购物车

存储命令用户idkey商品idfield1商品数量value1商品价格field2商品价格值value2 操作命令商品+1hincr商品-1hdecr删除hdel全选hgetall商品数量hlen4.3 List 列表

有序,左边是列表头,从左到右

存储有序的字符串(从左到右),元素可以重复。可以充当队列和栈的角色。

127.0.0.1:6379> lpush queue a(integer) 1127.0.0.1:6379> lpush queue b c(integer) 3127.0.0.1:6379> lrange queue 0 -11) "c"2) "b"3) "a"127.0.0.1:6379> rpush queue d e(integer) 5127.0.0.1:6379> lrange queue 0 -11) "c"2) "b"3) "a"4) "d"5) "e"127.0.0.1:6379> lpop queue"c"127.0.0.1:6379> lrange queue 0 -11) "b"2) "a"3) "d"4) "e"127.0.0.1:6379> rpop queue"e"127.0.0.1:6379> lrange queue 0 -11) "b"2) "a"3) "d" List 存储原理(quicklist)


内部是一个双向链表,*zl 指针指向的是 ziplist 压缩列表,数据真正还是存储在 ziplist 中。

应用场景 时间线队列栈 4.4 Set 集合

一个 set 集合可以存储 2^63-1 个元素

127.0.0.1:6379> sadd xwfset 123 a b c d e f g 456(integer) 9127.0.0.1:6379> smembers xwfset1) "e"2) "f"3) "b"4) "d"5) "g"6) "123"7) "a"8) "c"9) "456" 存储结构 intsethashtable 127.0.0.1:6379> object encoding xwfset"hashtable"127.0.0.1:6379> sadd intsets 1 2 3(integer) 3127.0.0.1:6379> object encoding intsets"intset" 应用场景

1.知乎点赞数

2.京东的商品筛选

127.0.0.1:6379> sadd brand:apple iPhone11(integer) 1127.0.0.1:6379> sadd brand:ios iPhone11(integer) 1127.0.0.1:6379> sadd screensize:6.0-6.24 iPhone11(integer) 1127.0.0.1:6379> sadd memorysize:256GB iPhone11(integer) 1127.0.0.1:6379> sinter brand:apple brand:ios screensize:6.0-6.24 memorysize:256GB1) "iPhone11"

筛选商品,苹果,IOS,屏幕6.0-6.24,内存大小256G

sinter brand:apple brand:ios screensize:6.0-6.24 memorysize:256GB

3.微博关注

用户(编号user001)关注

sadd focus:user001 user003

sadd focus:user002 user003 user004

相互关注

sadd focus:user001 user002

sadd focus:user002 user001

#判断用户2是否关注了用户1127.0.0.1:6379> SISMEMBER focus:user002 user001(integer) 1

我关注得到人也关注了他(共同关注)

#获取关注的交集127.0.0.1:6379> sinter focus:user001 focus:user0021) "user003"

可能认识的人

#将所有的人存放到allusers集合127.0.0.1:6379> SUNIONSTORE alluser:user001 focus:user001 focus:user002(integer) 4127.0.0.1:6379> SDIFF alluser:user001 focus:user0011) "user004"2) "user001"#剔除掉自己127.0.0.1:6379> SREM alluser:user001 user001(integer) 1127.0.0.1:6379> SDIFF alluser:user001 focus:user0011) "user004" 4.5 ZSet 有序集合

每个元素有一个对应的分数,基于分数进行排序;如果分数相等,以key值的 ascii 值进行排序。

数据结构对比

数据结构是否允许重复元素是否有序有序实现方式list是是索引下标set否否无zset否是分值score存储结构

ziplist

skiplist+dict 跳表+字典

redis配置文件

如果元素的个数超过 128 个 或者 元素中任意一个 value 的大小超过 64个字节,存储会采用 skiplist 跳表

zset-max-ziplist-entries 128zset-max-ziplist-value 64

什么是 skiplist ?

上面的是普通的链表,下面的是跳表,level 是随机的

普通链表查找一个元素的时间复杂度为O(n)

跳表的时间复杂度为O(m*log2n)

假设我们找元素19

1.先从起始的 level3 指针中查找 26 大于 19

2.退回到起始的 level2 的指针,大于7 继续往后,找到19

3.通过三次就找到了19

简书的一篇文章:redis用到的非常高效的数据结构–跳表

应用场景

1.商品的评价标签,可以记录商品的标签,统计标签次数,增加标签次数,按标签的分值进行排序

#添加商品(编号i5001)的标签tag和对应标签的评价次数127.0.0.1:6379> zadd good_tag:i5001 442 tag1 265 tag2 264 tag3(integer) 3#不带分数127.0.0.1:6379> zrange good_tag:i5001 0 -11) "tag3"2) "tag2"3) "tag1"#带分数127.0.0.1:6379> zrange good_tag:i5001 0 -1 withscores1) "tag3"2) "264"3) "tag2"4) "265"5) "tag1"6) "442"

2.百度搜索热点

#维护2020年1月21号的热点新闻127.0.0.1:6379> zadd hotspot:20200121 520 pot1 263 pot2 244 pot3(integer) 3127.0.0.1:6379> zrange hotspot:20200121 0 -1 withscores1) "pot3"2) "244"3) "pot2"4) "263"5) "pot1"6) "520"#增加点击次数127.0.0.1:6379> ZINCRBY hotspot 1 pot1"521" 4.6 BitMaps

Bitmaps 是在字符串类型上面定义的位操作。一个字节由 8 个二进制位组成。

应用场景:

用户访问统计

在线用户统计

4.7 Hyperloglogs

Hyperloglogs:提供了一种不太准确的基数统计方法,比如统计网站的 UV,存在一定的误差。

4.8 Streams

5.0 推出的数据类型。支持多播的可持久化的消息队列,用于实现发布订阅功能,借鉴了 kafka 的设计。

5.总结 数据结构 对象对象type属性值type命令输出object encoding字符串OBJ_STRING“string”int/embstr/raw列表OBJ_LIST“list”quicklist哈希OBJ_HASH“hash”ziplist/hashtable集合OBJ_SET“set”intset/hashtable有序集合OBJ_ZSET“zset”ziplist/skiplist编码转换 对象元素编码升级编码再次升级字符串INT 整数并且小于 log 2^63-1embstr 超过44字节被修改rawaxdbq和值的长度小于64字节,键值对个数不超过521个hashtable列表quicklist集合intset 元素都是整数,元素个数小于512hashtable有序集合ziplist 任何一个member长度小于64字节,元素个数不超过128个skiplist6.参考

咕泡学院 青山老师 redis-基础篇(原版更加具体,对照redis的源码进行讲解)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。