Redis 数据结构

扁平化的特点,不存在数据库中列表查询一类的操作。Redis 可以做缓存或者内存数据库

数据结构

Value对象的通用数据结构

1
2
3
4
5
6
7
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS;
int refcount;
void *ptr;
}robj;
  • type:指String、List等结构化类型
  • encoding:encoding指的是这些接口规划类型具体的实现(承载)方式,同一个类型可以有多个实现方式,例如String可以用int来承载,也可以用封装的cha[]来承载,List可以用ziplist或者链表来承载
  • lru:表示本对象的空转时长,用于有限内存下长久不访问的对象的清理
  • refcount:应用计数用于对象的垃圾回收
  • ptr:指向的是以encoding方式实现这个对象的实际承载者的地址,例如String对象对应的sds地址

Redis 是二进制安全的存储,存储的数据编码格式有客户端自己指定,Redis 存储对应的字节。类似的还有 zookeeper、Kafka、hbase。

String

Redis中的String可以表示字符串、整数、浮点数、二进制四种类型,由Redis完成相互间的自动转型

基本操作:

Redis-String操作

存储二进制时,当偏移量超出当前字节的位数,也不会报错会继续开辟一个字节来存储

应用场景:

  • 对于数值的自增自减可以用来做秒杀或者限流

  • 二进制(bigmap):可以利用二进制偏移的特性记录用户是否每天登录

    1
    2
    3
    SETBIT KEY1 2 1 # 第三天登录
    SETBIT KEY1 9 1 # 第十天登录
    BITCOUNT KEY1 0 -1 # 统计用户总共登录几次

List

  • RPUSH/LPUSH:RPUSH将元素添加在列表尾,L则是将元素添加在列表头部

  • RPOP/LPOP:取出给定key的列表的尾部或头部的元素并删除元素

  • LINDEX:去除给定的key对应列表索引的某个元素

  • LRANGE:取出给定key的索引范围内的元素,例如LRANGE key1 0, 3即取出前四个元素

  • LTRIM:将给定key的列表索引范围外的元素去除

  • BLPOP/BRPOP:BRPOP key1 key2 60,60秒内,key1非空则从key1对应的列表中pop最右元素,否则从key2中pop最右元素;如果60秒内两个列表始终为空,则超时返回

  • BLPOPPUSH/BRPOPPUSH:BRPOPPUSH key1 key2 60即60秒内如果key1对应的列表非空,则把key1列表的最右元素pop,并且放到key2最后

    Hash:

  • HGET:返回给定key, field的值

  • HSET:设置给定key,field的值

  • HMGET:返回给定key,field1、field2…的值

  • HMSET:设置给定key,多个field的值

  • HGETALL:获取给定key的所有field和value

  • HDEL:删除给定key, field元素

  • HKEYS:获取给定的key的所有field名字

  • HVALS:获取给定key的所有value

  • HLEN:获取给定的key的字段数量

  • HINCRBY:HINCRBY key field increment,给定key的field元素value自增整数

  • HINCRBYFLOAT:HINCRBYFLOAT key field increment ,给定key的field元素value自增浮点数

  • HEXISTS:检查指定key field是否存在

  • HSETNX:HSETNX key field value只有当field字段不存在时,设置该元素

    Set

  • SADD / SREM / SISMEMBER:实现向SET中增加、删除元素,以及检查元素是否存在

  • SCARD / SMEMBERS:实现统计元素个数、列出所有元素

  • SRANDMEMBER:随机获取元素的操作

    1
    2
    SRANDMEMBER key1 3 #返回set集合中随机的三个元素,如果超过了set集合的大小,则全部返回
    SRANDMEMBER key1 -4 #随即返回4个元素,但是可能存在重复;如果超过了集合大小,则会返回要求的数值个数元素,存在重复
  • SDIFF / SINTER:返回给定所有集合的差集/交集

  • SDIFFSTORE / SINTERSTORE destination key1 [key2]:返回所有集合的差集/交集,并且存储在 destination 中

  • SUNION:返回给定所有集合的并集

  • SUNIONSTORE destination key1 [key2]:返回所有集合的并集,并且存储在 destination 中

  • SMOVE source destination member:将 member 元素从 source 集合移动到 destination 集合

  • SPOP:移除并返回集合中的一个随机元素

    Sorted-Set:

  • ZADD / ZREM:添加/删除元素

  • ZRANK:确定某个KEY值在本sorted-set内按照顺序排在第几位

  • ZRANGE:例如ZRANGE key start stop,获取sorted-set中排名为start和stop间的数据

  • ZRANGESCOPE:ZRANGEBYSCOPE key min max获取sorted-set中scope介于min和max之间的数据

  • ZSCOPE:确定某个key值在本sorted-set内对应的 score

  • ZINCRBY:有序集合中对指定成员的分数加上增量 increment

  • ZCARD:获取有序集合成员数

  • ZCOUNT:获取指定 score 区间的成员数

  • ZLEXCOUNT:在有序集合中计算指定字典区间内成员数量

  • ZRANGE / ZREVRANGE:通过索引区间返回有序集合的元素 / 反转

  • ZRANGEBYLEX / ZREVRANGEBYLEX:通过字典区间返回元素 / 反转

  • ZRANGEBYSCORE / ZREVRANGEBYSCORE:通过 score 区间返回元素 / 反转

  • ZRANK / ZREVRANK:返回指定成员的索引(排名) / 反向排名

  • ZINTERSTORE:交集

  • ZUNIONSTORE:并集