前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis多种数据类型以及使用场景 (转载非原创)

Redis多种数据类型以及使用场景 (转载非原创)

作者头像
xlj
修改2021-10-01 13:58:51
4390
修改2021-10-01 13:58:51
举报
文章被收录于专栏:XLJ的技术专栏XLJ的技术专栏

转载来源:https://www.cnblogs.com/bllbl/p/15358425.html

目录

正文

SDS简单动态字符串

struct sdshdr { // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度 int len; // 记录buf数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[]; }

  • free表示这个SDS没有分配 未使用空间。
  • len表示SDS保存了无字节长的字符串。
  • buf是一个char数组。

SDS与C字符串区别

  1. O(1)复杂度获取字符串长度。
  2. 防止缓冲区溢出。
  3. 减少修改字符串时带来的内存重分配次数。

字符串

命令

set key value [ex seconds] [px milliseconds] [nx|xx]

内部编码

字符串类型的内部编码有3种:

  • int:8个字节长整型。
  • embstr:小于等于39个字节的字符串。
  • raw:大于39个字节的字符串。

Redis会根据当前值的类型和长度决定使用哪种内部编码实现。

整数:

set key 8653 ok object encoding key "int"

短字符:

set key "hello" ok object encoding key "embstr"

长字符:

set key "40 bytes" ok object encoding key "raw"

使用场景

  1. 缓存
  2. 计数
  3. Session集中管理
  4. 限速

哈希

命令

hset key field value hset uset:1 name tom hget key field hget uset:1 name "tom"

内部编码

  • ziplist(压缩列表):哈希类型元素个数小于hash-max-ziplist-entries默认512个、同时所有值都小于hash-max-

ziplist-value配置时,Redis会使用ziplist实现,节省内存方面比hashtable优秀。

  • hashtable:哈希类型无法满足ziplist条件时,会用这个,hashtable的读写时间复杂度都是O(1)。

hset hashkey f3 "bigger than 64 bytes" object encoding hashkey "hashtable" hmset hashkey f1 v1 f2 v2 f3 v3 ...... f513 v513 object encoding hashkey "hashtable"

列表

从右边插入元素:rpush key value lrange listkey 0 -1 从左边插入元素:lpush key value linsert key before | after pivot value 查找:lrange key start end 删除:lpop key

内部编码

  • ziplist:元素个数小于list-max-ziplist-entries,同时每个值都小于list-max-ziplist-value,Redis选用压缩列表减少内存。
  • linkedlist:无法满足ziplist就会用链表来实现。

使用场景

  1. 消息队列
  2. 文章列表

集合

用来保存多个的字符串元素,不允许重复元素,无序。

sadd key a b c 添加key 3 srem key a b 删除key 2 scard key 计算key 1 smembers key 获取所有元素 sinter key 求交集 suinon key 求并集 sdiff key 求差集

内部编码

  • intset(整数集合)
  • hashtable

使用场景

标签(tag)

给用户添加标签

sadd user:1:tags tag1 tag2 tag3 sadd uset:1:tags tag1 tag2 tag3

给标签添加用户

sadd tag1:users user:1 user:3 sadd tag2:users user:1 user:2

计算用户共同感兴趣的标签

sinter user:1:tag2 user:2:tag

有序集合

不能重复,可以排序的set,给每个元素设置了一个score作为排序的依据。

列表、集合和有序集合三者异同点

命令

zadd key score member 添加成员 zadd user:ranking 251 tom

有序集合提供排序字段,产生代价,zadd复杂度为Ologn,sadd为O1。

zcard user:ranking 计算成员数 zscore key member 返回某个成员分数 zrank key member 计算成员的排名 zrem key member 删除成员 zrange ... 集合间的操作 (1)交集 (2)并集

内部编码

  • 压缩列表
  • 跳跃表

使用场景

添加用户赞数: zadd user:ranking:2016_03_15 mike 3 获得赞后: zincrby user:ranking:2016_03_15 mike 1 取消赞: zrem 获取赞数最多的十个用户: zrevrangebyrank user:ranking:2016_0315 0 9 展示用户信息以及用户分数: 此功能将用户名作为键后缀,将用户信息保存在哈希类型中,至于用户的分数和排名可以使用zscore和zrank hgetall user:info:tom zscore user:ranking:2016_03_15 mike zrank user:ranking:2016_03_15 mike

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SDS简单动态字符串
    • SDS与C字符串区别
    • 字符串
      • 命令
        • 内部编码
          • 使用场景
          • 哈希
            • 命令
              • 内部编码
              • 列表
                • 内部编码
                  • 使用场景
                  • 集合
                    • 内部编码
                      • 使用场景
                      • 有序集合
                        • 命令
                          • 内部编码
                            • 使用场景
                            相关产品与服务
                            云数据库 Redis
                            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档