Redis 学习笔记 (一):初识 Redis

4,630 阅读5分钟
原文链接: lawtech0902.com

Redis简介

Redis是一个速度极快的非关系数据库,也就是我们所说的NoSQL数据库(non-relational database),它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展性能,并且它还提供了多种语言的API。

Redis与memcached及其他类型数据库对比

Redis经常被拿来与memcached进行比较,两者都可用于存储键值映射,性能也相差无几,但是Redis能够自动以两种不同的方式将数据写入硬盘,而且Redis除了能存储普通的字符串键,还能存储其他4种数据结构,使得Redis可以用于解决更为广泛的问题,并且即可以作为主数据库使用,又可以作为其他存储系统的辅助数据库。

下表展示了Redis与memcached,MySQL以及MongoDB的特性与功能。

名称 类型 数据存储选项 查询类型 附加功能
Redis 使用内存存储的非关系数据库 字符串、列表、集合、散列表、有序集合 每种数据类型专属的命令,以及批量操作和不完全的事务支持 发布与订阅,主从复制,持久化,脚本
memcached 使用内存存储的键值缓存 键值之间的映射 创建、读取、删除、更新等命令 多线程服务器,用于提升性能
MySQL 关系数据库 每个数据库可以包含多个表,每个表可以包含多个行;可以处理多个表的视图;支持空间和第三方扩展 SELECT、INSERT、UPDATE、DELETE、函数、存储过程 支持ACID性质(需要使用InnoDB),主从复制,主主复制
MongoDB 使用硬盘存储(on-disk)的非关系文档存储 每个数据库可以包含多个表,每个表可以包含多个无schema的BSON文档 创建、读取、更新、删除、条件查询等命令 支持map-reduce操作,主从复制,分片,空间索引

Redis安装(mac)

首先下载用于安装Rudix的引导脚本,并安装Rudix

$ curl -O http://rudix.google.code.com/hg/Ports/rudix/rudix.Py
$ sudo python rudix.py install rudix

然后使用命令Rudix安装Redis,若能成功启动Redis服务器则安装成功

$ sudo rudix install redis
$ redis-server

最后用pip为Python安装Redis客户端库

$ sudo pip install redis

Redis数据结构简介

Redis可以存储键与5种不同数据结构类型之间的映射,分别是STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)、ZSET(有序集合)。有一部分命令对于这5种数据结构是通用的,如DEL、TYPE、RENAME等;但也有一部分命令只能对特定的一种或者两种结构使用。

下表从结构存储的值及读写能力对比了Redis的5种数据结构。

结构类型 结构存储的值 结构的读写能力
STRING 字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数进行自增或自减操作
LIST 一个链表,链表上的每个节点都包含了一个字符串 从链表两端推入或弹出元素;根据偏移量对链表进行修剪(trim);读取单个或多个元素;根据值查找或移除元素
SET 包含字符串的无序收集器,并且被包含的每个字符串互不相同 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素
HASH 包含键值对的无序散列表 添加、获取、移除单个键值对;获取所有键值对
ZSET 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素

Redis字符串

下表展示了3种简单的字符串命令:

命令 行为
GET 获取存储在给定键中的值
SET 设置存储在给定键中的值
DEL 删除存储在给定键中的值(该命令可用于所有类型)

SET、GET、DEL的使用示例:

$ redis-cli
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379>

SET命令在执行成功时返回OK,Python客户端会将这个OK转换为True;DEL命令在执行成功时将会返回被成功删除的值的数量;GET命令在尝试得到不存在的值时,将会返回一个nil,Python客户端会将这个nil转换为None。

Redis列表

下表展示了6种简单的列表命令:

命令 行为
LPUSH(RPUSH) 将给定值推入列表的左端(右端)
LPOP(RPOP) 从列表的左端(右端)弹出一个值,并返回被弹出的值
LINDEX 获取列表在给定位置上的单个值
LRANGE 获取列表在给定范围上的所有值

RPUSH、LRANGE、LINDEX、LPOP的使用示例

$ redis-cli
127.0.0.1:6379> rpush list-key item
(integer) 1
127.0.0.1:6379> rpush list-key item2
(integer) 2
127.0.0.1:6379> rpush list-key item
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"
127.0.0.1:6379> lindex list-key 1
"item2"
127.0.0.1:6379> lpop list-key 
"item"
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item"
127.0.0.1:6379>

RPUSH和LPUSH命令在执行成功后会返回当前列表的长度;列表索引范围从0开始,到-1结束,可以取出列表包含的所有元素;使用LINDEX可以从列表中取出单个元素。

Redis集合

Redis的集合和列表都可以存储多个字符串,它们的不同之处在于,列表可以存储多个相同的字符串,而集合则通过散列表来保证自己存储的每个字符串都是不同的(这些散列表只有键)。

下表展示了6种简单的集合命令:

命令 行为
SADD 将给定元素添加到集合
SMEMBERS 返回集合包含的所有元素
SISMEMBER 检查给定元素是否存在于集合中
SREM 如果给定的元素存在于集合中,那么移除这个元素

SADD、SMEMBERS、SISMEMBER、SREM的使用示例

$ redis-cli
127.0.0.1:6379> sadd set-key item
(integer) 1
127.0.0.1:6379> sadd set-key item2
(integer) 1
127.0.0.1:6379> sadd set-key item3
(integer) 1
127.0.0.1:6379> sadd set-key item
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item2"
2) "item3"
3) "item"
127.0.0.1:6379> sismember set-key item4
(integer) 0
127.0.0.1:6379> sismember set-key item
(integer) 1
127.0.0.1:6379> srem set-key item2
(integer) 1
127.0.0.1:6379> srem set-key item2
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item3"
2) "item"
127.0.0.1:6379>

SADD命令返回1表示成功添加到集合中,返回0表示该元素已存在于集合中;SMEMBERS命令获取到的元素组成的序列将会被Python客户端转换为Python集合;Python客户端会返回一个布尔值来表示SISMEMBER命令的检查结果;SREM命令会返回被移除元素的数量。

Redis散列

Redis的散列就像一个微型Redis,它可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串也可以是数值。可以将散列看做文档数据库里面的文档,还可以看做是关系数据库里面的行,因为散列、文档和行都允许用户同时访问或修改一个或多个域(field)。

下表展示了4种简单的列表命令:

命令 行为
HSET 在散列里面关联给定的键值对
HGET 获取指定散列键的值
HGETALL 获取散列包含的所有键值对
HDEL 如果给定键存在于散列里面,那么移除这个键

HSET、HGET、HGETALL、HDEL的使用示例

$ redis-cli
127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 1
127.0.0.1:6379> hset hash-key sub-key2 value2
(integer) 1
127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 0
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
127.0.0.1:6379> hdel hash-key sub-key2
(integer) 1
127.0.0.1:6379> hdel hash-key sub-key2
(integer) 0
127.0.0.1:6379> hget hash-key sub-key1
"value1"
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"
127.0.0.1:6379>

HSET返回一个值来表示给定的键是否已经存在于散列里面;Python客户端会把HGETALL命令获取的整个散列转换为一个Python字典;HDEL命令执行后会返回一个值来表示给定的键在移除之前是否存在于散列里面。

Redis有序集合

有序集合和散列一样,都用于存储键值对:其中有序集合的每个键称为成员(member),都是独一无二的,而有序集合的每个值称为分值(score),都必须是浮点数。有序集合是Redis里面唯一既可以根据成员访问元素(这一点和散列一样),又可以根据分值以及分值的排列顺序来访问元素的结构。

下表展示了4种简单的有序集合命令:

命令 行为
ZADD 将一个带有给定分值的成员添加到有序集合里面
ZRANGE 根据元素在有序排列中所处的位置,从有序集合里获取多个元素
ZRANGEBYSCORE 获取有序集合在给定分值范围内的所有元素
ZREM 如果给定成员存在于有序集合,那么移除这个成员

ZADD、ZRANGE、ZRANGEBYSCORE、ZREM的使用示例

$ redis-cli
127.0.0.1:6379> zadd zset-key 728 member1
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"
127.0.0.1:6379> zrem zset-key member1
(integer) 1
127.0.0.1:6379> zrem zset-key member1
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"
127.0.0.1:6379>

在尝试向有序集合添加元素的时候,ZADD命令会返回新添加元素的数量;ZRANGE命令获取有序集合包含的所有元素,这些元素会按照分值进行排序,Python客户端会将这些分值转换成浮点数;ZRANGEBYSCORE命令也可以根据分值来获取有序集合的其中一部分元素;ZREM命令在移除有序集合元素的时候,命令会返回被移除元素的数量。

# Redis, Python 🐶 怕是要给老板下跪了哦~ 🐶 赞赏 LawTech. WeChat Pay

微信打赏

LawTech. Alipay

支付宝打赏