飞道的博客

python使用redis教程 敲黑板划重点

276人阅读  评论(0)

目标:

学会使用redis,使用python代码又非常简洁。划重点:原来这货就这点知识。并不难。
原文教程太冗余了:详细教程
java版教程:JAVA教程


# win7安装redis:

win7安装redis需要首先下载客户端:提取码1234
然后解压,运行文件夹中的以下服务端和客户端:

然后在python终端或者anaconda终端,输入:pip install redis安装redis。
当服务端出现以下界面,说明服务端已经启动了。端口号为6379.

1、 搭建 好 开发环境,就可以掌握以下知识就够了。

连接池连接redis:

redis使用connection pool来管理对一个redis server的所有连接,避免每次单一连接建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。 掌握直接建立一个连接池,然后作为参数Redis,可以实现多个Redis实例共享一个连接池
import redis    # 导入redis 模块
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.set('name', 'runoob')  # 设置 name 对应的值
print(r.get('name'))  # 取出键 name 对应的值
print(pool)

redis最常用的set和get方法已经如上图了。


redis基本命令:

掌握常用命令即可,不常用的用的时候再查。


String类型的处理命令

1.set(key, value),就是给name赋值为value。

r.set('name', 'runoob')  # 设置 name 对应的值

2.setnx(key, value)
设置值,只有name不存在时,执行设置操作。

print(r.setnx('fruit1', 'banana'))  # fruit1不存在,输出为True

3.一次性设置多个值mset,一次性获取多个值mget。

r.mset({
   'k1': 'v1', 'k2': 'v2'})
print(r.mget("k1", "k2"))   # 一次取出多个键对应的值
print(r.mget("k1"))

4、获取指定序列字符串getrange(key, start, end),注意包含start和end,和python中的range函数不一样。

r.set("en_name","luoji") # 字母
print(r.getrange("en_name", 0, 2))  # 取索引号是0-2 前3位的字节luo 切片操作
print(r.getrange("en_name", 0, -1)) # 取所有的字节 luoji 切片操作

5.计数函数(增加函数)
增加incr(self, name, amount=1)
同incrbyfloat(self, name, amount=1.0)。
减少decr(self, name, amount=1)。
假定我们对统计网页点击次数。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。所以,点击数的增加使用redis的INCR命令最好不过了。

r.set("visit:12306:totals", 34634)
r.incr("visit:12306:totals")
r.incr("visit:12306:totals")
print(r.get("visit:12306:totals"))

输出34636
6、append(key, value)
在redis name对应的值后面追加内容。

r.set("name","luoji") # 字母
r.append("name", "shuaige")    # 在name对应的值luoji后面追加字符串shuaige
print(r.get("name"))

输出:luojishuaige

hash类型的处理命令

1.hset(name, key,value),就是给name赋值为value。
hget(name,key)

r.hset("hash1", "k1", "v1")
r.hset("hash1", "k2", "v2")
print(r.hkeys("hash1")) # 取hash中所有的key
print(r.hget("hash1", "k1"))    # 单个取hash的key对应的值
print(r.hmget("hash1", "k1", "k2")) # 多个取hash的key对应的值

2、hgetall(name)
获取name对应hash的所有键值

print(r.hgetall("hash1"))

3、hlen(name)
获取name对应的hash中键值对的个数.
4、hkeys(name)
获取name对应的hash中所有的key的值
5、hvals(name)
获取name对应的hash中所有的value的值
6、hexists(name, key)
检查name对应的hash是否存在当前传入的key

print(r.hlen("hash1"))
print(r.hkeys("hash1"))
print(r.hvals("hash1"))
print(r.hexists("hash1", "k4"))  # False 不存在

7、hdel(name,*keys)
将name对应的hash中指定key的键值对删除

r.hdel("hash1", "k1")    # 删除一个键值对
print(r.hgetall("hash1"))

8、hincrby(name, key, amount=1)
自增name对应的hash中的指定key的值,不存在则创建key=amount

r.hincrby("hash1", "k4", amount=1)  # 不存在的话,value默认就是1
print(r.hgetall("hash1"))

9、hscan_iter(name, match=None, count=None)
利用实现分批去redis中获取数据
参数:
match,匹配指定key,默认None 表示所有的key

for item in r.hscan_iter('hash1'):
    print(item)

list类型的处理命令

1.lpush(listname,values)
在listname中添加最左边添加元素。
对应有rpush(listname,values)
在listname中添加最右边添加元素。


r.lpush("list1", 11, 22, 33)
print(r.lrange('list1', 0, -1))  # 输出33,22,11

r.rpush("list2", 111, 212, 313)  # 表示从右向左操作
print(r.llen("list2"))  # 列表长度
print(r.lrange("list2", 0, 3))  # 切片取出值,范围是索引号0-3输出111, 212, 313

2、r.lset(name, index, value)
对name对应的list中的某一个索引位置重新赋值
3、删除(指定值进行删除)
r.lrem(name, value, num)
在name对应的list中删除指定的值
参数:
name,redis的name
value,要删除的值
num, num=0,删除列表中所有的指定值;

r.lrem("list2", "22",0)    # 将列表中所有的"22"删除

4、取值(根据索引号取值)
lindex(name, index)
在name对应的列表中根据索引获取列表元素

print(r.lindex("list2", 0))

5.自定义增量迭代
由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要:

1、获取name对应的所有列表
2、循环列表

但是,如果列表非常大,那么就有可能在第一步时就将程序的内存撑爆,所有有必要自定义一个增量迭代的功能:

def list_iter(name):
    """
    自定义redis列表增量迭代
    :param name: redis中的name,即:迭代name对应的列表
    :return: yield 返回 列表元素
    """
    list_count = r.llen(name)
    for index in range(list_count):
        yield r.lindex(name, index)

# 使用
for item in list_iter('list2'): # 遍历这个列表
    print(item)

set类型的处理命令

1.新增
sadd(name,values)
name对应的集合中添加元素

2.获取元素个数 类似于len
scard(name)
获取name对应的集合中元素个数

3.获取集合中所有的成员
smembers(name)
获取name对应的集合的所有成员

r.sadd("set1", 33, 44, 55, 66)  # 往集合中添加元素
print(r.scard("set1"))  # 集合的长度是4
print(r.smembers("set1"))   # 获取集合中所有的成员

4、获取集合中所有的成员,sscan(name)
返回一个元组,元组第二个成员是list的值。

print(r.sscan("set1"))

输出:(0, [‘33’, ‘44’, ‘55’, ‘66’])
5、list可以做差、交、并集,这里了解。

有序set类型的处理命令

Set操作,Set集合就是不允许重复的列表,本身是无序的。
有序集合,在集合的基础上,为每元素排序;元素的排序需要根据另外一个值来进行比较,
所以,对于有序集合,每一个元素有两个值,即:值和权重,专门用来做排序。

1.新增
zadd(name, *args, **kwargs)
在name对应的有序集合中添加元素

2.获取有序集合元素个数 类似于len
zcard(name)
获取name对应的有序集合元素的数量

3、获取有序集合的所有元素
r.zrange( name, start, end,

r.zadd("zset2", {
   'm1': 22, 'm2': 44})
print(r.zcard("zset2")) # 集合长度
print(r.zrange("zset2", 0, -1))   # 获取有序集合中所有元素

4、获取所有元素–默认按照分数顺序排序
zscan(name)

5 获取所有元素–迭代器
zscan_iter(name)

print(r.zscan("zset2"))
for i in r.zscan_iter("zset2"): # 遍历迭代器
    print(i)

6、删除–指定值删除
zrem(name, values)
删除name对应的有序集合中值是values的成员

r.zrem("zset2", "n3")   # 删除有序集合中的元素n3 删除单个

其他常用操作

1.删除
delete(names)
根据删除redis中的任意数据类型(string、hash、list、set、有序set)

r.delete("gender")  # 删除key为gender的键值对

2.检查名字是否存在
exists(name)
检测redis的name是否存在,存在就是True,False 不存在

print(r.exists("zset1"))

3.模糊匹配
keys(pattern=’’)
根据模型获取redis的name
更多:
KEYS * 匹配数据库中所有 key 。

print(r.keys("foo*"))

4.获取类型
type(name)
获取name对应值的类型

print(r.type("set1"))

5.查看所有元素
scan(cursor=0, match=None, count=None)
需要分类型。这里注意

print(r.hscan("hash2"))
print(r.sscan("set3"))
print(r.zscan("zset2"))

6.查看所有元素–迭代器,需要分类型。
scan_iter(name, count=None)

for i in r.hscan_iter("hash1"):
    print(i)

for i in r.sscan_iter("set3"):
    print(i)

for i in r.zscan_iter("zset3"):
    print(i)

管道(pipeline)

redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,
如果想要在一次请求中执行多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。

管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令。减少服务器-客户端之间反复的TCP数据库包,从而大大提高了执行批量命令的效率。

import redis
import time
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
pipe = r.pipeline() # 创建一个管道

pipe.set('name', 'jack')
pipe.set('role', 'sb')
pipe.sadd('faz', 'baz')
pipe.incr('num')    # 如果num不存在则vaule为1,如果存在,则value自增1
pipe.execute()

print(r.get("name"))
print(r.get("role"))
print(r.get("num"))

管道的命令可以写在一起,如:

pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute()

但是建议分开好看些。

redis总结:

(Redis) 是key-value 存储系统,是跨平台的非关系型数据库。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。


转载:https://blog.csdn.net/weixin_43290383/article/details/115561786
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场