Python脚本之操作Redis【一】

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

因为最近的需求常常接触到Redis,我就把自己学习、使用的 做些分享;

这是我学习数据库知识: https://blog.csdn.net/zyooooxie/category_10994045.html

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

Redis

Redis:Remote DIctionary Server,是一个高性能的(key / value)分布式内存数据库基于内存运行,并支持持久化的NoSQL数据库。

Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储;

Redis命令

在我的日常工作中,最常用到的有:

  1. 服务器相关

SELECT index 【默认使用 0 号数据库;默认16个】
INFO
DBSIZE

  1. Key

KEYS key* 【KEYS命令 不能用于生产环境】
TYPE KEY_NAME
DEL KEY_NAME 【DEL KEY_NAME1 KEY_NAME2 KEY_NAME3】
EXPIRE KEY_NAME seconds
TTL KEY_NAME 【-1表示永不过期,-2表示已经过期】

  1. String:单值单value

GET KEY_NAME 【GET 只能用于处理字符串值】

SET KEY_NAME KEY_VALUE 【新建、覆盖】
GETSET KEY_NAME KEY_VALUE 【返回 KEY_NAME的旧值】

SETEX KEY_NAME seconds KEY_VALUE 【等同 SET key value EX second】

MGET KEY_NAME1 KEY_NAME2
MSET KEY_NAME1 KEY_VALUE1 KEY_NAME2 KEY_VALUE2

  1. Hash:kv模式不变,但v是 N个键值对

HDEL MY_HASH field 【HDEL MY_HASH field1 field2 field3】
HGET MY_HASH field
HGETALL MY_HASH
HSET MY_HASH field value

HKEYS MY_HASH
HVALS MY_HASH

  1. List:单值多value

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

LINDEX LIST_NAME index 【index正 0开始;反 -1开始】
LLEN LIST_NAME
LRANGE LIST_NAME start stop

LSET LIST_NAME index VALUE 【index 不可超出范围】
LINSERT LIST_NAME BEFORE|AFTER old_VALUE new_VALUE 【插入新增】

LPOP LIST_NAME 【移除并返回 列表的头元素】
RPOP LIST_NAME 【移除并返回 列表 的尾元素】

想要详细学习 可以参考 http://doc.redisfans.com/index.html

代码

Python 要使用 redis,需要先安装 redis 模块:pip install redis;


def redis_connect(host: str, port: int, pwd: str):
    """
    连接池
    :param host:
    :param port:
    :param pwd:
    :return:
    """
    # redis取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。
    pool = redis.ConnectionPool(host=host, port=port, decode_responses=True, password=pwd, db=0)
    r = redis.Redis(connection_pool=pool)
    return r
    

def test_csdn():
    r = redis_connect(gl_host, gl_port, gl_pwd)

    print(r.info())
    print(r.keys('*TASK*'))

    r_str = 'APP_TASK:zyooooxie'
    r_hash = 'ABzyooooxie'
    r_list = 'external-zyooooxie'
    r_no_exist = 'zy-test'

    # TYPE 命令
    # none (key不存在)、string (字符串)、list (列表)、set (集合)、zset (有序集)、hash (哈希表)
    print(r.type(r_str))       # string
    print(r.type(r_hash))      # hash
    print(r.type(r_list))      # list
    print(r.type(r_no_exist))

    # TTL 命令
    # 当 key 不存在时,返回 -2 。
    # 当 key 存在但没有设置剩余生存时间时,返回 -1 。
    # 否则,以秒为单位,返回 key 的剩余生存时间。
    print(r.ttl(r_str))
    print(r.ttl(r_hash))
    print(r.ttl(r_list))
    print(r.ttl(r_no_exist))
    r.close()


def test_csdn2():

    r = redis_connect(gl_host, gl_port, gl_pwd)
    r_no_exist = 'zy-test'

    test_str = 'str_zy'
    value = 'test-{}'.format(time.time())
    ex = 600

    r.set(test_str, value)

    # get() 当 key 不存在时,返回 None ;否则,返回 key 的值。
    print(r.get(r_no_exist))
    print(r.get(test_str))
    print(r.ttl(test_str))

    # set() 如果 key 已经持有其他值, SET 就覆写旧值,无视类型。
    # 对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键 原有的 TTL 将被清除。
    r.set(test_str, value * 2, ex=ex)
    print(r.get(test_str))

    time.sleep(3)
    print(r.ttl(test_str))

    r.expire(test_str, 60)
    print(r.ttl(test_str))

    r.delete(test_str)
    print(r.get(test_str))

    # ``time`` can be represented by an integer or a Python timedelta object.
    # 简单的用法 还是直接传 int
    from datetime import timedelta
    r.setex(test_str, timedelta(hours=1), value * 3)
    print(r.ttl(test_str))
    print(r.get(test_str))

    # 批量赋值
    # Sets key/values based on a mapping. Mapping is a dictionary of key/value pairs.
    # Both keys and values should be strings or types that can be cast to a string via str().
    r.mset({
    
    'key1': 'value1', 'key2': 'value2', 'key3': 'value3', test_str: '最新'})

    # 批量获取值
    # Returns a list of values ordered identically to ``keys``
    print(r.mget('key1', 'key3', 'key2', test_str))

    # getset() 返回给定 key 的旧值。
    # 当 key 没有旧值时,也即是key不存在时,返回 None 。
    print(r.getset(test_str, 'getset()设置'), '这是getset() 返回的旧值')
    print(r.get(test_str), 'getset()执行后的值')

    print(r.getset(test_str * 10, 'getset()设置 不存在的key'))
    print(r.get(test_str * 10))

    r.delete('key1', 'key3', 'key2', test_str, test_str * 10)
    print(r.mget('key1', test_str))

    r.close()


def test_csdn3():
    r = redis_connect(gl_host, gl_port, gl_pwd)

    test_hash = 'hash_zy'

    # Return a Python dict of the hash's name/value pairs
    print(r.hgetall(test_hash))

    hash_field = 'zy123'
    hash_value = 456

    # Return the value of ``key`` within the hash ``name``
    print(r.hget(test_hash, hash_field))

    r.hset(test_hash, hash_field, hash_value)
    print(r.hget(test_hash, hash_field))

    # ``mapping`` accepts a dict of key/value pairs
    r.hset(test_hash, mapping={
    
    hash_field * 2: hash_value * 2})
    print(r.hgetall(test_hash))

    r.hdel(test_hash, hash_field)
    print(r.hgetall(test_hash))

    # Redis.hmset() is deprecated. Use Redis.hset() instead
    # 少用hmset()
    r.hmset(test_hash, mapping={
    
    hash_field * 3: hash_value * 3, hash_field * 4: hash_value * 4})
    print(r.hgetall(test_hash))

    print(r.hkeys(test_hash), 'HKEYS')
    print(r.hvals(test_hash), 'HVALS')

    # Returns a list of values ordered identically to ``keys``
    print(r.hmget(test_hash, keys=(hash_field * 3, hash_field * 5, hash_field)))

    r.hdel(test_hash, hash_field * 3, hash_field * 5)
    print(r.hgetall(test_hash))

    r.delete(test_hash)
    r.close()


def test_csdn4():
    r = redis_connect(gl_host, gl_port, gl_pwd)

    test_list = 'list_zy'
    r.rpush(test_list, '1f', '2s')            # 新插入元素在右侧,如果list不存在则新建

    print(r.llen(test_list))

    # ``start`` and ``end`` can be negative numbers
    print(r.lrange(test_list, 0, -1))

    print(r.lindex(test_list, 0))
    # Negative indexes are supported and will return an item at the end of the list
    print(r.lindex(test_list, -1))

    r.rpush(test_list, '3t')
    print(r.lrange(test_list, -10, 11))

    r.lpush(test_list, 'xin0')
    print(r.llen(test_list))
    print(r.lrange(test_list, 0, -1))

    # Remove and return the last item of the list ``name``
    r.rpop(test_list)
    print(r.lrange(test_list, 0, -1))

    # Remove and return the first item of the list ``name``
    r.lpop(test_list)
    print(r.lrange(test_list, 0, -1))

    # lset() 将列表 key 下标为 index 的元素的值设置为 value
    # 【重新赋值,不新增】
    # r.lset(test_list, 3, 'new-4')                   # 超出范围 index out of range
    print(r.llen(test_list))

    r.lset(test_list, 1, 'new-1新值')                   # index要小于len;
    r.lset(test_list, 0, '改0')
    print(r.lrange(test_list, 0, -1))

    r.lset(test_list, 0, 'new-0-新值')
    print(r.lrange(test_list, 0, -1), '执行 lset()')

    # linsert() 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
    # 【新增】
    r.linsert(test_list, 'BEFORE', 'new-0-新值', 'insert的1')           # where: BEFORE(前)或AFTER(后)
    print(r.lrange(test_list, 0, -1))

    r.linsert(test_list, 'AFTER', 'new-0-新值', 'insert的3')
    print(r.lrange(test_list, 0, -1))

    # Returns the new length of the list on success or -1 if ``refvalue`` is not in the list.
    print(r.linsert(test_list, 'BEFORE', 'new-0-新值', 'insert的2'))
    print(r.lrange(test_list, 0, -1))

    r.linsert(test_list, 'AFTER', '这是假的', '看看有没有变化')
    print(r.linsert(test_list, 'AFTER', '这是假的2', '看看有没有变化2'))
    print(r.lrange(test_list, 0, -1), '当 pivot 不存在于列表 key 时,不执行任何操作。')

    r.delete(test_list)

    r.close()


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

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

猜你喜欢

转载自blog.csdn.net/zyooooxie/article/details/120334491
今日推荐