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

待更新:

Bitmaps

HyperLogLog

GEO

Reference

《Redis设计与实现》

《Redis开发与运维》

Redis多种数据类型以及使用场景的更多相关文章

  1. Redis各种数据类型的应用场景

    redis是一种key values形式的非关系型数据库,通过内存存储,也可以把数据持久化到本地文件中. redis支持丰富的数据类型,String,list,set,zset,hash,下面说一下各 ...

  2. Redis各种数据类型的使用场景

    Redis的六种特性 l Strings l Hashs l Lists l Sets l Sorted Sets l Pub/Sub Redis各特性的应用场景 Strings Strings 数据 ...

  3. 一文搞定Redis五大数据类型及应用场景

    本文学习知识点 redis五大数据类型数据类型:string.hash.list.set.sorted_set 五大类型各自的应用场景 @TOC 1. string类型 1-1 string类型数据的 ...

  4. Redis的数据类型及使用场景

    1.redis 的数据类型 String 字符串 Hash 哈希 List 列表 Set 集合 ZSet(Sorted Set) 有序集合 2.使用场景 2.1 String 用户token 可以用r ...

  5. redis的数据类型与应用场景(二)

    1. 如何学习 redis有好多数据类型,有这么多数据类型,我们不可能每个都记得完完全全.但是我们必须知道它有哪些数据类型,每个数据类型是怎样的,有什么作用.redis的每一个数据类型都有一大堆命令, ...

  6. Redis系列之----Redis的数据类型及使用场景

       Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,能够提供多种不同的键值数据类型来适应不同场景下的缓存和存储需求.    Redis中所有的数据都存储在内存中,因此读写速度非常快,相 ...

  7. Redis各个数据类型的使用场景

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). Redis列表命令 参考:http://www.r ...

  8. Redis的数据类型以及应用场景

    1. Redis的作用 1.1 Redis可以做什么 1.缓存:缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力.Redis提供了键值 ...

  9. Redis常用数据类型及使用场景

    Redis最为常用的数据类型 字符串(String) 字符串列表(list) 字符串集合(set) 哈希(hash) 有序的字符串集合(sorted set) String(字符串) 字符串是最基本的 ...

随机推荐

  1. 关于Ubuntu18.04 linux系统下使用Tim QQ 微信

    先配上张图 步骤: 1.1 :需要安装环境deepin-wine 1.1:(你把他理解为jdk就好,没有jdk无法运行java程序,同理没有deepin-wine环境无法运行腾讯产品) 1.2 :去哪 ...

  2. jQuery中ajax请求的六种方法(三、四):$.getJSON()方法

    4.$.getJSON()方法 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

  3. linux centos 设置笔记本合盖不待机

    1.设置笔记本合盖不待机 打开配置文件 vi /etc/systemd/logind.conf 将 HandleLidSwitch 变量前的注释 # 去掉 修改 HandleLidSwitch 变量参 ...

  4. 初探Spring Security

    Spring Security 简介 Spring Security是Spring家族中的一个组成框架,具有强大且高度可定制的身份验证和访问控制功能,致力于为Java应用程序提供身份的验证和授权 (先 ...

  5. 前端云原生,以 Kubernetes 为基础设施的高可用 SSR(Vue.js) 渲染微服务初探(开源 Demo)

    背景 笔者在逛掘金的时候,有幸看到掘友狼族小狈开源的 genesis - 一个可以支持 SSR 和 CSR 渲染的微服务解决方案.总体来说思想不错,但是基于 Kubernetes 云原生部署方面一直没 ...

  6. 新东方APP技术架构演进, 分布式系统架构经验分享

    今天的演讲题目是"新东方APP技术架构演进, C端技术经验分享" 作者:张建鑫, 曾任IBM高级软件架构师, 滴滴高级技术专家, 现任新东方集团高级技术总监 古代东西方的思想家都产 ...

  7. centos7 grep 的使用

    2021-07-29 grep(Global search Regular Expression and Print out the line) "Global search" 表 ...

  8. BUUCTF-[CISCN2019 华东北赛区]Web2

    BUUCTF-[CISCN2019 华东北赛区]Web2 看题 一个论坛,内容不错:) 可以投稿,点击投稿发现要注册,那就先注册登录.随便账号密码就行. 常规操作,扫一下站点,发现有admin.php ...

  9. Android手机 自动批量发朋友圈

    做了各种对比之后,还是这个微商工具最好用

  10. Java调用腾讯云短信接口,完成验证码的发送(不成功你来砍我!!)

    一.前言 我们在一些网站注册页面,经常会见到手机验证码的存在,这些验证码一般的小公司都是去买一些大的厂家的短信服务,自己开发对小公司的成本花费太大了!今天小编就带着大家来学习一下腾讯云的短信接口,体验 ...