Python爬虫学习笔记-第二十四课(Redis数据类型+Python与redis的交互)

1. Redis 五大数据类型

1.1 String类型

一个key对应一个value,value的类型为string。
在终端中的使用如下:

127.0.0.1:6379> set name test # key:name value:test
OK
127.0.0.1:6379> get name # 获取key="name"的值
"test"
127.0.0.1:6379> mset age 18 home shanghai # 设置多个key
OK
127.0.0.1:6379> mget age home # 获取多个key的值
1) "18"
2) "shanghai"
127.0.0.1:6379> append name 123 # 追加name的值
(integer) 7 # 不会直接返回结果, 返回name的长度
127.0.0.1:6379> get name # 再次查看name的值
"test123"
127.0.0.1:6379> strlen name # 用命令查询name的长度
(integer) 7
127.0.0.1:6379> del name # 删除key=name的数据
(integer) 1
127.0.0.1:6379> keys * # 查看现有的key
1) "age"
2) "home"
127.0.0.1:6379> incr age # age加1
(integer) 19
127.0.0.1:6379> incr age # age加1
(integer) 20
127.0.0.1:6379> incrby age 2 # incrby key num, 让对应的key值加任意数
(integer) 22
127.0.0.1:6379> decr age # age减1
(integer) 21
127.0.0.1:6379> decr age # age减1
(integer) 20
127.0.0.1:6379> decrby age 2 # age减2
(integer) 18
127.0.0.1:6379> getrange home 0 3 # 获取某一部分元素,索引为3的字母n也会被获取,与Python语言不同
"shan"
127.0.0.1:6379> getrange home 0 -1 # 获取所有的元素
"shanghai"
127.0.0.1:6379> setrange home 0 abc # 从第几个元素开始进行替换,若替换的元素大于被替换的元素会依次往后进行替换
(integer) 8
127.0.0.1:6379> get home # 查看替换后的home
"abcnghai"

1.2 List类型

Redis列表是简单的字符串列表,按照插入顺序排序。
用户可以添加一个元素到列表的头部(左边)或者尾部(右边)。
在终端中的使用如下:

127.0.0.1:6379> lpush li 1 2 3 4 5 # 从左往右推
(integer) 5
127.0.0.1:6379> lrange li 0 -1 # 查看列表li
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> rpush ls 1 2 3 4 5 # 从右往左推
(integer) 5
127.0.0.1:6379> lrange ls 0 -1 # 查看列表ls
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lpop li # 移除li最左边的元素5
"5"
127.0.0.1:6379> rpop li # 移除li最右边的元素1
"1"
127.0.0.1:6379> lrange li 0 -1 # 再次查看列表li
1) "4"
2) "3"
3) "2"
127.0.0.1:6379> lindex ls 2 # 根据下标获取元素
"3"
127.0.0.1:6379> lpush li 4 
(integer) 4
127.0.0.1:6379> lrem li 2 4 # 删除li列表中2个4
(integer) 2
127.0.0.1:6379> lrange li 0 -1
1) "3"
2) "2"
127.0.0.1:6379> rpoplpush li ls
"2"
127.0.0.1:6379> lrange ls 0 -1 # 将li最后一个元素压入到ls中第一个元素
1) "2"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
127.0.0.1:6379> lset ls 0 0 # 将ls中第一个元素替换成0
OK
127.0.0.1:6379> linsert ls before 0 -1 # 在元素0之前插入-1
(integer) 7
127.0.0.1:6379> linsert ls after 5 6 # 在元素5之后插入6
(integer) 8
127.0.0.1:6379> lrange ls 0 -1
1) "-1"
2) "0"
3) "1"
4) "2"
5) "3"
6) "4"
7) "5"
8) "6"
127.0.0.1:6379> ltrim ls 1 4 # 截取ls中1 - 4范围内的元素在重新赋值给ls
OK
127.0.0.1:6379> lrange ls 0 -1
1) "0"
2) "1"
3) "2"
4) "3"

1.3 Hash类型

hash是⼀个键值对集合;
hash是⼀个string类型的field和value的映射表,hash特别适合存储对象。
简单理解,hash类型的值就是一个字典,有属于自己的key-value。
在终端中的使用如下:

127.0.0.1:6379> hset user id 1 # 添加key="user"的hash数据,其值为{id:1}
(integer) 1
127.0.0.1:6379> hget user id # 获取user中key=id的值
"1"
127.0.0.1:6379> hmset user age 18 name jerry # 设置多个值
OK
127.0.0.1:6379> hgetall user # 获取多个值,会把k和v都打印
1) "id"
2) "1"
3) "age"
4) "18"
5) "name"
6) "jerry"
127.0.0.1:6379> hdel user id # 删除user中的id
(integer) 1
127.0.0.1:6379> hgetall user
1) "age"
2) "18"
3) "name"
4) "jerry"
127.0.0.1:6379> hdel user age name # 删除user多个值
(integer) 2
127.0.0.1:6379> hgetall user
(empty list or set)
127.0.0.1:6379> hmset user name jerry age 18 gender true
OK
127.0.0.1:6379> hmget user name age gender # 获取多个值,只打印v
1) "jerry"
2) "18"
3) "true"
127.0.0.1:6379> hexists user id # 判断某个值是否存在,0——不存在,1——存在
(integer) 0
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hkeys user # 获取user的值的所有key
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379> hvals user # 获取user的值的所有value
1) "jerry"
2) "18"
3) "true"

1.4 Set类型

set是string类型的无序不重复集合。
在终端中的使用如下:

127.0.0.1:6379> sadd s1 1 2 2 3 4 4 5 # 添加数据
(integer) 5
127.0.0.1:6379> smembers s1 # 打印集合s1, 不要添加0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> sismember s1 1 # 判断某个值是否存在,0——不存在,1——存在
(integer) 1
127.0.0.1:6379> sismember s1 6
(integer) 0
127.0.0.1:6379> scard s1 # 返回元素的个数
(integer) 5
127.0.0.1:6379> srem s1 1 # 删除1这个元素
(integer) 1
127.0.0.1:6379> smembers s1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> srandmember s1 # 随机取值
"3"
127.0.0.1:6379> srandmember s1
"5"
127.0.0.1:6379> spop s1 # 随机删除s1中的元素
"2"
127.0.0.1:6379> sadd s2 6 7 8 9 10
(integer) 5
127.0.0.1:6379> smove s1 s2 3 # 把s1中的3移动到s2里面
(integer) 1
127.0.0.1:6379> smembers s1 
1) "4"
2) "5"
127.0.0.1:6379> smembers s2
1) "3"
2) "6"
3) "7"
4) "8"
5) "9"
6) "10"
127.0.0.1:6379> sadd s1 6 7 8 # 给s1添加三个元素
(integer) 3
127.0.0.1:6379> sdiff s1 s2 # s1与s2的差集
1) "4"
2) "5"
127.0.0.1:6379> sdiff s2 s1
1) "3"
2) "9"
3) "10"

1.5 Zset类型

有序不重复,每个元素都会关联一个分数,通过分数来对成员进行一个从小到大的排序。
在终端中的使用如下:

127.0.0.1:6379> zadd z1 70 juran 50 tony 80 cheney 60 jerry 90 amy # 添加元素(需要分数 必填的)
(integer) 5
127.0.0.1:6379> zrange z1 0 -1 # 不带分数,打印集合z1
1) "tony"
2) "jerry"
3) "juran"
4) "cheney"
5) "amy"
127.0.0.1:6379> zrange z1 0 -1 withscores # 带分数,打印集合z1
 1) "tony"
 2) "50"
 3) "jerry"
 4) "60"
 5) "juran"
 6) "70"
 7) "cheney"
 8) "80"
 9) "amy"
10) "90"
127.0.0.1:6379> zrangebyscore z1 60 70 # 根据开始和结束的分数来查询
1) "jerry"
2) "juran"
127.0.0.1:6379> zrangebyscore z1 60 (90 # 根据分数60开始查询到90结束,但不包括90
1) "jerry"
2) "juran"
3) "cheney"
127.0.0.1:6379> zrangebyscore z1 (60 (90 # 根据分数60开始查询到90结束,但不包括60、90
1) "juran"
2) "cheney"
127.0.0.1:6379> zrangebyscore z1 60 90 limit 1 2 # 根据分数60开始查询到90结束,并返回索引为1和2的值
1) "juran"
2) "cheney"
127.0.0.1:6379> zrem z1 tony # 不需要按照分数来删除
(integer) 1
127.0.0.1:6379> zcard z1 # 返回集合中元素的数量
(integer) 4
127.0.0.1:6379> zcount z1 60 90 # 符合条件的个数, 需要加上分数
(integer) 4
127.0.0.1:6379> zrank z1 jerry # 返回元素的下标索引
(integer) 0

2. Python和redis的交互

2.1 基本思路

第一步:安装redis,pip install redis
第二步:链接redis数据库、地址、端口号;
第三步:实现逻辑。
关键在于如何去把值(数据)添加到数据库中,数据库中的值如何取出来。

2.2 示例代码

import redis

class InteractWithRedis():
    def __init__(self):
        self.r = redis.StrictRedis(host='127.0.0.1', port=6379, decode_responses=True)

    # 设置字符串值
    def str_set(self, k, v):
        self.r.set(k, v)

    # 取字符串值
    def str_get(self, k):
        return self.r.get(k)

    # 设置字符串多个值
    def str_mset(self, dict_data):
        self.r.mset(dict_data)

    # 取字符串多个值
    def str_mget(self, keys):
        return self.r.mget(keys)

    # 列表左边插值
    def list_lpush(self, li_name, values):
        for value in values:
            self.r.lpush(li_name, value)

    # 列表右边插值
    def list_rpush(self, li_name, values):
        for value in values:
            self.r.rpush(li_name, value)

    # 列表左边弹出值
    def list_lpop(self, li_name):
        self.r.lpop(li_name)

    # 列表右边弹出值
    def list_rpop(self, li_name):
        self.r.rpop(li_name)

    # 列表范围取值
    def list_lrange(self, li_name, start, end):
        return self.r.lrange(li_name, start, end)

    # 集合添加数据
    def set_sadd(self, set_name, values):
        for value in values:
            self.r.sadd(set_name, value)

    # 判断集合中是否存在值
    def set_sismeber(self, set_name, value):
        return self.r.sismember(set_name, value)

    # 集合随机删除数据
    def set_pop(self, set_name):
        return self.r.spop(set_name)

    # 返回集合元素
    def set_smembers(self, set_name):
        return self.r.smembers(set_name)

    # 哈希添加值
    def hash_hset(self, hash_name, dict_datas):
        for key, value in dict_datas.items():
            self.r.hset(hash_name, key, value)

    # 取哈希表的值
    def hash_hgetall(self, hash_name):
        return self.r.hgetall(hash_name)

    # 判断集合中是否存在值
    def hash_hexists(self, hash_name, key):
        return self.r.hexists(hash_name, key)

if __name__ == '__main__':
    s = InteractWithRedis()
    # 字符串相关操作
    s.str_set('name', 'tom')
    print(s.str_get('name'))
    s.str_mset({'age': '18', 'gender': 'male'})
    print(s.str_mget(['age', 'gender']))
    # 列表相关操作
    s.list_lpush('li', ['3', '4', '5'])
    s.list_rpush('li', ['1', '2'])
    s.list_lpop('li')
    s.list_rpop('li')
    print('li = ', s.list_lrange('li', 0, -1))
    # 集合有关操作
    s.set_sadd('s1', ['a', 'b', 'c', 'd'])
    print('c is in s1: ', s.set_sismeber('s1', 'c'))
    print('s1 pop: ', s.set_pop('s1'))
    print(s.set_smembers('s1'))
    # hash有关操作
    s.hash_hset('user', {'id': '123', 'name': 'Jerry'})
    print('id is in user: ', s.hash_hexists('user', 'id'))
    print(s.hash_hgetall('user'))

运行结果:

tom
['18', 'male']
li =  ['4', '3', '4', '3', '4', '3', '4', '3', '4', '3', '1', '1', '1', '1', '1']
c is in s1:  True
s1 pop:  b
{'c', 'a', 'd'}
id is in user:  True
{'id': '123', 'name': 'Jerry'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值