目标:
学会使用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