主要内容

在Windows10中,安装基于python的redis库,并连接redis-server服务器
python中使用redis库操作字符串、哈希、列表、集合和有序集合

安装准备

  1. 确保已经在本地安装了redis-server服务器,这里以在windows10上安装redis为例,安装过程可参考

Windows10安装Redis5.0.9总结

  1. 启动redis-server
#若是没有把redis没有把redis的根目录配置到配置环境变量中,则需要先切换到根目录再执行:
redis-server
#启动redis服务后,使用以下命令启动客户端:
redis-cli
#若显示以下信息说明启动redis-server可被正常连接
#C:\Users\Lenovo>redis-cli
#127.0.0.1:6379>
  1. 这里假设你已经具备了python的开发环境,并且可在pycharm开发工具中正常使用

若没有安装redis,这里则需要在pycharm的Terminal中执行:

pip install redis

python中使用redis

示例1:redis连接、字符串键值对操作

import redis


# 普通连接
def redis_connect():
    rd = redis.StrictRedis(host='127.0.0.1', port=6379, db=0, decode_responses=True)
    try:
        rd.set('mykey', 'myvalue')
        print(rd.get('mykey'))
    except Exception as e:
        print(f'connect failed:{e}')


# 使用redis连接池获取连接
def redis_pool_connect():
    # 连接池
    pool = redis.ConnectionPool(max_connections=100, host='127.0.0.1', port=6379, db=1, decode_responses=True)
    rd = redis.Redis(connection_pool=pool)
    return rd


# get、set、delete方法
def set_test():
    rd = redis_pool_connect()
    try:
        rd.set('username', "张三")
        print('xxxx')
        username = rd.get('username')
        print(f"username={username}")
        res = rd.delete(username)
        print(f'删除res={res}')
    except Exception as e:
        print(f'redis异常:{e}')


# mset,mget方法
def mset_test():
    rd = redis_pool_connect()
    # 同时设置多个键值对
    rd.mset({'name1': 'mike', "name2": 'Tom', "name3": 'Jason'})
    # 取出多个键对应的值,返回list
    names = rd.mget("name1", "name2", "name3")
    print(f"mget----names={names}")
    # ['mike', 'Tom', 'Jason']

    # 取出某个值,并且再设置这个值为新的
    # name1 = rd.get("name1")
    # print(f"name1={name1}")
    # rd.set("name1", "Lucy")

    name = rd.getset("name1", "Lucy")
    print(f"name={name}")
    name1 = rd.get("name1")
    print(f"name1={name1}")
    # 如果不存在则返回:None
    res = rd.get("name999")
    if res:
        print('not exist')


# hset,hget, hekeys方法
def hset_test():
    rd = redis_pool_connect()
    rd.hset("myhash", "key1", "value1")
    rd.hset("myhash", "key2", "value2")
    keys = rd.hkeys("myhash")
    print(f'所有键:{keys}')
    values = rd.hvals("myhash")
    print(f'所有值:{values}')
    ret = rd.hexists("myhash", "key1")
    if ret:
        print("[hexists] key1 存在")
    else:
        print("[hexists] key1 不存在")
    # hget不存在返回None
    val = rd.hget("myhash", "key14")
    print(f"[hget]key---{val}")


# hmset,hmvals 方法
def hmset_test():
    rd = redis_pool_connect()
    # DeprecationWarning: Redis.hmset() is deprecated. Use Redis.hset() instead.
    rd.hmset("namehash", {"name1": "zhangsna", "name2": "lisi", "name3": "wangwu"})
    keys = rd.hkeys("namehash")
    print(f'[hkeys]所有键的名称:{keys}')
    vals = rd.hvals("namehash")
    print(f'[hvals]所有的值:{vals}')

    name1, name2 = rd.hmget("namehash", "name1", "name2")
    print(f'[hmget]name1的值:{name1},name2的值:{name2}')

    rd.hmset("mymhash", {"key1": "value1", "key2": "value2"})
    res = rd.hmget("mymhash", "key1", "key2")
    print(res)


if __name__ == '__main__':
    set_test()
    mset_test()
    hset_test()
    hmset_test()

示例2:redis集合、列表操作

# 连接池
import redis

pool = redis.ConnectionPool(max_connections=100, host='127.0.0.1', port=6379, db=1, decode_responses=True)
rd = redis.Redis(connection_pool=pool)


def redis_list():
    # 列表左边压入元素
    rd.lpush("mylist", "a")
    rd.lpush("mylist", "b", "c", "d", "e", "f")
    elem = rd.lpop("mylist")
    print(f'列表头部弹出元素:{elem}')
    # 右边压入
    rd.rpush("mylist", 1, 2, 3)
    len = rd.llen("mylist")
    print(f"列表元素个数:{len}")
    # 取出第1个元素到最后一个元素
    arr = rd.lrange("mylist", 0, -1)
    print(f'列表中所有元素{arr}')
    elem = rd.rpop("mylist")
    print(f"列表右边谈出一个元素:{elem}")
    elem = rd.lindex("mylist", 0)
    print(f"查看第1个元素:{elem}")
    rd.delete("mylist")
    print(f"删除mylist后长度:{rd.llen('mylist')}")


def set_test():
    rd.sadd("myset", "value1", "value2", "value3", "value4", "value5")
    elems = rd.sscan('myset')
    print(f"集合中所有元素:{elems}")
    elems = rd.smembers("myset")
    print(f"集合中所有元素:{elems}")
    # 添加一个重复的元素,返回0
    res = rd.sadd("myset", "value2")
    print(f"加入一个重复的元素:{res}")
    res = rd.sismember("myset", "value1")
    print(f"myset中是否有一个成员:{res}")
    res = rd.srem("myset", "value1")
    print(f"删除元素的个数:{res}")
    print(f"元素是否存在:{rd.sismember('myset', 'value1')}")
    elem = rd.spop("myset")
    print(f"删除一个元素:{elem}")


def set_calculate():
    rd.sadd("myset1", "a", "b", "c")
    elems = rd.smembers("myset1")

    print(f"myset1元素:{elems}")
    elems = rd.smembers("myset2")

    rd.sadd("myset2", "c", "d", "e", "f")
    print(f"myset2元素:{elems}")
    # 属于myset1但不属于myset2的集合
    df = rd.sdiff("myset1", "myset2")
    print(f"两个集合的差集:{df}")

    inter = rd.sinter("myset1", "myset2")
    print(f"集合的交集:{inter}")

    union = rd.sunion("myset1", "myset2")
    print(f"集合的并集:{union}")


def zset_test():
    # 数值表示有序集合元素的分值
    dic = {"张三": 80, "李四": 95}
    rd.zadd("users", dic)
    rd.zadd("users", {"王五": 83, "赵六": 79, "小昭": 93, "小明": 89})
    nums = rd.zcard("users")
    print(f"有序集合的个数:{nums}")
    # withscores=True表示显示成员的分数
    elems = rd.zrange("users", 0, -1, withscores=True)
    print(f"所有有序集合:{elems}")
    # 删除有序集合中元素
    rd.zrem("users", "李四")
    elems = rd.zrange('users', 0, -1)
    print(f"所有元素集合:{elems}")
    # 删除0,1元素
    # rd.zremrangebyrank("users", 0, 1)
    # print(f"删除集合之后:{rd.zrange('users', 0, -1)}")
    rd.zremrangebyscore("users", 80, 90)
    print(f"删除分值[80,90]范围的集合之后:{rd.zrange('users', 0, -1, withscores=True)}")

if __name__ == "__main__":
    redis_list()
    set_test()
    set_calculate()
    zset_test()