共计 5110 个字符,预计需要花费 13 分钟才能阅读完成。
Redis 简介
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API,如 Java, Python, PHP 等。它通常被称为数据结构服务器,因为值(value)可以是字符串 (String), 哈希(Hash), 列表(List), 集合(Set) 和 有序集合(Sorted Set) 等类型。Redis 有三个主要特点,使它优越于其它键值数据存储系统:
Redis 将其数据库完全保存在内存中,仅使用磁盘进行持久化;
与其它键值数据存储相比,Redis 有一组相对丰富的数据类型;
Redis 可以将数据复制到任意数量的从机(slave)中。
关于 Redis 的安装与配置,可以参考网址:http://www.redis.net.cn/tutor…,本文将不再过多介绍。
Redis 的基本数据结构
Redis 的基本数据结构有:
String: 字符串
Hash: 哈希(字典)
List: 列表
Set: 集合
Sorted Set: 有序集合
以下,将针对这 5 中基本数据结构进行简单介绍。
String: 字符串
redis 字符串数据类型的相关命令用于管理 redis 字符串值。
127.0.0.1:6379> set testkey China
OK
127.0.0.1:6379> get testkey
“China”
127.0.0.1:6379> mset testkey1 USA testkey2 UK testkey3 GER
OK
127.0.0.1:6379> mget testkey1 testkey2 testkey3
1) “USA”
2) “UK”
3) “GER”
127.0.0.1:6379> del testkey3
(integer) 1
127.0.0.1:6379> get testkey3
(nil)
set 和 get 命令分别为设置和获取 String 的值,mset 和 mget 命令分别为设置和获取多个 String 的值,del 命令为删除 String 的值。
更多关于 String 的操作可参考网址:http://www.redis.net.cn/tutor…。
Hash: 哈希(字典)
redis 中的 Hash 是一个 string 类型的 key 和 value 的映射表,hash 特别适合用于存储对象。redis 中每个 Hash 可以存储 $2^{32}-1$ 个键值对(40 多亿)。
127.0.0.1:6379> hset company1 name “baidu”
(integer) 1
127.0.0.1:6379> hget company1 name
“baidu”
127.0.0.1:6379> hmset company2 name “google” country “USA” type “tech corp”
OK
127.0.0.1:6379> hgetall company2
1) “name”
2) “google”
3) “country”
4) “USA”
5) “type”
6) “tech corp”
127.0.0.1:6379> hdel company1 name
(integer) 1
hset 和 hget 命令分别为设置和获取某个 key 的键值对(field-value),hmset 和 hmget 命令分别为设置和获取某个 key 的多个键值对,hgetall 命令为获取某个 key 的全部键值对,hdel 命令为删除某个 key 的键值对。
更多关于 Hash 的命令可参考网址:http://www.redis.net.cn/tutor…。
List: 列表
redis 中的 List 是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 $2^{32}-1$ 个元素。
127.0.0.1:6379> rpush databases mysql sql_server oracle mongodb redis hbase
(integer) 6
127.0.0.1:6379> lrange databases 0 4
1) “mysql”
2) “sql_server”
3) “oracle”
4) “mongodb”
5) “redis”
127.0.0.1:6379> lrem databases 0 sql_server
(integer) 1
127.0.0.1:6379> lrange databases 0 4
1) “mysql”
2) “oracle”
3) “mongodb”
4) “redis”
5) “hbase”
rpush 命令为从 List 的右端(末尾)添加一个或多个元素,lrange 命令为显示 List 的下标从 start 到 end 的元素,lrem 命令为删除某个元素(count= 0 表示删除所有与该元素相等的元素)。
更多关于 List 的命令可以参考网址:http://www.redis.net.cn/tutor…。
Set: 集合
redis 中的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。redis 中的 Set 是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 $2^{32}-1$。
127.0.0.1:6379> sadd fruit apple banana orange apple pear
(integer) 4
127.0.0.1:6379> scard fruit
(integer) 4
127.0.0.1:6379> smembers fruit
1) “orange”
2) “pear”
3) “banana”
4) “apple”
127.0.0.1:6379> srem fruit pear
(integer) 1
127.0.0.1:6379> smembers fruit
1) “orange”
2) “banana”
3) “apple”
127.0.0.1:6379> scard fruit
(integer) 3
sadd 命令为在集合中添加元素,scard 命令为统计该集合元素个数,smembers 命令为显示该集合中的所有元素,srem 命令为删除该集合中的某个元素。
更多关于 Set 的命令可以参考网址:http://www.redis.net.cn/tutor…。
Sorted Set: 有序集合
redis 中的 Sorted Set 和 Set 一样也是 string 类型元素的集合, 且不允许重复的成员。不同的是 Sorted Set 中的每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的, 但分数 (score) 却可以重复。
127.0.0.1:6379> zadd databases 1 redis
(integer) 1
127.0.0.1:6379> zadd databases 2 mongodb
(integer) 1
127.0.0.1:6379> zadd databases 3 mysql
(integer) 1
127.0.0.1:6379> zadd databases 3 mysql
(integer) 0
127.0.0.1:6379> zadd databases 4 mysql
(integer) 0
127.0.0.1:6379> zadd databases 5 oracle
(integer) 1
127.0.0.1:6379> zcard databases
(integer) 4
127.0.0.1:6379> zrange databases 0 4 withscores
1) “redis”
2) “1”
3) “mongodb”
4) “2”
5) “mysql”
6) “4”
7) “oracle”
8) “5”
127.0.0.1:6379> zrangebyscore databases 0 4 withscores
1) “redis”
2) “1”
3) “mongodb”
4) “2”
5) “mysql”
6) “4”
zadd 命令为在有序集合中添加元素(元素需要带有分数 score),zcard 命令为统计该有序集合中的元素个数,zrange 命令为显示该有序集合下标从 start 到 end 的元素,zrangebyscore 为显示该有序集合分数从 start 到 end 的元素。
更多关于 Sorted Set 的命令可以参考网址 http://www.redis.net.cn/tutor…。
Python 使用
在 Python 中操作 Redis,需要安装第三方模块 redis。示例代码如下,以操作 redis 中的 Hash 为例(默认端口号为 6379):
import redis
r = redis.Redis(host=’localhost’, port=6379, db=0)
# 设置 employee1 的键值对
r.hset(’employee1′, ‘name’, ‘Jc’)
r.hset(’employee1′, ‘age’, 25)
r.hset(’employee1′, ‘city’, ‘Shanghai’)
# 设置 employee2 的键值对
r.hset(’employee2′, ‘name’, ‘Alex’)
r.hset(’employee2′, ‘age’, 26)
r.hset(’employee2′, ‘city’, ‘New York’)
# 查询 empolyee1, employee2 的信息
print(r.hget(’employee1′, ‘name’))
print(r.hgetall(’employee1′))
print(r.hget(’employee2′, ‘name’))
print(r.hgetall(’employee2′))
输出结果:
b’Jc’
{b’name’: b’Jc’, b’age’: b’25’, b’city’: b’Shanghai’}
b’Alex’
{b’name’: b’Alex’, b’age’: b’26’, b’city’: b’New York’}
Java 使用
Java 操作 Redis 的 API 为 Jedis, maven 仓库地址为:https://mvnrepository.com/artifact/redis.clients/jedis 示例代码如下,以操作 redis 中的 Hash 为例(默认端口号为 6379):
import redis.clients.jedis.Jedis;
public class JedisTest {
public static void main(String[] args) {
// 连接本地的 Redis 服务
Jedis jedis = new Jedis(“localhost”, 6379);
System.out.println(“ 连接成功 ”);
// 设置 employee1 的键值对
jedis.hset(“employee1”, “name”, “Jc”);
jedis.hset(“employee1”, “age”, “25”);
jedis.hset(“employee1”, “city”, “Shanghai”);
// 设置 employee2 的键值对
jedis.hset(“employee2”, “name”, “Alex”);
jedis.hset(“employee2”, “age”, “26”);
jedis.hset(“employee2”, “city”, “New York”);
// 获取存储的数据并输出
System.out.println(“employee1 的姓名为: “+ jedis.hget(“employee1”, “name”));
System.out.println(“employee1 的全部信息为: “+ jedis.hgetAll(“employee1”));
System.out.println(“employee2 的姓名为: “+ jedis.hget(“employee2”, “name”));
System.out.println(“employee2 的全部信息为: “+ jedis.hgetAll(“employee2”));
}
}
输出:
连接成功
employee1 的姓名为: Jc
employee1 的全部信息为: {name=Jc, city=Shanghai, age=25}
employee2 的姓名为: Alex
employee2 的全部信息为: {name=Alex, city=New York, age=26}
总结
本次分享到此结束,感谢大家阅读~ 注意:本人现已开通微信公众号:Python 爬虫与算法(微信号为:easy_web_scrape),欢迎大家关注哦~~