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 存在时赋值
| 12
 
 | set key value [[EX seconds]|[PX milliseconds]] [NX|XX]get key
 
 | 
- 键值递增递减。存储的 string 为整数形式时,incr命令可以让键值加 1,返回增加后的值。 不存在时,会默认为 0,返回 1。不是整数时,会报错。incrby则会增加incremnt。decr和decreby则正好相反。
| 12
 3
 4
 5
 6
 
 | ##incr key
 incrby key increment
 ##
 decr key
 decrby key decrement
 
 | 
- 键值增加指定浮点数。 与 incrby类似,increment可正可负。
| 1
 | increbyfloat key increment
 | 
- 键值尾部追加值。返回追加后的字符串总长度。不存在则将 key的值 设为value。
- 获取字符串长度。不存在则返回 0。
- 同时设置/获取多个键值。
| 12
 3
 4
 
 | ### 获取MGET key [key ...]
 ### 赋值
 MSET key value [key value ..]
 
 | 
- 位操作。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | ### get bitgetbit 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.
- 赋值与取值.
| 12
 3
 4
 5
 
 | hset key field valuehget 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, …
| 12
 
 | 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.
| 12
 
 | lindex key indexlset 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).
- 增加/删除元素.
| 12
 
 | sadd key member [member2 ...]sdel key member [member2 ...]
 
 | 
- sadd插入一个或多个元素, 键不存在自动创建,忽略已有元素, 返回插入的元素个数.
- sdel删除一个或多下元素, 忽略没有的元素,返回成功删除的元素个数.
- 获得集合中的所有元素或个数. smembers返回所有元素,scard返回元素个数.
- 判断元素是否存在. 存在返回 1, 不存在返回 0. 时间复杂度为 O(1).
- 集合间运算. sinter - 交集,sunion - 并集,sdiff - 差集, 返回相应的所有元素.
 sdiffstore,sinterstore,sunionstore则将结果集合保存在destination中.
| 12
 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。 安装很简单;
| 12
 3
 4
 
 | sudo pip install -U redis-py
 
 sudo easy_install redis-py
 
 | 
Redis 持久化
Redis 集群与运行
Redis 安全与管理