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. SpringMVC之@ControllerAdvice

    @ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller.使用这个 Controller ,可以实现三个 ...

  2. 集合的打印、列表List、迭代器Iterators

    集合的打印 必须使用 Arrays.toString() 来生成数组的可打印形式. 但是打印集合无需任何帮助. /** * 集合的打印 * @author myf */ public class Pr ...

  3. (一)响应式web设计。。。freecodecamp笔记

    HTML基础 HTML 的全称是 HyperText Markup Language(超文本标记语言),它是一种用来描述网页结构的标记语言. h1用作主标题,h2用作副标题,还有h3.h4.h5.h6 ...

  4. Servlet常见问题

    时间:2016-12-6 23:18 java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMapcommo ...

  5. n个容器取油问题再探

    在 韩信分油问题的拓展分析 里,最后给出了一般性的结论,即: 用 n (n > 1) 个不规则无刻度的容器从一个无穷大的油桶里取油,这些容器容量都为整数升,分别记为 a1, a2, ..., a ...

  6. Win7安装 Mysql 5.7.22客户端

    根据自己的操作系统下载对应的32位或64位的压缩包: http://dev.mysql.com/downloads/mysql/ 官网下载 选择Windows对应的版本下载 不注册直接下载 安装步骤 ...

  7. nginx简介,使用

    nginx是什么 nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件. 支持高并发,能支持几万并发连接 资源消耗少,在3万并发连接下开启10个nginx线程消耗的内存不到200M 可 ...

  8. vue 导出excel后端返回乱码下载不了的解析问题

    有俩种方法可以用 第一种方法: 解析:直接解析并且下载后端的乱码  this.download('后端给的导出excel的方法', {        ...this.queryParams  }, ` ...

  9. Python__Xpath模块

    import requests from lxml import etree # 导入xpath headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6 ...

  10. TDSQL(MySQL版)之DB组件升级

    随着数据库产品的更新迭代,修复bug等等,产品避免不了会出现升级的需求.TDSQL(MysqL版)也会有这方面的需求.接下来我就说说如何对现有TDSQL(MySQL版)集群组件进行升级,而不影响业务. ...