Python 操作 Redis 讲解

521 阅读6分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Redis是一款开源的、基于内存的、可持久化存储的key-value型数据库,由于redis拥有丰富的数据结构,且性能极高,并且支持主从同步、分布式、集群等,所以经常用于实时通讯、缓存、高速读写等场景。

Redis有5种常用的数据结构,分别是:String(字符串)、List(列表)、Hash(哈希)、Set(集合)、ZSet(有序集合)。

安装第三方库:pip install redis,安装好redis库之后,只需使用import redis导入即可使用。

创建连接

普通连接

import redis


# 连接数据库
client = redis.StrictRedis(host='localhost', port=6379, db=0)

连接池

pool = redis.ConnectionPool(host='localhost', port=6379)
r = redis.Redis(connection_pool=pool)

字符串String

Python redis模块对Redis字符串的主要操作函数包括:set、get、getset、mset、mget、incr、append、strlen等。

set

为指定的键(key)设置值(value),键不存在则创建,存在则修改。

def set(name, value, ex=None, px=None, nx=False, xx=False, keepttl=False)
  • ex:过期时间(秒)
  • px:过期时间(毫秒)
  • nx:如果设置为True,则只有name不存在时,当前set操作才执行
  • xx:如果设置为True,则只有name存在时,当前set操作才执行
r.set('name', 'tigeriaf')

get

获取指定键(key)绑定的值(value)。

r.get("name")

getset

设置新值,返回旧值。

getset(name, value)  

print(r.getset("name", "hahaha"))  # 输出tigeriaf
print(r.get("name"))  # 输出hahaha

mset

批量设置值。

# 多个值
person = {
    'name1': 'zhangsan',
    'name2': 'lisi'
}
r.mget(person)

mget

批量获取。

# 方式一
print(r.mget("name1", "name2"))
# 方式二
keys = ["name1", "name2"]
print(r.mget(keys))

incr

自增函数,incr(name, amount=1),步长amount默认为1

print(r.incr("count"))  # 输出1
print(r.incr("count", amount=1))  # 输出2
print(r.incr("count", amount=3))  # 输出5
print(r.incr("count", amount=5))  # 输出10
print(r.incr("count", amount=-2))  # 输出8
print(r.get("count"))  # 输出8

append

为指定的字符串追加值,若不存在则直接创建。

append(key, value)

r.set("test", "1111")
r.append("test", "2222")
print(r.get("test"))  # 输出11112222

strlen

返回对应值的字节长度。

r.set("name", "tigeriaf")
print(r.strlen("name"))  # 输出8

delete

删除对应的值。

r.delete("name")

注意: 这个命令可以用于所有类型。

列表List

Python redis模块对Redis列表的主要操作函数包括:lpush,lrange,lindex,blpop,brpop。

lpush

实现了在name对应的list中添加元素,每个新的元素都添加到列表的最左边。

r.lpush("list1", 1)
r.lpush("list1", 2, 3, 4, 5)

此时列表list1内的数据的顺序为5,4,3,2,1。

lrange

获取列表指定范围内的元素。

print(r.lrange("list1", 0, 3))
# 输出为['5', '4', '3', '2']

lindex

根据列表下标获取列表元素值。

print(r.lindex("list1", 1))  # 输出为4

blpop

从列表头部(左边)取出第一个元素,返回该元素值并从列表删除。

print(r.lpop("list1"))  # 输出为5

brpop

从列表尾部(右边)取出第一个元素,返回该元素值并从列表删除。

print(r.rpop("list1"))  # 输出为1

操作哈希Hash

Redis数据库hash数据类型是一个string类型的key和value的映射表,Python redis模块对Redis哈希的主要操作函数包括:hset,hget,hgetall,hmset,hmget,hlen,hkeys,hvals,hexists,hdel,hincrby,hincrbyfloat等。

hset

给对应的hash中设置一个键值对,不存在则创建,存在则修改。

r.hset("hash_name", "a", "1")
r.hset("hash_name", "b", "2")
r.hset("hash_name", "c", "3")

hget

在对应的hash中根据key获取值。

print(r.hget("hash_name", "a"))  # 输出为1

hgetall

获取对应hash的所有键值对。

print(r.hgetall("hash_name"))  # 输出为{'a': '1', 'b': '2', 'c': '3'}

hmset

在对应的hash中批量设置键值对。

dic = {"a1": "1", "b2": "2", "c3": 3}
r.hmset("hash_name", dic)
print(r.hgetall("hash_name"))

hmget

在对应的hash中获取多个key的值。

keys = ["a1", "b2"]
print(r.hmget("hash_name", keys))
print(r.hmget("hash_name", "a1", "b2"))

hlen

获取hash中键值对的个数。

print(r.hlen("hash_name"))

hkeys

获取hash中所有的key的值。

print(r.hkeys("hash_name"))

hvals

获取hash中所有的value的值。

print(r.hvals("hash_name"))

hexists

检查对应的hash中是否存在当前传入的key。

print(r.hexists("hash_name", "a"))  # 输出为True

hdel

删除hash中指定的键值对。

r.hdel("hash_name", "a")

hincrby

自增hash中key对应的值,不存在则创建。

print(r.hincrby("hash_name", "test"))
print(r.hincrby("hash_name", "test", amount=5))

hincrbyfloat

自增hash中key对应的值,不存在则创建。与hincrby不同的是amount为浮点数。

print(r.hincrbyfloat("hash_name", "test_float"))
print(r.hincrbyfloat("hash_name", "test_float", amount=2.5))

集合Set

Set集合就是不允许重复的列表。Python redis模块对Redis集合的主要操作函数包括:sadd、smembers、scard、sdiff、sinter、sismember、append、strlen等。

sadd

向对应的集合中添加元素。

r.sadd("set_name", "a")
r.sadd("set_name", "b", "c")

smembers

获取对应的集合的所有元素。

print(r.smembers("set_name"))

scard

获取name对应的集合中的元素个数。

print(r.scard("set_name"))

sdiff

返回给定多个集合的差集。

r.sadd("set_name", "a", "b", "c")
r.sadd("set_name1", "b", "c")
r.sadd("set_name2", "b", "c", "d")

print(r.sdiff("set_name", "set_name1", "set_name2"))  # 输出为{"a"}

sinter

返回给定多个集合的交集。

r.sadd("set_name", "a", "b", "c")
r.sadd("set_name1", "b", "c")
r.sadd("set_name2", "b", "c", "d")

print(r.sinter("set_name", "set_name1", "set_name2"))  # 输出为{"b","c"}

sunion

返回给定多集合的并集。

print(r.sunion("set_name", "set_name1", "set_name2"))  # 输出为{"a", "b", "c", "d"}

sismember

判断元素是否是指定集合的元素,返回True或者False。

print(sismember("set_name", "a"))

smove

将某个元素从一个集合移动到另外一个集合。

r.smove("set_name", "set_name", "c")

spop

从集合的右侧移除一个元素,并将其返回。

r.spop("set_name")

srandmember

从对应的集合中随机获取元素。可指定获取元素的个数。

print(r.srandmember("set_name", 2))

srem

删除对应的集合中的某些元素。

r.srem("set_name", "a")

有序集合ZSet

有序集合ZSet是在集合的基础上,为集合中的每个元素关联一个double类型的分数(分数可以重复),可以通过分数来为集合中的元素进行排序。所以,有序集合中的每一个元素有两个值,即:值和分数。Python redis模块对Redis集合的主要操作函数包括:zadd、zcard、zcount、zincrby、zrange、zrank、zscore等。

zadd

向对应的有序集合中添加元素。

dic = {
    "a": 1,
    "b": 2,
    "c": 3
}
r.zadd("zset_name", dic)

zcard

获取对应的有序集合内元素的数量。

print(r.zcard("zset_name"))

zcount

获取有序集合中分数在指定区间的个数。

print(r.zcount("zset_name", 1, 2))

zincrby

自增有序集合内value对应的分数。

r.zincrby("zset_name", "a", amount=5)

zrange

按照索引范围获取对应的有序集合中的元素。

zrange(name, start, end, desc=False, withscores=False, score_cast_func=float)
print(r.zrange("zset_name", 1, 2, withscores=True))

zrank

获取value值在对应的有序集合中的排行位置(从0开始)

print(r.zrank("zset_name", "b"))

zscore

获取有序集合中value对应的分数。

print(r.zscore("zset_name", "a"))

zrem

删除对应的有序集合中值是value的元素。

r.zrem("zset_name", "a", "c")

总结

这里只展示了一些很常用的命令函数,还有很多很多,不过也不用可以去记住,因为实在是太多了,使用的时候查一查就可以了,在此附上Redis中文网

最后,感谢女朋友在工作和生活中的包容、理解与支持 !