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 小结
每种数据类型都有它的适用场景,根据业务需要作出选择。