Python脚本之操作Redis【二】

本文为博主原创,未经授权,严禁转载及使用。
本文链接:https://blog.csdn.net/zyooooxie/article/details/95352530

之前分享过一篇 操作Redis【一】 ,主要写的是 String;这一次来分享下 Hash、List、Set的;

个人博客:https://blog.csdn.net/zyooooxie

Redis命令【二】

先前说过一个学习命令的网站,再加个 https://redis.io/commands

  1. Hash:

HGET KEY_NAME field
HGETALL KEY_NAME
HEXISTS KEY_NAME field
HLEN KEY_NAME

HSET KEY_NAME field value
HDEL KEY_NAME field

HKEYS KEY_NAME
HVALS KEY_NAME

HMSET KEY_NAME field value
HMGET KEY_NAME field

  1. List:

LINDEX KEY_NAME index
LLEN KEY_NAME
LRANGE KEY_NAME start stop

LSET KEY_NAME index new_VALUE
LINSERT KEY_NAME BEFORE | AFTER pivot new_VALUE

LPUSH KEY_NAME VALUE1 VALUE2 【插入到 列表 的表头】
RPUSH KEY_NAME VALUE1 VALUE2 【插入到列表 的表尾】

LPOP KEY_NAME
RPOP KEY_NAME

LREM KEY_NAME count VALUE

  1. Set:

SCARD KEY_NAME

SMEMBERS KEY_NAME
SISMEMBER KEY_NAME member

SADD KEY_NAME member1 member2

SREM KEY_NAME member1 member2

代码

"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""


def test_hash():
    # https://redis.io/commands/?group=hash

    r = redis_connect()
    test_hash_ = 'test:zyooooxie:hash'

    # HGETALL key
    # 返回 key 中,所有的域和值

    # 返回值: 以列表形式返回哈希表的域和域的值。 若 key 不存在,返回空列表。
    # 在返回值里,紧跟每个域名(field __name)之后是域的值(init_value),所以返回值的长度是哈希表大小的两倍。

    # hgetall() : Return a Python dict of the hash's name/value pairs

    Log.info(r.hgetall(gl_real_hash))
    Log.info(r.hgetall(test_hash_))

    Log.info(r.hgetall(gl_no_exist))  # 不存在的key
    assert len(r.hgetall(gl_no_exist)) == 0  # 空字典

    Log.info('----')

    hash_field = 'name'
    hash_field_2 = 'blog'

    # HEXISTS key field
    # 查看 key 中,给定域 field 是否存在。

    # 返回值: 如果哈希表含有给定域,返回 1 。  如果哈希表不含有给定域,或 key 不存在,返回 0 。

    # hexists(): Returns a boolean indicating if ``key`` exists within hash ``__name``

    Log.info(r.hexists(gl_real_hash, hash_field))  # True
    Log.info(r.hexists(gl_real_hash, hash_field_2))  # False

    Log.info(r.hexists(gl_no_exist, hash_field))  # False

    Log.info('----')

    # HGET key field
    # 返回 key 中给定域 field 的值

    # 返回值: 给定域的值。 当给定域不存在或是给定 key 不存在时,返回 nil 。

    # hget(): Return the init_value of ``key`` within the hash ``__name``

    Log.info(r.hget(name=gl_real_hash, key=hash_field))
    Log.info(r.hget(name=gl_real_hash, key=hash_field_2))  # None

    Log.info(r.hget(name=gl_no_exist, key=hash_field))  # None

    Log.info('----')

    # HKEYS key
    # 返回哈希表 key 中的所有域

    # 返回值: 一个包含哈希表中所有域的表。 当 key 不存在时,返回一个空表。

    # hkeys(): Return the list of keys within hash ``__name``

    Log.info(r.hkeys(gl_real_hash))
    Log.info(r.hkeys(gl_no_exist))  # 空list

    Log.info('----')

    # HVALS key
    # 返回哈希表 key 中所有域的值。

    # 返回值: 一个包含哈希表中所有值的表。 当 key 不存在时,返回一个空表。

    # hvals(): Return the list of values within hash ``__name``

    Log.info(r.hvals(gl_real_hash))
    Log.info(r.hvals(gl_no_exist))  # 空list

    Log.info('----')

    hash_field1 = 'NAME_'
    hash_value1 = 'zy'
    hash_field2 = 'BLOG_'
    hash_value2 = 'https://blog.csdn.net/zyooooxie'

    # HSET key field value [field value ...]
    # 将 key 中的域 field 的值设为 init_value 。
    # 如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。 如果域 field 已经存在于哈希表中,旧值将被覆盖。

    # 返回值: 如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1。 如果哈希表中域 field 已经存在,且旧值已被新值覆盖,返回 0。

    # hset(): Set ``key`` to ``init_value`` within hash ``__name``, ``mapping`` accepts a dict of key/init_value pairs that will be added to hash ``__name``
    # 2种用法选1种,不可多传,也必须要传参数

    r.delete(test_hash_)
    Log.info(r.hset(test_hash_, mapping={hash_field2: hash_value2}))  # 是1
    Log.info(r.hgetall(test_hash_))

    Log.info(r.hset(test_hash_, mapping={hash_field2: hash_value2 * 2}))  # [再次设置] 是0
    Log.info(r.hgetall(test_hash_))

    Log.info(r.hset(test_hash_, key=hash_field1, value=hash_value1))  # 是1
    Log.info(r.hgetall(test_hash_))

    Log.info(r.hset(test_hash_, key=hash_field1, value=hash_value1 * 2))  # [再次设置] 是0
    Log.info(r.hgetall(test_hash_))

    # Log.info(r.hset(test_hash_))            # redis.exceptions.DataError: 'hset' with no key init_value pairs

    Log.info(r.unlink(test_hash_))

    Log.info('Starting with Redis version 4.0.0: Accepts multiple field and value arguments.')
    Log.info(r.hset(test_hash_, mapping={hash_field2: hash_value2,
                                         hash_field1: hash_value1}))
    Log.info(r.hgetall(test_hash_))

    Log.info(r.unlink(test_hash_))
    Log.info(r.hset(test_hash_, mapping={hash_field2: hash_value1}, key=hash_field1,
                    value=hash_value2))
    Log.info(r.hgetall(test_hash_))

    Log.info('----')

    # HDEL key field [field ...]
    # 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

    # 返回值: 被成功移除的域的数量,不包括被忽略的域。

    # hdel(): Delete ``keys`` from hash ``__name``

    Log.info(r.hdel(test_hash_, hash_field2))  # 1
    Log.info(r.hgetall(test_hash_))

    Log.info(r.hdel(test_hash_, hash_field1, hash_field2))  # 成功得1,不存在的域被忽略
    Log.info(r.hgetall(test_hash_))

    Log.info(r.hdel(test_hash_, hash_field1, hash_field2, hash_field * 2))  # 0
    Log.info(r.hgetall(test_hash_))

    Log.info(r.hdel(gl_no_exist, hash_field1))  # 不存在的key:0

    Log.info('----')

    hash_field3 = 'f3'
    hash_value3 = 333.33
    hash_field4 = 'f4'
    hash_value4 = '(4444)(4444)'
    hash_field5 = 'f5'
    hash_value5 = 55555

    # HMSET key field value [field value ...]
    # 同时将多个 field-init_value (域-值)对设置到哈希表 key 中
    # 此命令会覆盖哈希表中已存在的域。 如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。

    # 返回值: 如果命令执行成功,返回 OK 。 当 key 不是哈希表(hash)类型时,返回一个错误。

    # hmset(): Set key to init_value within hash ``__name`` for each corresponding key and init_value from the ``mapping`` dict.

    r.delete(test_hash_)
    Log.info(r.hmset(test_hash_, mapping={hash_field3: hash_value3, hash_field4: hash_value4}))  # True
    Log.info(r.hgetall(test_hash_))

    Log.info(r.hmset(test_hash_, mapping={hash_field5: hash_value5, hash_field4: hash_value4 * 2}))
    Log.info(r.hgetall(test_hash_))

    # Redis.hmset() is deprecated. Use Redis.hset() instead.

    Log.info('----')

    # HMGET key field [field ...]
    # 返回哈希表 key 中,一个或多个给定域的值。如果给定的域不存在于哈希表,那么返回一个 nil 值。

    # 返回值:  一个包含多个给定域的关联值的表,表值的排列顺序和给定域参数的请求顺序一样。

    # hmget(): Returns a list of values ordered identically to ``keys``

    Log.info(r.hmget(test_hash_, keys=[hash_field * 3, hash_field5, hash_field4, hash_field4]))

    Log.info(r.hmget(gl_no_exist, keys=[hash_field3, hash_field5, hash_field4]))  # 不存在的 key - [None, None, None]

    Log.info('----')

    # HLEN key
    # 返回哈希表 key 中域的数量。

    # 返回值:  哈希表中域的数量。  当 key 不存在时,返回 0。

    # hlen(): Return the number of elements in hash ``__name``

    Log.info(r.hlen(test_hash_))

    Log.info(r.hlen(gl_no_exist))  # 0

    r.expire(test_hash_, 600)

    r.close()
    
"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""


def test_list():
    # https://redis.io/commands/?group=list

    r = redis_connect()
    test_list_ = 'test:zyooooxie:list'

    # RPUSH key element [element ...]
    # 将一个或多个值 init_value 插入到列表 key 的表尾(最右边)。
    # 如果有多个 init_value 值,那么各个 init_value 值按从左到右的顺序依次插入到表尾。
    # 如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。
    # 当 key 存在但不是列表类型时,返回一个错误。

    # 返回值: 执行 RPUSH 操作后,表的长度。

    # rpush(): Push ``values`` onto the tail of the list ``__name``

    r.delete(test_list_)
    Log.info(r.rpush(test_list_, '1f', '2s', '3d', '4e'))  # 新插入元素在右侧,如果list不存在则新建
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info(r.rpush(test_list_, '1f1111', '2s2222'))  # 元素一个接一个地插入到列表的尾部,从最左边的元素到最右边的元素
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info(r.rpush(test_list_, '3d3333', '1f1111', '1f1111'))  # 重复添加
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info('----')

    # LINDEX key index
    # 返回列表 key 中,下标为 index 的元素

    # 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
    # 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
    # 如果 key 不是列表类型,返回一个错误。

    # 返回值: 列表中下标为 index 的元素。 如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。

    # lindex(): Return the item from list ``__name`` at position ``index``

    Log.info(r.lindex(test_list_, 0))
    Log.info(r.lindex(test_list_, 300))  # index超了,返回的None

    # Negative indexes are supported and will return an item at the end of the list
    Log.info(r.lindex(test_list_, -1))
    Log.info(r.lindex(test_list_, -500))  # index超了,返回的None

    Log.info(r.lindex(gl_no_exist, 0))  # key不存在,返回的None

    Log.info('----')

    # LLEN key
    # 返回列表 key 的长度。
    # 如果 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。

    # 返回值: 列表 key 的长度。

    # llen(): Return the length of the list ``__name``

    Log.info(r.llen(test_list_))
    Log.info(r.llen(gl_real_list))

    Log.info(r.llen(gl_no_exist))  # key不存在,返回的0

    # Log.info(r.llen(gl_real_string))  # WRONGTYPE Operation against a key holding the wrong kind of value

    Log.info('----')

    # LINSERT key <BEFORE | AFTER> pivot element
    # 将值 element 插入到列表 key 当中,位于值 pivot 之前或之后。

    # 当 pivot 不存在于列表 key 时,不执行任何操作。 当 key 不存在时, key 被视为空列表,不执行任何操作。
    # 如果 key 不是列表类型,返回一个错误。

    # 返回值: 如果命令执行成功,返回插入操作完成之后,列表的长度。如果没有找到 pivot ,返回 -1 。如果 key 不存在或为空列表,返回 0 。

    # linsert(): Insert ``init_value`` in list ``__name`` either immediately before or after  [``where``] ``refvalue``
    # Returns the new length of the list on success or -1 if ``refvalue`` is not in the list.

    Log.info(r.linsert(gl_no_exist, 'before', 'zyooooxie', 'https://blog.csdn.net/zyooooxie'))

    Log.info(r.linsert(test_list_, 'BEFORE', 'zyooooxie', 'https://blog.csdn.net/zyooooxie'))

    r.rpush(test_list_, 'new0')
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info(r.linsert(test_list_, 'BEFORE', 'new0', 'BEFORE-前面'))  # BEFORE(前)或AFTER(后)
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info(r.linsert(test_list_, 'AFTER', 'new0', 'AFTER-后面'))
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info('----')

    # LRANGE key start stop
    # 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。

    # 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
    # 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

    # LRANGE 命令 是 (闭区间);

    # 超出范围的下标值不会引起错误。
    # 如果 start 下标比 列表的结束 还要大,那么 LRANGE 返回一个空列表。
    # 如果 stop 下标比 列表的结束 还要大,Redis will treat it like the last element of the list.

    # 返回值: 一个列表,包含指定区间内的元素。 an empty array if the key doesn't exist.

    # lrange(): Return a slice of the list ``__name`` between position ``start`` and ``end``
    # ``start`` and ``end`` can be negative numbers

    Log.info(r.lrange(gl_no_exist, 0, -1))  # key不存在,返回[]

    Log.info(r.lrange(test_list_, 0, -1))  # 所有元素
    Log.info(r.lrange(test_list_, 0, 2))
    Log.info(r.lrange(test_list_, -16, -5))
    Log.info(r.lrange(test_list_, -8, 7))

    Log.info(r.lrange(test_list_, 16, 5))  # stop小于start,返回[]
    Log.info(r.lrange(test_list_, -16, -25))  # stop小于start,返回[]

    Log.info(r.lrange(test_list_, 5, 200))  # stop超了 最大index
    Log.info(r.lrange(test_list_, 200, 300))  # start超了 最大index

    Log.info('----')

    # LPUSH key element [element ...]
    # 将一个或多个值 init_value 插入到列表 key 的表头。

    # 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头。
    # 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
    # 当 key 存在但不是列表类型时,返回一个错误。

    # 返回值: 执行 LPUSH 命令后,列表的长度。

    r.delete(test_list_)

    Log.info(r.lpush(test_list_, 'zyooooxie'))
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info(r.lpush(test_list_, 'zyoooo', 'zy', 'zyooooxie', '123', 'zyooooxie', 456, 'zyooooxie', 789.001))
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info(r.lpush(test_list_, 'zyooooxie'))
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info('----')

    # LPOP key [count]
    # 移除并返回列表 key 的头元素。

    # 返回值: 列表的头元素。 当 key 不存在时,返回 nil 。

    # lpop(): Remove and return the first item of the list ``__name``

    Log.info(r.lpop(gl_no_exist))

    Log.info(r.lrange(test_list_, 0, -1))
    Log.info(r.lpop(test_list_))

    Log.info(r.lrange(test_list_, 0, -1))
    Log.info(r.lpop(test_list_))

    Log.info('https://redis.io/commands/lpop')
    # Redis version >= 6.2.0: Added the `count` argument.

    Log.info('----')

    # RPOP key [count]
    # 移除并返回列表 key 的尾元素。

    # 返回值:列表的尾元素。 当 key 不存在时,返回 nil 。

    Log.info(r.rpop(gl_no_exist))

    Log.info(r.lrange(test_list_, 0, -1))
    Log.info(r.rpop(test_list_))

    Log.info(r.lrange(test_list_, 0, -1))

    # Redis version >= 6.2.0: Added the `count` argument.

    Log.info('----')

    # LREM key count element
    # 根据参数 count 的值,移除列表中与参数 init_value 相等的元素。

    # count 的值可以是以下几种:
    # count > 0 : 从表头开始向表尾搜索,移除与 init_value 相等的元素,数量为 count 。
    # count < 0 : 从表尾开始向表头搜索,移除与 init_value 相等的元素,数量为 count 的绝对值。
    # count = 0 : 移除表中所有与 init_value 相等的值。

    # 返回值: 被移除元素的数量。 因为不存在的 key 被视作空表(empty list),所以当 key 不存在时, LREM 命令总是返回 0 。

    Log.info(r.lrem(gl_no_exist, count=0, value='zyooooxie'))  # key 不存在

    Log.info(r.lrem(gl_real_list, count=0, value='zyooooxie'))  # 没有这个value

    # 移除从表头到表尾
    Log.info(r.lrem(test_list_, count=2, value='zyooooxie'))  # 两个元素被移除,还剩一个
    Log.info(r.lrange(test_list_, 0, -1))

    # 移除从表尾到表头
    Log.info(r.lrem(test_list_, count=-10, value='zyooooxie'))  # 实际只移除1个
    Log.info(r.lrange(test_list_, 0, -1))

    # 移除表中所有的

    Log.info(r.lpush(test_list_, 'zyooooxie', 'zyooooxie'))
    Log.info(r.rpush(test_list_, 'zyooooxie', '123', 'zyooooxie', 'zyooooxie'))
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info(r.lrem(test_list_, count=0, value='zyooooxie'))
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info('----')

    # LSET key index element
    # 将列表 key 下标为 index 的元素的值设置为 value 。
    # 当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。

    # 返回值: 操作成功返回 ok ,否则返回错误信息。

    # lset(): Set ``position`` of list ``__name`` to ``init_value``

    Log.info(r.lset(test_list_, 1, 'new-1新值'))  # True
    Log.info(r.lrange(test_list_, 0, -1))

    Log.info(r.lset(test_list_, -1, '新值'))
    Log.info(r.lrange(test_list_, 0, -1))

    # r.lset(test_list_, 2222, 'new-4')  # 超出范围 redis.exceptions.ResponseError: index out of range
    # Log.info(r.lset(gl_no_exist, 0, 'zyooooxie'))  # redis.exceptions.ResponseError: no such key

    r.expire(test_list_, 600)

    r.close()

"""
@blog: https://blog.csdn.net/zyooooxie
@qq: 153132336
@email: zyooooxie@gmail.com
"""


def test_set():
    # https://redis.io/commands/?group=set

    r = redis_connect()
    test_set_ = 'test:zyooooxie:set'

    # SADD key member [member ...]
    # 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
    # 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。 当 key 不是集合类型时,返回一个错误。

    # 返回值: 被添加到集合中的 新元素的数量,不包括被忽略的元素。

    # sadd(): Add ``init_value(write_pkl)`` to set ``__name``

    r.delete(test_set_)
    Log.info(r.sadd(test_set_, 'zyooooxie', '123', 'abc', 'zyooooxie'))
    # Log.info(r.sadd(test_set_, 'zyooooxie'))
    Log.info(r.smembers(test_set_))

    # 重复元素 会被忽略
    Log.info(r.sadd(test_set_, 'zyooooxie', '123', 'zyooooxie123', 'https://blog.csdn.net/zyooooxie', '123', 456))
    Log.info(r.smembers(test_set_))

    Log.info(r.sadd(test_set_, '456', 'https://blog.csdn.net/zyooooxie', 'zyooooxie', 789.789, 132, '132'))
    Log.info(r.smembers(test_set_))

    Log.info('----')

    # SMEMBERS key
    # 返回集合 key 中的所有成员。
    # 不存在的 key 被视为空集合。

    # 返回值: 集合中的所有成员。

    # smembers(): Return all members of the set ``__name``

    Log.info(r.smembers(gl_no_exist))  # 不存在的key

    Log.info(r.smembers(test_set_))

    Log.info(r.sadd(test_set_, *['new2222', 2222]))
    Log.info(r.smembers(test_set_))

    Log.info('----')

    # SCARD key
    # 返回 集合中元素的数量

    # 返回值: 集合的基数。 当 key 不存在时,返回 0 。

    # scard(): Return the number of elements in set ``__name``

    Log.info(r.scard(gl_no_exist))

    Log.info(r.scard(test_set_))

    r.sadd(test_set_, 'new', 'new2', 'new22', 'new222')
    Log.info(r.scard(test_set_))

    Log.info('----')

    # SISMEMBER key member
    # 判断 member 元素是否集合 key 的成员。

    # 返回值:如果 member 元素是集合的成员,返回 1 。 如果 member 元素不是集合的成员,或 key 不存在,返回 0 。

    # sismember(): Return a boolean indicating if ``init_value`` is a member of set ``__name``

    Log.info(r.sismember(test_set_, 'zyooooxie'))
    Log.info(r.sismember(test_set_, 'xie'))

    Log.info(r.sismember(gl_no_exist, 'zyooooxie'))  # False

    Log.info('----')

    # SREM key member [member ...]
    # 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。 当 key 不是集合类型,返回一个错误。

    # 返回值:   被成功移除的元素的数量,不包括被忽略的元素。

    # srem(): Remove ``values`` from set ``__name``

    Log.info(r.srem(test_set_, 'zyooooxie'))
    Log.info(r.smembers(test_set_))

    Log.info(r.srem(test_set_, 'zyooooxie', 'new2222', 'zyooooxie', '不存在的', 'new'))
    Log.info(r.smembers(test_set_))

    Log.info(r.srem(test_set_, '不存在的123'))
    Log.info(r.smembers(test_set_))

    # If key does not exist, it is treated as an empty set and this command returns 0.
    Log.info(r.srem(gl_no_exist, 'zyooooxie'))

    r.expire(test_set_, 600)

    r.close()

本文链接:https://blog.csdn.net/zyooooxie/article/details/95352530

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值