Python 与 数据存储
文章目录
- Python 与 数据存储
- CSV
- CSV 简介
- Python 写 CSV
- 列表写入 CSV
- 字典写入 CSV
- Python 读 CSV
- 用 CSV库 读取
- 用 Pandas库 读取
- MySQL
- 连接数据库
- 创建表
- 插入数据
- 使用一系列变量插入
- 使用字典插入
- 更新数据
- 简单的数据更新
- 更实用的字典更新
- 删除数据
- 查询数据
- MongoDB
- MongoDB 简介
- 连接数据库
- 指定数据库
- 指定集合
- 插入数据
- 查询
- 计数
- 排序
- 偏移
- 更新
- 删除
- 更多
- Redis
- Redis 简介
- 连接 Redis
- 使用 StrictRedis 连接
- 使用 ConnectionPool 连接
- Key 操作
- String 操作
- List 操作
- Set 、Sorted Set操作
- Hash 操作
- RedisDump
CSV
CSV 简介
CSV(Comma-Separated Values),逗号分隔值,或字符分隔值,以纯文本形式储存表格数据。一个CSV文件的内容如下:
id,name,age
0,foo,10
1,bar,11
2,foobar,100
Python 写 CSV
列表写入 CSV
import csv
d = [['0', 'foo', '10'], ['1', 'bar', '11'], ['2', 'foobar', '100']]
with open('data.csv', 'w') as csvfile:
writer = csv.writer(csvfile) # 要改分隔符,可以传入`delimiter='分隔符'`
writer.writerow(['id', 'name', 'age']) # 写一行,传入list
writer.writerows(d) # 写入多行,传入二维list
⚠️【注意】写中文的时候,要在open的时候传入 encoding='utf-8'
,防止乱码。
字典写入 CSV
import csv
with open('data.csv', 'w') as csvfile:
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'id': '9', 'name': 'fuzz', 'age': '666'})
Python 读 CSV
用 CSV库 读取
import csv
with open('data.csv', 'r', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(type(row), row)
从结果中可以看到,读取出来的是各行的list。
用 Pandas库 读取
import pandas as pd
df = pd.read_csv('data.csv')
print(df)
print(type(df))
MySQL
连接数据库
我们现在来连接位于本地的MySQL数据库,在这之前要先确定本地的MYSQL正在运行,且处于可访问的状态。
import pymysql # 导入库
db = pymysql.connect(host='localhost', user='*', password='***') # 连接数据库,还可以传入 port = 整数值 来指定端口,这里使用默认值(3306)。
cursor = db.cursor() # 获取 MySQL 操作游标,利用操作游标才能执行SQL语句
cursor.execute('SELECT VERSION()') # 执行SQL语句
data = cursor.fetchone() # 获取第一条数据
print("Database Version:", data)
cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8") # 新建一个用来爬虫的数据库
db.close()
创建表
import pymysql
db = pymysql.connect(host="localhost", user="*", password="***", port=3306, db='spiders') # 直接连接到刚才新建的数据库
cursor = db.cursor()
sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
cursor.execute(sql)
db.close()
插入数据
使用一系列变量插入
import pymysql
id = '2099133201'
name = 'Foo.Bar'
age = 101
db = pymysql.connect(host='localhost', user='*', password='***', db='spiders')
cursor = db.cursor()
sql = 'INSERT INTO students (id, name, age) VALUES (%s, %s, %s)'
try:
cursor.execute(sql, (id, name, age))
db.commit()
except:
db.rollback()
db.close()
⚠️【注意】:
- 我们在execute的时候并不必使用python的方法把字符串提前构造好,可以在需要插入的地方使用
%s
,然后运行execute的时候把参数列表用一个元组传入即可,然而,这样做的重点是:避免引号的问题!。 - 注意MySQL的事务机制,对于数据库的 插入、更新、删除 操作的标准模版是:
try:
cursor.execute(‘更改操作语句’)
db.commit()
except:
db.rollback()
使用字典插入
import pymysql
db = pymysql.connect(host='localhost', user='*', password='***', db='spiders')
cursor = db.cursor()
data = {
'id': '2099133202',
'name': 'Fuzz.Buzz',
'age': '104'
}
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table} ({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
try:
if cursor.execute(sql, tuple(data.values())):
print("Success!")
db.commit()
except Exception as e:
print('Failed:\n', e)
db.rollback()
db.close()
在这个例子中如果不使用 %s
+ 传入 tuple 的那个方法动态构造语句,而直接用 values = ', '.join(data.values())
然后 cursor.execute(sql)
就会 Failed 了。
更新数据
简单的数据更新
sql = 'UPDATE students SET age = %s WHERE name = %s'
try:
cursor.execute(sql, (999, 'Foo.Bar'))
db.commit()
except:
db.rollback()
db.close()
更实用的字典更新
在实际数据抓取过程中,如果出现了重复数据,我们更希望的做法是更新数据:
如果重复则更新数据,如果数据不存在则插入数据,另外支持灵活的字典传值。
import pymysql
db = pymysql.connect(host='localhost', user='*', password='***', db='spiders')
cursor = db.cursor()
data = {
'id': '2099133203',
'name': 'SomeOne',
'age': '0'
}
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table} ({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys, values=values)
update = ', '.join([' {key} = %s'.format(key=key) for key in data])
sql += update
try:
if cursor.execute(sql, tuple(data.values()) * 2):
print("Success!")
db.commit()
except Exception as e:
print('Failed:\n', e)
db.rollback()
db.close()
删除数据
import pymysql
db = pymysql.connect(host='localhost', user='*', password='***', db='spiders')
cursor = db.cursor()
table = 'students'
condition = 'age > 200'
sql = 'DELETE FROM {table} WHERE {condition}'.format(table=table, condition=condition)
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
db.close()
查询数据
sql = 'SELECT * FROM students'
try:
cursor.execute(sql)
print('Count:', cursor.rowcount)
one = cursor.fetchone()
print('One:', one)
results = cursor.fetchall()
print('Results:', results)
print('Results Type:', type(results))
for row in results:
print(row)
except:
print('Error')
MongoDB
MongoDB 简介
MongoDB 是由 C++ 语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似 Json 对象,它的字段值可以包含其他文档,数组及文档数组,非常灵活。
在使用前要先确定 MongoDB 安装好,并已经开启了服务:
$ brew services start mongodb
$ sudo mongod
$ mongo
以上三条命令开启了 MongoDB 的服务,并打开客户端。
连接数据库
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
# client = pymongo.MongoClient('mongodb://localhost:27017/') 效果是一样的
指定数据库
db = client.test
# db = client['test'] 等价
指定集合
collection = db.students # 还是可以用`['']`来取
插入数据
插入数据有3种方法:
-
collection.insert()
:插入一个或多个数据,传入一个对象则插入一个,传入一个对象的list可以插入多个(官方不推荐使用); -
collection.insert_one()
:插入一个数据,传入一个dict; -
collection.insert_many()
:插入多个数据,传入一个dict的list;
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db.students
student1 = {
'id': '2099133201',
'name': 'Foo',
'age': 10,
'gender': 'male'
}
student2 = {
'id': '2099133202',
'name': 'Bar',
'age': 11,
'gender': 'male'
}
student3 = {
'id': '2099133203',
'name': 'Moo',
'age': 12,
'gender': 'female'
}
result0 = collection.insert_one(student1)
result1 = collection.insert_many([student2, student3])
print(result0, result0.inserted_id, sep='\n')
print(result1, result1.inserted_ids, sep='\n')
查询
查询使用如下方法:
-
find_one()
:查得单个结果 -
find()
:返回一个结果的生成器
如果查询的结果不存在,会返回 None
。
res_of_find = collection.find() # 得到所有数据
print('find:\n', res_of_find)
for i in res_of_find:
print(i)
res_of_findone = collection.find_one({'name': 'Foo'}) # 通过传入一组字典键值来查询
print('find_one:\n', res_of_findone)
如果要通过 MongoDB 为每条数据添加的 _id
属性来查询,需要这样做:
res_of_find_by_id = collection.find_one({'_id': ObjectId('5c78e0c6b92a4e5f17d70cfa')})
print('find by id:\n', res_of_find_by_id)
如果要查询 “年龄大于10” 的数据:
collection.find({'age': {'$gt': 10}})
这里查询条件的value变成了一个符号加运算值的字典,可用的操作如下:
符号 | 含义 | 示例 |
| 小于 |
|
| 大于 |
|
| 小于等于 |
|
| 大于等于 |
|
| 不等于 |
|
| 在范围内 |
|
| 不在范围内 |
|
还有多种查询方式:
collection.find({'name': {'$regex': '^M.*'}})
常用操作如下:
符号 | 含义 | 示例 | 示例含义 |
| 匹配正则 |
| name 以 M开头 |
| 属性是否存在 |
| name 属性存在 |
| 类型判断 |
| age 的类型为 int |
| 数字模操作 |
| 年龄模 5 余 0 |
| 文本查询 |
| text 类型的属性中包含 Mike 字符串 |
| 高级条件查询 |
| 自身粉丝数等于关注数 |
去掉 _id
:
Mongo 返回的数据中会有一项 _id
(Mongo自动加入的用来识别对象的字段),我们常不想看它 ,可以在查询时加入对结果的过滤:
collection.find(projection={'_id': False})
计数
要统计查询到的结果条数,可以直接调用查询结果的 count()
方法。
collection.find({'age': {'$gt': 0}}).count()
P.S. 一点题外话:
写到这里,又是一个熄灯后的美丽夜晚。调暗屏幕背光,小心翼翼地捧起那蠢蠢欲动的白色樱桃机械键盘,把它安置到光明之外,避开红绿蓝的纷争。趁着这五彩缤纷的黑暗,把下一行让人迷醉的代码,作为虔诚的礼物,送给饥饿良久的编译器。静待她施展动人的魔法,变出一串没有间断点的二进制位向量,在 0 和 1 的排列组合中,光影流转,似现星河鹭起,似有高山流水。在心驰神往的一瞬,不妨再分个神,欣赏开和关之间,一扇回到未来的古朴大门。
排序
我们可以通过调用 sort()
方法,传入用来排序的字段、升降序的标志即可对查询的结果排序。
-
pymongo.ASCENDING
:指定升序; -
pymongo.DESCENDING
:指定降序;
r = collection.find().sort('name', pymongo.ASCENDING)
for i in r:
print(i['name'])
偏移
偏移:偏移x个元素,即忽略(跳过)前面的x个元素,得到第x+1开始个元素。
这个操作调用查询结果的 skip()
方法。
r = collection.find().skip(2)
print([i for i in r])
更新
更新与插入类似,主要有三种方法:
-
update()
:更新一条或多条数据,不推荐使用 -
update_one()
:更新一条数据 -
update_many()
:更新多条数据
condition = {'name': 'Foo'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update(condition, {'$set': student})
print(result)
这里,我们先查询出了目标条目,然后把它修改成了新的数据,调用update,传入查询条件和一个代表操作的字典完成更新。
常用的操作有:
-
$set
:{'$set': value}
: 把value中有的属性更新成新的 -
$inc
:{'$inc': {'age': 1}}
: 把age加1
删除
也是有三个:remove()
,delete_one()
,delete_many()
collection.remove({'name': 'Kevin'})
更多
更完善的MongoDB还在官网等待我们去学习:官方文档🔗链接。
Redis
Redis 简介
Redis 是一个基于内存的高效的键值型非关系型数据库,存取效率极高,而且支持多种存储数据结构。
RedisPy 库提供两个类 Redis 和 StrictRedis 用于实现Redis 的命令操作。
推荐使用的是 StrictRedis,它实现了绝大部分Redis的命令,参数也一一对应。
Redis 主要用来兼容旧版本。
连接 Redis
首先需要确定正确在本地安装了Redis,并开启了服务。
使用 StrictRedis 连接
from redis import StrictRedis
redis = StrictRedis(host='localhost', port=6379, db=0, password=None)
# 这里使用的这几个参数和默认值是等效的,即可以直接使用 `StrictRedis()` 来代替。
redis.set('name', 'Foo') # 设置了一个键值对
print(redis.get('name')) # 获取一个数据
使用 ConnectionPool 连接
from redis import StrictRedis, ConnectionPool
pool = ConnectionPool(host='localhost', port=6379, db=0, password=None)
redis = StrictRedis(connection_pool=pool)
redis.set('age', 100)
print(redis.get('age'))
使用 ConnectionPool 还可以用 URL 来构建:
有三种可用的 URL 格式:
- Redis TCP 连接:
redis://[:password]@host:port/db
- Redis TCP+SSL 连接:
rediss://[:password]@host:port/db
- Redis Unix Socket连接:
unix://[:password]@/path/to/socket.sock?db=db
使用的姿势如下:
from redis import StrictRedis, ConnectionPool
# 注意多导入了一个ConnectionPool。
url = 'redis://@localhost:6379/0'
pool = ConnectionPool.from_url(url)
redis = StrictRedis(connection_pool=pool)
redis.set("test", 'test')
r = redis.get('test')
print(type(r), r, sep='\n')
Key 操作
这是一些常用的对 key 的操作,通过使用如 redis.exists('neme')
这样的语句来使用他们:
方法 | 作用 | 参数说明 | 示例 | 示例说明 | 示例结果 |
exists(name) | 判断一个key是否存在 | name: key名 | redis.exists(‘name’) | 是否存在name这个key | 1 |
delete(name) | 删除一个key | name: key名 | redis.delete(‘name’) | 删除name这个key | 1 |
type(name) | 判断key类型 | name: key名 | redis.type(‘name’) | 判断name这个key类型 | b’string’ |
keys(pattern) | 获取所有符合规则的key | pattern: 匹配规则 | redis.keys(‘n*’) | 获取所有以n开头的key | [b’name’] |
randomkey() | 获取随机的一个key | randomkey() | 获取随机的一个key | b’name’ | |
rename(src, dst) | 将key重命名 | src: 原key名 dst: 新key名 | redis.rename(‘name’, ‘nickname’) | 将name重命名为nickname | True |
dbsize() | 获取当前数据库中key的数目 | dbsize() | 获取当前数据库中key的数目 | 100 | |
expire(name, time) | 设定key的过期时间,单位秒 | name: key名 time: 秒数 | redis.expire(‘name’, 2) | 将name这key的过期时间设置2秒 | True |
ttl(name) | 获取key的过期时间,单位秒,-1为永久不过期 | name: key名 | redis.ttl(‘name’) | 获取name这key的过期时间 | -1 |
move(name, db) | 将key移动到其他数据库 | name: key名 db: 数据库代号 | move(‘name’, 2) | 将name移动到2号数据库 | True |
flushdb() | 删除当前选择数据库中的所有key | flushdb() | 删除当前选择数据库中的所有key | True | |
flushall() | 删除所有数据库中的所有key | flushall() | 删除所有数据库中的所有key | True |
String 操作
String 是 Redis 中最基本的Value储存方式,他的操作如下,
方法 | 作用 | 参数说明 | 示例 | 示例说明 | 示例结果 |
set(name, value) | 给数据库中key为name的string赋予值value | name: key名 value: 值 | redis.set(‘name’, ‘Bob’) | 给name这个key的value赋值为Bob | True |
get(name) | 返回数据库中key为name的string的value | name: key名 | redis.get(‘name’) | 返回name这个key的value | b’Bob’ |
getset(name, value) | 给数据库中key为name的string赋予值value并返回上次的value | name: key名 value: 新值 | redis.getset(‘name’, ‘Mike’) | 赋值name为Mike并得到上次的value | b’Bob’ |
mget(keys, *args) | 返回多个key对应的value | keys: key的列表 | redis.mget([‘name’, ‘nickname’]) | 返回name和nickname的value | [b’Mike’, b’Miker’] |
setnx(name, value) | 如果key不存在才设置value | name: key名 | redis.setnx(‘newname’, ‘James’) | 如果newname这key不存在则设置值为James | 第一次运行True,第二次False |
setex(name, time, value) | 设置可以对应的值为string类型的value,并指定此键值对应的有效期 | name: key名 time: 有效期 value: 值 | redis.setex(‘name’, 1, ‘James’) | 将name这key的值设为James,有效期1秒 | True |
setrange(name, offset, value) | 设置指定key的value值的子字符串 | name: key名 offset: 偏移量 value: 值 | redis.set(‘name’, ‘Hello’) redis.setrange(‘name’, 6, ‘World’) | 设置name为Hello字符串,并在index为6的位置补World | 11,修改后的字符串长度 |
mset(mapping) | 批量赋值 | mapping: 字典 | redis.mset({‘name1’: ‘Durant’, ‘name2’: ‘James’}) | 将name1设为Durant,name2设为James | True |
msetnx(mapping) | key均不存在时才批量赋值 | mapping: 字典 | redis.msetnx({‘name3’: ‘Smith’, ‘name4’: ‘Curry’}) | 在name3和name4均不存在的情况下才设置二者值 | True |
incr(name, amount=1) | key为name的value增值操作,默认1,key不存在则被创建并设为amount | name: key名 amount:增长的值 | redis.incr(‘age’, 1) | age对应的值增1,若不存在则会创建并设置为1 | 1,即修改后的值 |
decr(name, amount=1) | key为name的value减值操作,默认1,key不存在则被创建并设置为-amount | name: key名 amount:减少的值 | redis.decr(‘age’, 1) | age对应的值减1,若不存在则会创建并设置为-1 | -1,即修改后的值 |
append(key, value) | key为name的string的值附加value | key: key名 | redis.append(‘nickname’, ‘OK’) | 向key为nickname的值后追加OK | 13,即修改后的字符串长度 |
substr(name, start, end=-1) | 返回key为name的string的value的子串 | name: key名 start: 起始索引 end: 终止索引,默认-1截取到末尾 | redis.substr(‘name’, 1, 4) | 返回key为name的值的字符串,截取索引为1-4的字符 | b’ello’ |
getrange(key, start, end) | 获取key的value值从start到end的子字符串 | key: key名 start: 起始索引 end: 终止索引 | redis.getrange(‘name’, 1, 4) | 返回key为name的值的字符串,截取索引为1-4的字符 | b’ello’ |
List 操作
List 是 Redis 中 value 为列表的一种数据。
方法 | 作用 | 参数说明 | 示例 | 示例说明 | 示例结果 |
rpush(name, *values) | 在key为name的list尾添加值为value的元素,可以传多个 | name: key名 values: 值 | redis.rpush(‘list’, 1, 2, 3) | 给list这个key的list尾添加1、2、3 | 3,list大小 |
lpush(name, *values) | 在key为name的list头添加值为value的元素,可以传多个 | name: key名 values: 值 | redis.lpush(‘list’, 0) | 给list这个key的list头添加0 | 4,list大小 |
llen(name) | 返回key为name的list的长度 | name: key名 | redis.llen(‘list’) | 返回key为list的列表的长度 | 4 |
lrange(name, start, end) | 返回key为name的list中start至end之间的元素 | name: key名 start: 起始索引 end: 终止索引 | redis.lrange(‘list’, 1, 3) | 返回起始为1终止为3的索引范围对应的list | [b’3’, b’2’, b’1’] |
ltrim(name, start, end) | 截取key为name的list,保留索引为start到end的内容 | name:key名 start: 起始索引 end: 终止索引 | ltrim(‘list’, 1, 3) | 保留key为list的索引为1到3的元素 | True |
lindex(name, index) | 返回key为name的list中index位置的元素 | name: key名 index: 索引 | redis.lindex(‘list’, 1) | 返回key为list的列表index为1的元素 | b’2’ |
lset(name, index, value) | 给key为name的list中index位置的元素赋值,越界则报错 | name: key名 index: 索引位置 value: 值 | redis.lset(‘list’, 1, 5) | 将key为list的list索引1位置赋值为5 | True |
lrem(name, count, value) | 删除count个key的list中值为value的元素 | name: key名 count: 删除个数 value: 值 | redis.lrem(‘list’, 2, 3) | 将key为list的列表删除2个3 | 1,即删除的个数 |
lpop(name) | 返回并删除key为name的list中的首元素 | name: key名 | redis.lpop(‘list’) | 返回并删除名为list的list第一个元素 | b’5’ |
rpop(name) | 返回并删除key为name的list中的尾元素 | name: key名 | redis.rpop(‘list’) | 返回并删除名为list的list最后一个元素 | b’2’ |
blpop(keys, timeout=0) | 返回并删除名称为在keys中的list中的首元素,如果list为空,则会一直阻塞等待 | keys: key列表 timeout: 超时等待时间,0为一直等待 | redis.blpop(‘list’) | 返回并删除名为list的list的第一个元素 | [b’5’] |
brpop(keys, timeout=0) | 返回并删除key为name的list中的尾元素,如果list为空,则会一直阻塞等待 | keys: key列表 timeout: 超时等待时间,0为一直等待 | redis.brpop(‘list’) | 返回并删除名为list的list的最后一个元素 | [b’2’] |
rpoplpush(src, dst) | 返回并删除名称为src的list的尾元素,并将该元素添加到名称为dst的list的头部 | src: 源list的key dst: 目标list的key | redis.rpoplpush(‘list’, ‘list2’) | 将key为list的list尾元素删除并返回并将其添加到key为list2的list头部 | b’2’ |
Set 、Sorted Set操作
详见 Redis教程。
Hash 操作
Redis 中可以用name指定一个哈希表的名称,然后表内存储了各个键值对。
方法 | 作用 | 参数说明 | 示例 | 示例说明 | 示例结果 |
hset(name, key, value) | 向key为name的hash中添加映射 | name: key名 key: 映射键名 value: 映射键值 | hset(‘price’, ‘cake’, 5) | 向key为price的hash中添加映射关系,cake的值为5 | 1,即添加的映射个数 |
hsetnx(name, key, value) | 向key为name的hash中添加映射,如果映射键名不存在 | name: key名 key: 映射键名 value: 映射键值 | hsetnx(‘price’, ‘book’, 6) | 向key为price的hash中添加映射关系,book的值为6 | 1,即添加的映射个数 |
hget(name, key) | 返回key为name的hash中field对应的value | name: key名 key: 映射键名 | redis.hget(‘price’, ‘cake’) | 获取key为price的hash中键名为cake的value | 5 |
hmget(name, keys, *args) | 返回key为name的hash中各个键对应的value | name: key名 keys: 映射键名列表 | redis.hmget(‘price’, [‘apple’, ‘orange’]) | 获取key为price的hash中apple和orange的值 | [b’3’, b’7’] |
hmset(name, mapping) | 向key为name的hash中批量添加映射 | name: key名 mapping: 映射字典 | redis.hmset(‘price’, {‘banana’: 2, ‘pear’: 6}) | 向key为price的hash中批量添加映射 | True |
hincrby(name, key, amount=1) | 将key为name的hash中映射的value增加amount | name: key名 key: 映射键名 amount: 增长量 | redis.hincrby(‘price’, ‘apple’, 3) | key为price的hash中apple的值增加3 | 6,修改后的值 |
hexists(name, key) | key为namehash中是否存在键名为key的映射 | name: key名 key: 映射键名 | redis.hexists(‘price’, ‘banana’) | key为price的hash中banana的值是否存在 | True |
hdel(name, *keys) | key为namehash中删除键名为key的映射 | name: key名 key: 映射键名 | redis.hdel(‘price’, ‘banana’) | 从key为price的hash中删除键名为banana的映射 | True |
hlen(name) | 从key为name的hash中获取映射个数 | name: key名 | redis.hlen(‘price’) | 从key为price的hash中获取映射个数 | 6 |
hkeys(name) | 从key为name的hash中获取所有映射键名 | name: key名 | redis.hkeys(‘price’) | 从key为price的hash中获取所有映射键名 | [b’cake’, b’book’, b’banana’, b’pear’] |
hvals(name) | 从key为name的hash中获取所有映射键值 | name: key名 | redis.hvals(‘price’) | 从key为price的hash中获取所有映射键值 | [b’5’, b’6’, b’2’, b’6’] |
hgetall(name) | 从key为name的hash中获取所有映射键值对 | name: key名 | redis.hgetall(‘price’) | 从key为price的hash中获取所有映射键值对 | {b’cake’: b’5’, b’book’: b’6’, b’orange’: b’7’, b’pear’: b’6’} |
RedisDump
RedisDump 提供了 Redis 数据的导入和导出功能。
RedisDump 提供两个可执行命令:
redis-dump
用于 导出 数据;详见redis-dump -h
- e.g.
$ redis-dump -u :foobared@localhost:6379 > ./redis_data.jl
redis-load
用于 导入 数据;详见redis-load -h
- e.g.
$ redis-load -u :foobared@localhost:6379 < redis_data.json
- 等价于
$ cat redis_data.json | redis-load -u :foobared@localhost:6379