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. hive -- 外部表、内部表、临时表

    1.外部表 关键字:EXTERNAL 外部表创建时需要指定LOCATION 删除外部表时,数据不被删除 CREATE EXTERNAL TABLE page_view(viewTime INT, us ...

  2. Java异常与异常处理

    异常体系结构 1.所有异常都继承于Throwable类,其下有两大子类: (1)Error类:错误,一般编程人员不太接触,如虚拟机错误.线程死锁.硬伤:使程序崩溃 (2)Exception类:异常,编 ...

  3. Linux centos 安装 maven 3.5.4

    一.maven下载 1.官方下载 打开网址:http://maven.apache.org/download.cgi 下拉滚动条,找到标记处并点击 选择自己想要的版本,我这里选择的是 3.5.4,然后 ...

  4. Jmeter HTML 报告、Jenkins 配置

    目录 Jmeter 生成 HTML 测试报告 Jenkins 配置 Jmeter 生成 HTML 测试报告 JMeter 支持生成 HTML 测试报告, 以便从测试计划中获得图表和统计信息. 以上定义 ...

  5. 跨域@RequestBody@RequestParam 和JSON.stringify

  6. centos7 wget安装Tomcat7

    2021-07-15 1.环境介绍 操作系统:centos7 jdk版本:jdk1.8.0.211 tomcat版本:tomcat7.0.109 2. 检查系统中是否已经安装 jdk ,如未安装, 请 ...

  7. 基于Linux系统的MariaDB数据库的安装配置

    数据库是指长期存储在计算机内.有组织的和可共享的数据集合.表是数据库存储数据的基本单位,一个表由若干个字段组成 MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 G ...

  8. sublime text build system automatic ctrl/cmd+B自动选择 python2 或 python3

    背景 我同时安装了 python2 和 python3 时,python 指向 python2,python3 才是 python3 默认情况下,在 Sublime 内 Ctrl/Cmd + B 运行 ...

  9. Java动态代理底层实现

    Java实现源码 上一节我们提到了Java动态代理的使用,接下来我们看一下他的具体实现. HelloInterface proxyHello = (HelloInterface) Proxy.newP ...

  10. 并发编程之:BlockingQueue

    大家好,我是小黑,一个在互联网苟且偷生的农民工. 队列 学过数据结构的同学应该都知道,队列是数据结构中一种特殊的线性表结构,和平时使用的List,Set这些数据结构相比有点特殊,它的特殊之处在于它只允 ...