主要内容
在Windows10中,安装基于python的redis库,并连接redis-server服务器
python中使用redis库操作字符串、哈希、列表、集合和有序集合
安装准备
- 确保已经在本地安装了redis-server服务器,这里以在windows10上安装redis为例,安装过程可参考
Windows10安装Redis5.0.9总结
- 启动redis-server
#若是没有把redis没有把redis的根目录配置到配置环境变量中,则需要先切换到根目录再执行:
redis-server
#启动redis服务后,使用以下命令启动客户端:
redis-cli
#若显示以下信息说明启动redis-server可被正常连接
#C:\Users\Lenovo>redis-cli
#127.0.0.1:6379>
- 这里假设你已经具备了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()