Redis 是一个开源的、轻量级的、高性能的、基于 键-值 对的缓存与存储系统,非常适合用来缓存和存储服务和消息队列、任务队列等。 本文主要介绍一下 Redis 的基本使用方法, 是 《Redis 入门指南 第2版》的读书笔记。 .to.be.continued.


Table of Contents

  1. Redis 简介
  2. 开始使用 Redis
  3. Redis 类型与命令
    1. 基本操作
    2. 字符串类型 string
    3. 散列类型 hash
    4. 列表类型 list
    5. 集合类型 set
    6. 有序集合 zset
  4. Redis 高阶操作
  5. Redis 与 Python
  6. Redis 持久化
  7. Redis 集群与运行
  8. Redis 安全与管理

Redis 简介

开始使用 Redis

Redis 类型与命令

Redis 命令不区分 大小写。主要类型有 字符串散列列表集合有序集合等。 keys 会遍历所有键, 键多时会影响性能。

基本操作

  1. 利用通配符获取键名列表bash 中的通配符: ?*[]转义
1
keys pattern
  1. 判断 key 是否存在。 存在返回 1, 不存在返回 0
1
2
exists bar
(integer) 1
  1. 删除 keys。一次可以删除多个键, 不支持通配符。
1
del key [key ...]
  1. 获取键类型。可能的返回值有 stringhashlistsetzset
1
type key

字符串类型 string

string 是 Redis 中最基本的数据类型,可以存储任何形式的字符串, 目前允许的最大容量是 512 MB
0. 键名规则对象类型:对象ID:对象属性, 多个单词用 . 来分隔。键名要有意义.

  1. 赋值与取值EX|PX 设置过期时间,分别为秒和微秒数, NX 表示只有在 key 不存在时创建 key,XX 表示只有在 key 存在时赋值
1
2
set key value [[EX seconds]|[PX milliseconds]] [NX|XX]
get key
  1. 键值递增递减。存储的 string 为整数形式时,incr 命令可以让键值加 1,返回增加后的值。 不存在时,会默认为 0,返回 1。不是整数时,会报错。incrby 则会增加 incremntdecrdecreby 则正好相反。
1
2
3
4
5
6
##
incr key
incrby key increment
##
decr key
decrby key decrement
  1. 键值增加指定浮点数。 与 incrby 类似, increment 可正可负。
1
increbyfloat key increment
  1. 键值尾部追加值。返回追加后的字符串总长度。不存在则将 key 的值 设为 value
1
append key value
  1. 获取字符串长度。不存在则返回 0
1
strlen key
  1. 同时设置/获取多个键值
1
2
3
4
### 获取
MGET key [key ...]
### 赋值
MSET key value [key value ..]
  1. 位操作
1
2
3
4
5
6
7
8
9
10
### get bit
getbit key offset
### set bit
setbit key offset value
### bit count
bitcount key [start] [end]
### bit operation
bitop operation destkey key [key ...]
### bitops
bitpos key 0|1 [start] [end]
  • 位的值为 01
  • gitbit 若超出键值长度或不存在则返回 0
  • setbit 若超出长度则将中间的设为 0,若不存在,则会建立该 key 并将前面的 bit 设为 0
  • bitcount 可以获得从 start 到 end 之间 值为 1 的位数
  • bitop 可以对多个字符串类的键进行位运算,保存在 destkey 中。 有 andorxornot 四种
  • bitposs 可以获取指定范围内键值第一个为 0 或 1 的位置, 从 2.8.7 版本开始引入
  • 位操作可以非常紧凑地存储 布尔值. 100W 个只占 100KB多空间.

散列类型 hash

散列类型是一种 字典结构, 存储了 字段(field)字段值 的映射, 字段值只能是 字符串, 不能 为其他类型, 不能嵌套. 其他类型也都 不能 嵌套, 如 集合列表等.

散列适合存储对象: 对象类别:ID 可作键名, 属性 作为字段, 属性值 作为字段值. Redis 不要求 所有散列具有相同的结构, 这种结构是 人为约定 的, 如 user:1 可以有 car, house, farm, user:2 可以只有 car, house, 外加 tree.

  1. 赋值与取值.
1
2
3
4
5
hset key field value
hget key field
hmset key field value [field2 value ...]
hmget key field [field2 ...]
hgetall key
  • hsethmset 用来给一个或多个字段赋值, 不区分插入和更新. 没有的字段会插入,返回 1, 已有的会更改, 返回 0. 键不存在时会自动创建.
  • hgethmget 用来获取一个或多个字段值.
  • hgetall 会返回所有的字段和值.
  1. 判断字段是否存在. 字段存在, 返回 1, 不存在(甚至键也不存在), 返回 0.
1
hexists key field
  1. 字段不存在时赋值. 只有不存在时, 存在时不做任何操作. 是 原子操作.
1
hsetnx key field value
  1. 增加数字. 健不存在时会自动创建, 字段不存在会插入, 返回 增值后的字段值.
1
hincrby key field value
  1. 删除字段. 可以删除一个或多个字段, 返回删除的字段个数. 键或不存在时返回 0,
1
hdel key field [field2 ...]
  1. 只获取字段名或字段值. hkeys 获取所有 字段, hvals 获取所有 字段值.
1
2
hkeys key
hvals key
  1. 获得字段数. 返回字段个数.
1
hlen key

列表类型 list

列表可以存储一个 有序的 字符串列表, 类似于 C 中的双向链表, 内部也是 C 中的双向链表实现的. 首尾插入元素复杂度为 O(1), 获取元素越接近两端越快, 通过索引访问元素相对比较慢. 一个列表类型键最多只能容纳 $2^32 - 1$ 个元素, 元素值可相同.

  1. 向两端增加元素. lpush 从左边依次插入, rpush 从右边依次插入. 返回增加元素后列表的长度, 依次增加 value, value2, …
1
2
lpush key value [value2 ...]
rpush key value [value2 ...]
  1. 从两端弹出元素. lpop 从左弹出, rpop 从右弹出, 返回弹出的元素.
1
2
lpop key
rpop key

lpushlpoprpushrpop 可当作栈, lpushrpoprpushlpop 可以当作队列.
3. 获取列表中元素个数. 键不存在时,返回 0. 时间复杂度为 O(1).

1
llen key
  1. 获取列表片断. 返回从 startstop 之间包含两端的所有元素. 列表起始索引为 0. 支持负索引.
1
lrange key start stop
  • -1 表示最右一个, -2表示最右第二个.
  • start 比 stop 靠后, 则会返回空列表
  • stop 大于实际索引范围, 则会返回 start 到最右边的列表.
  1. 删除列表中指定的值. 删除列表中前 count 个值为 value 的元素, 返回实际删除的元素个数.
1
lrem key count value
  • count > 0, 从左边开始删除前 count 个值为 value 的元素
  • count < 0, 从右边开始删除前 count 个值为 value 的元素
  • count = 0, 删除所有值为 value 的元素
  1. 获得/设置指定位置的元素值. lindex 获得 index 处的元素值, index 可以为负, 返回元素值. lset 设置 index 处的元素值为 value, 成功返回 OK.
1
2
lindex key index
lset key index value
  1. 只保留列表指定片断. 跟 lrange 类似. 只保留 startend 的元素. 例如保持元素个数在100以内, 可以用 ltrim.
1
ltrim key start end
  1. 向列表中插入元素. 在列表中值为 pivot前面(before)之后(after) 插入 value.
1
linsert key before|after pivot value
  1. 元素在列表间转移. 从 source 右边弹出一个元素, 将其插入 destination 的左边, 并返回该元素.
1
rpoplpush source destination

rpoplpush 可以很方便地在多个队列之间传递数据. 源跟目标相同时, 可以源源不断地将队尾的元素移到队首, 可以实现一个网站监控系统.

集合类型 set

集合类型就是数学上的集合, 没有顺序, 具有唯一性, 列表没有唯一性. 一个集合可以最多有 2^32 - 1 个字符串. 常用操作有 插入元素, 删除元素, 判断元素是否存在等等. 内部实现为 值为空的散列列表(hash table), 操作的时间复杂度为 O(1).

  1. 增加/删除元素.
1
2
sadd key member [member2 ...]
sdel key member [member2 ...]
  • sadd 插入一个或多个元素, 键不存在自动创建,忽略已有元素, 返回插入的元素个数.
  • sdel 删除一个或多下元素, 忽略没有的元素,返回成功删除的元素个数.
  1. 获得集合中的所有元素或个数. smembers 返回所有元素, scard 返回元素个数.
1
2
smembers key
scard key
  1. 判断元素是否存在. 存在返回 1, 不存在返回 0. 时间复杂度为 O(1).
1
sismember key member
  1. 集合间运算. sinter - 交集, sunion - 并集, sdiff - 差集, 返回相应的所有元素.
    sdiffstore, sinterstore, sunionstore 则将结果集合保存在 destination 中.
1
2
3
4
5
6
sdiff key1 key2 [key3 ...]
sdiffstore destination key1 key2 [key3 ...]
sinter key1 key2 [key3 ...]
sinterstore destination key1 key2 [key3 ...]
sunion key1 key2 [key3 ...]
sunionstore destination key1 key2 [key3 ...]
  • sdiff 先计算 key1key2 的差集, 再将差集与 key3 计算差集, 依次进行.
  • sinter 计算所有 keys 的交集.
  • sunion 计算所有 keys 的并集.
  1. 随机获得集合中的元素. count > 0, 返回 不同的 相应个数的随机元素; count < 0, 则会返回 可能相同的 |count| 个随机元素.
1
srandmember key [count]
  1. 从集合弹出一个元素. 弹出是 随机的.
1
spop key

有序集合 zset

Redis 高阶操作

Redis 与 Python

Python 与 Redis 交互的客户端官方推荐 redis-py。 安装很简单;

1
2
3
4
## pip
sudo pip install -U redis-py
## easy_install
sudo easy_install redis-py

Redis 持久化

Redis 集群与运行

Redis 安全与管理