1. 数据结构

深刻理解这五种数据结构,它们的工作原理,它们提供的方法,以及怎样用这些数据结构去建模,是学习理解 Redis 的关键。 首先要弄明白这些数据结构的具体含义。

五种数据结构

• (1) Strings (字符串结构)
• (2) Hashes (哈希结构)
• (3) Lists (列表结构)
• (4) Sets (集合结构)
• (5) Sorted Sets (有序集合结构)

1.1 Strings (字符串结构)

经典的 键值对结构,value 可以简单理解为字符串,不过还可以是整数。

关键字: set , get

1.1.1 value是可序列化的字符串

大多数情况下,Redis 会把 value 作为字节数组对待。可以存储 字符,有格式的序列化字符串(JSON, XML )等。
示例:

// 设置
set users:leto '{"name": leto, "planet": dune, "likes": ["spice"]}'
// 读取
get users:leto
// 获得长度
strlen users:leto
// 获得 区间内的字符
getrange users:leto 31 48
 // 追加到末尾
append users:leto " OVER 9000!!"

1.1.2 value也可以是数字

一般做一些复杂的计数功能的缓存。
下面演示了对值进行增减操作:

// 加一操作
 incr stats:page:about
//  incrby 是增加指定数字,多了个参数指定
 incrby ratings:video:12333 5

1.2 Hashes (哈希结构)

哈希结构 增加了另外一层中间层: 字段。就像 描述了一个人叫张三,他还有姓名,年龄,等字段。

关键字: hset , hget

示例:

hset users:goku powerlevel 9000
  hget users:goku powerlevel

我们拆解来看这句“hset users:goku powerlevel 9000”
hset 是命令字,users:goku 是key , powerlevel 是成员字段,这个字段的值是 9000.

可以批次处理多个字段,示例:

// 可以一次设定多个字段
  hmset users:goku race saiyan age 737
  // 一次获取多个字段
  hmget users:goku race powerlevel
  // 获取所有的字段和值
  hgetall users:goku
  // 列出所有的字段清单
  hkeys users:goku
  // 删除指定字段:
  hdel users:goku age

它有更小的粒度,它很方便,你可以拉取,更新,删除指定的字段,而不用操作整个值。

而且确实,从性能方面来看,更细颗粒的操作是必须的。

1.3 Lists (列表结构)

它的 value 以数组形式的 存储。

关键字: lpush , rpush, ltrim,llen

你可以向数组插入值,获取第一个或者最后一个值,以及操作指定索引位置上的值。

示例:

// 从左侧插入一条数据
    lpush newusers goku
   // 从右侧插入一条数据
     rpush newusers goku
    // 只保留 0-49
    ltrim newusers 0 49
    // 查看长度
    llen newusers

可以用列表结构来存储日志或者跟踪用户访问网站的路径足迹。
它可以当做队列来使用。

1.4 Sets (集合结构)

集合结构被用于存储唯一值
集合是无序的。
它提供了一组基于集合的操作,比如说并集运算。

关键字: sadd ,sismember

示例:

// 添加
sadd friends:leto ghanima paul chani jessica
// 检索 成员
sismember friends:leto jessica
// 交集
sinter friends:leto friends:duncan

//直接可以把这个结果存到一个新 key 中:
sinterstore friends:leto_duncan friends:leto friends:duncan

集合非常适用于:
需要标记或者跟踪那些有重复属性的值的时候。
或者我们希望使用集合的交并操作的时候。

1.5 Sorted Sets (有序集合结构)

有序集合结构就像集合结构一样,但是有权重(score)。

关键字: zadd ,zcount, zrevrank

权重提供了排序和排名功能。如果我们想看朋友排名,我们可以这样:

// value 有很多个,每个都设置了一个数字表示 权重
zadd friends:duncan 70 ghanima 95 paul 95 chani 75 jessica 1 vladimir
// 权重是在 90 及以上的
zcount friends:duncan 90 100
// 查询排序
zrevrank friends:duncan chani

可以 用 zrevrank 来代替 zrank,Redis 默认排序是从低到高的。
有序集合最常见的用例就是排行榜系统了。

1.6 小结

每种数据类型都有它的适用场景,根据业务需要作出选择。