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


