Redis 是一个开源的、轻量级的、高性能的、基于 键-值
对的缓存与存储系统,非常适合用来缓存和存储服务和消息队列、任务队列等。 本文主要介绍一下 Redis
的基本使用方法, 是 《Redis 入门指南 第2版》的读书笔记。 .to.be.continued.
Table of Contents
- Redis 简介
- 开始使用 Redis
- Redis 类型与命令
- 基本操作
- 字符串类型 string
- 散列类型 hash
- 列表类型 list
- 集合类型 set
- 有序集合 zset
- Redis 高阶操作
- Redis 与 Python
- Redis 持久化
- Redis 集群与运行
- Redis 安全与管理
Redis 简介
开始使用 Redis
Redis 类型与命令
Redis 命令不区分 大小写。主要类型有 字符串
、散列
、列表
、集合
、有序集合
等。 keys
会遍历所有键, 键多时会影响性能。
基本操作
- 利用通配符获取键名列表。
bash
中的通配符: ?
、*
、[]
、转义
- 判断 key 是否存在。 存在返回
1
, 不存在返回 0
- 删除 keys。一次可以删除多个键, 不支持通配符。
- 获取键类型。可能的返回值有
string
、hash
、list
、set
、zset
。
字符串类型 string
string
是 Redis 中最基本的数据类型,可以存储任何形式的字符串, 目前允许的最大容量是 512 MB
。
0. 键名规则。 对象类型:对象ID:对象属性
, 多个单词用 .
来分隔。键名要有意义.
- 赋值与取值。
EX|PX
设置过期时间,分别为秒和微秒数, NX 表示只有在 key 不存在时创建 key,XX 表示只有在 key 存在时赋值
1 2
| set key value [[EX seconds]|[PX milliseconds]] [NX|XX] get key
|
- 键值递增递减。存储的 string 为整数形式时,
incr
命令可以让键值加 1,返回增加后的值。 不存在时,会默认为 0,返回 1。不是整数时,会报错。incrby
则会增加 incremnt
。 decr
和 decreby
则正好相反。
1 2 3 4 5 6
| ## incr key incrby key increment ## decr key decrby key decrement
|
- 键值增加指定浮点数。 与
incrby
类似, increment
可正可负。
1
| increbyfloat key increment
|
- 键值尾部追加值。返回追加后的字符串总长度。不存在则将
key
的值 设为 value
。
- 获取字符串长度。不存在则返回
0
。
- 同时设置/获取多个键值。
1 2 3 4
| ### 获取 MGET key [key ...] ### 赋值 MSET key value [key value ..]
|
- 位操作。
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]
|
- 位的值为
0
或 1
gitbit
若超出键值长度或不存在则返回 0
setbit
若超出长度则将中间的设为 0,若不存在,则会建立该 key 并将前面的 bit 设为 0
bitcount
可以获得从 start 到 end 之间 值为 1 的位数
bitop
可以对多个字符串类的键进行位运算,保存在 destkey 中。 有 and
、or
、xor
、not
四种
bitposs
可以获取指定范围内键值第一个为 0 或 1 的位置, 从 2.8.7
版本开始引入
- 位操作可以非常紧凑地存储 布尔值. 100W 个只占 100KB多空间.
散列类型 hash
散列类型是一种 字典结构
, 存储了 字段(field)
和 字段值
的映射, 字段值只能是 字符串
, 不能 为其他类型, 不能嵌套. 其他类型也都 不能 嵌套, 如 集合
、列表
等.
散列适合存储对象: 对象类别:ID
可作键名, 属性
作为字段, 属性值
作为字段值. Redis 不要求 所有散列具有相同的结构, 这种结构是 人为约定 的, 如 user:1
可以有 car
, house
, farm
, user:2
可以只有 car
, house
, 外加 tree
.
- 赋值与取值.
1 2 3 4 5
| hset key field value hget key field hmset key field value [field2 value ...] hmget key field [field2 ...] hgetall key
|
hset
和 hmset
用来给一个或多个字段赋值, 不区分插入和更新. 没有的字段会插入,返回 1, 已有的会更改, 返回 0. 键不存在时会自动创建.
hget
和 hmget
用来获取一个或多个字段值.
hgetall
会返回所有的字段和值.
- 判断字段是否存在. 字段存在, 返回 1, 不存在(甚至键也不存在), 返回 0.
- 字段不存在时赋值.
只有不存在时
, 存在时不做任何操作. 是 原子操作.
- 增加数字. 健不存在时会自动创建, 字段不存在会插入, 返回 增值后的字段值.
- 删除字段. 可以删除一个或多个字段, 返回删除的字段个数. 键或不存在时返回 0,
1
| hdel key field [field2 ...]
|
- 只获取字段名或字段值.
hkeys
获取所有 字段
, hvals
获取所有 字段值
.
- 获得字段数. 返回字段个数.
列表类型 list
列表可以存储一个 有序的 字符串列表, 类似于 C 中的双向链表, 内部也是 C 中的双向链表实现的. 首尾插入元素复杂度为 O(1), 获取元素越接近两端越快, 通过索引访问元素相对比较慢. 一个列表类型键最多只能容纳 $2^32 - 1$ 个元素, 元素值可相同.
- 向两端增加元素.
lpush
从左边依次插入, rpush
从右边依次插入. 返回增加元素后列表的长度, 依次增加 value
, value2
, …
1 2
| lpush key value [value2 ...] rpush key value [value2 ...]
|
- 从两端弹出元素.
lpop
从左弹出, rpop
从右弹出, 返回弹出的元素.
lpush
与 lpop
或 rpush
与 rpop
可当作栈, lpush
与 rpop
或 rpush
与 lpop
可以当作队列.
3. 获取列表中元素个数. 键不存在时,返回 0. 时间复杂度为 O(1).
- 获取列表片断. 返回从
start
到 stop
之间包含两端的所有元素. 列表起始索引为 0. 支持负索引.
-1
表示最右一个, -2
表示最右第二个.
- start 比 stop 靠后, 则会返回空列表
- stop 大于实际索引范围, 则会返回 start 到最右边的列表.
- 删除列表中指定的值. 删除列表中前
count
个值为 value
的元素, 返回实际删除的元素个数.
count
> 0, 从左边开始删除前 count 个值为 value
的元素
count
< 0, 从右边开始删除前 count 个值为 value
的元素
count
= 0, 删除所有值为 value
的元素
- 获得/设置指定位置的元素值.
lindex
获得 index
处的元素值, index
可以为负, 返回元素值. lset
设置 index
处的元素值为 value
, 成功返回 OK
.
1 2
| lindex key index lset key index value
|
- 只保留列表指定片断. 跟
lrange
类似. 只保留 start
到 end
的元素. 例如保持元素个数在100以内, 可以用 ltrim
.
- 向列表中插入元素. 在列表中值为
pivot
的 前面(before)
或 之后(after)
插入 value
.
1
| linsert key before|after pivot value
|
- 元素在列表间转移. 从
source
右边弹出一个元素, 将其插入 destination
的左边, 并返回该元素.
1
| rpoplpush source destination
|
rpoplpush
可以很方便地在多个队列之间传递数据. 源跟目标相同时, 可以源源不断地将队尾的元素移到队首, 可以实现一个网站监控系统.
集合类型 set
集合类型就是数学上的集合, 没有顺序, 具有唯一性, 列表没有唯一性. 一个集合可以最多有 2^32 - 1 个字符串. 常用操作有 插入元素
, 删除元素
, 判断元素是否存在
等等. 内部实现为 值为空的散列列表(hash table)
, 操作的时间复杂度为 O(1).
- 增加/删除元素.
1 2
| sadd key member [member2 ...] sdel key member [member2 ...]
|
sadd
插入一个或多个元素, 键不存在自动创建,忽略已有元素, 返回插入的元素个数.
sdel
删除一个或多下元素, 忽略没有的元素,返回成功删除的元素个数.
- 获得集合中的所有元素或个数.
smembers
返回所有元素, scard
返回元素个数.
- 判断元素是否存在. 存在返回 1, 不存在返回 0. 时间复杂度为 O(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
先计算 key1
与 key2
的差集, 再将差集与 key3
计算差集, 依次进行.
sinter
计算所有 keys 的交集.
sunion
计算所有 keys 的并集.
- 随机获得集合中的元素.
count
> 0, 返回 不同的 相应个数的随机元素; count
< 0, 则会返回 可能相同的 |count| 个随机元素.
- 从集合弹出一个元素. 弹出是 随机的.
有序集合 zset
Redis 高阶操作
Redis 与 Python
Python 与 Redis 交互的客户端官方推荐 redis-py
。 安装很简单;
1 2 3 4
| sudo pip install -U redis-py
sudo easy_install redis-py
|
Redis 持久化
Redis 集群与运行
Redis 安全与管理