1 Redis介绍和安装
# Redis :软件,存储数据的,速度非常快,redis是一个key-value存储系统(没有表的概念),cs架构的软件
-服务端 客户端(python作为客户端,java,go,图形化界面,命令窗口的命令)
# es:存数据的地方
# 关系型数据库和非关系型数据库
-关系型:mysql,PostgreSQL,oracle,sqlserver,db2
-PG
-去 IOE:国产化
-IBM---》浪潮信息,曙光,联想
-Oracle---》数据----》达梦。。。。
-EMC存储--》国产存储
-非关系型数据库(nosql):redis(缓存),mongodb(json文档数据存储),es(大数据量存储)。。。。
-nosql 指非关系型数据库: no only sql,对关系型数据库的补充
# redis特点:
-开源软件,存数据,cs架构
-key-value存储 ,5大数据类型 value的类型是5种:字符串,hash(字典),列表,集合,有序集合
-速度快:
-1 纯内存存储(核心)
-2 使用了IO多路复用的网络模型
-3 数据操作是单线程,避免了线程间切换,而且没有锁,也不会数据错乱
-支持持久化
-纯内存,可以存到硬盘上,防止数据丢失
-redis又被称之为 缓存数据库
1.1 安装redis
# redis 是用c语言编写的,需要在不同平台编译成可执行文件,才能在这个平台上运行
-redis 使用了io多路复用种的epoll模型,win不支持epoll
-redis官方,不支持win版本
-微软官方,就把redis改动,编译成可执行,能运行在win上,滞后 3.x版本
-第三方:5.x版本
# redis 官方网:https://redis.io/download/
# redis中文网:http://redis.cn
# win:3.x:https://github.com/microsoftarchive/redis/releases
# win:5.x:https://github.com/tporadowski/redis/releases/
# 安装:一路下一步
-安装完成后,在安装路径下有
-redis-cli.exe # mysql
-redis-server.exe # mysqld
-redis.windows-service.conf # my.ini
-并且会自动做成服务
-服务的命令:redis-server.exe redis.windows-service.conf
# 启动redis服务端
-1 命令行中 redis 就可以启动服务
-2 命令行中,启动服务,并指定配置文件
redis-server 配置文件路径
-3 使用服务启动
# 客户端链接
-1 命令行客户端:
-redis-cli # 默认连本地的6379端口
-redis-cli -p 6379 -h 127.0.0.1
-2 图形化客户端链接
-1 最新版的Navicate支持链接redis了(收费的)
-2 Redis Desktop Manager(https://resp.app/) 收费的 用的多 qt写图形化界面
-qt是个平台,做GUI[图形化界面]开发
-用c写,用python写 pyqt5
-3 python的模块
-pip install redis
2 redis普通链接和连接池
2.1 普通链接
from redis import Redis
# conn = Redis() # 建立redis的链接
conn = Redis(host="127.0.0.1",
port=6379,
db=0,decode_responses=True) # 建立redis的链接 decode_responses=True,查询回来返回的结果是字符串类型,否则是byte格式
res = conn.get('name') # 获取key名为name的value值
print(res)
conn.close() # 关闭链接
2.2 连接池链接
# 一定要保证,池是单例的,以模块导入的形式做成了单例,是python独有的,所有线程共用一个连接池,而不是每个线程独有一个
# pool.py
import redis
POOL = redis.ConnectionPool(max_connections=1000,host='127.0.0.1',port=6379)
# 其它.py
import redis
from pool import POOL # 模块导入的方式, 天然单例
conn = redis.Redis(connection_pool=POOL) # 以后拿到链接,是从POOL种取,如果没有可用的了,默认不阻塞,可以通过某个参数配置,设置阻塞等待
res = conn.get('name') # 获取key名为name的value值
print(res)
conn.close() # 关闭链接
3 redis字符串类型
# https://www.cnblogs.com/liuqingzheng/articles/9833534.html
'''
1 set(name, value, ex=None, px=None, nx=False, xx=False)
2 setnx(name, value)
3 psetex(name, time_ms, value)
4 mset(*args, **kwargs)
5 get(name)
6 mget(keys, *args)
7 getset(name, value)
8 getrange(key, start, end)
9 setrange(name, offset, value)
10 setbit(name, offset, value)
11 getbit(name, offset)
12 bitcount(key, start=None, end=None)
13 bitop(operation, dest, *keys)
14 strlen(name)
15 incr(self, name, amount=1)
16 incrbyfloat(self, name, amount=1.0)
17 decr(self, name, amount=1)
18 append(key, value)
'''
import redis
conn = redis.Redis()
1 set(name, value, ex=None, px=None, nx=False, xx=False)
# ex,过期时间(秒)
# px,过期时间(毫秒)
# nx,如果设置为True,name不存在则添加,存在无效果
# xx,如果设置为True,name存在则修改,不存在无效果
conn.set('hobby', '篮球', ex=6)
conn.set('hobby', '篮球', px=3000)
conn.set('hobby', '足球', nx=True)
conn.set('hobby', '足球', xx=True)
2 setnx(name, value)
conn.setnx('hobby1', '乒乓球')
# 等同于conn.set('hobby', '足球', nx=True)
3 psetex(name, time_ms, value)
conn.psetex('name',3000,'xxx') #px
setex(name, value, time)
conn.psetex('name',3000,'xxx') #ex
4 mset(*args, **kwargs)
conn.mset({'name': "lqz", 'height': 183})
# 一次性设置多个键值对,跟一次次设置的区别是,少了网络交互的时间
5 get(name)
res=conn.get('hobby')
# utf-8 编码,一个中文占3个字节 GBK 编码,一个中文占2个字节
# print(res)
6 mget(keys, *args)
res=conn.mget('name','age') #批量取值
res=conn.mget(['name','age'])
print(res)
7 getset(name, value)
res=conn.getset('name','彭于晏')
print(res)
8 getrange(key, start, end)
res=conn.getrange('name',0,1) # 前闭后闭区间,拿的是字节,不是字符
print(res)
9 setrange(name, offset, value)
conn.setrange('name',2,'lqz')
14 strlen(name)
res=conn.strlen('name') # 9 统计字节长度
print(res)
15 incr(self, name, amount=1) # 做计数器。不会出现并非安全问题,每一次执行默认加1
conn.incrby('height')
16 incrbyfloat(self, name, amount=1.0)
17 decrby(self, name, amount=1)
conn.decrby('height',5) #减5
18 append(key, value)
conn.append('name', 'xxxx') #末尾添加
conn.close()
'''
get
set
strlen
append
'''
4 redis hash类型
# hash类型就是咱们python中的字典,key-value,字典又叫hash类型 字典的key必须可hash
-字典类型在底层存储,基于数组存的
key---{key:value,key:value}
conn = redis.Redis(decode_responses=True)
1 hset(name, key, value)
conn.hset('userinfo', 'name', '刘亦菲')
conn.hset('userinfo', 'age', '38')
2 hmset(name, mapping) # 弃用了,还能用
conn.hmset('userinfo2', {'name': "彭于晏", 'height': 183})
#批量添加
conn.hset('userinfo3', mapping={'name': "彭于晏123", 'height': 183})
3 hget(name,key)
res=conn.hget('userinfo','age')
print(res)
4 hmget(name, keys, *args)
res=conn.hmget('userinfo',['name','age'])
print(res)
5 hgetall(name) # 慎用,如果hash中key非常的,可能会撑爆内存
#字典形式获取所有
res=conn.hgetall('userinfo')
print(res)
6 hlen(name)
#获取字段的个数
res=conn.hlen('userinfo')
print(res)
7 hkeys(name)
#获取所有key值
print(conn.hkeys('userinfo'))
8 hvals(name)
#获取所有value值
print(conn.hvals('userinfo'))
9 hexists(name, key)
#查看该key是否存在
print(conn.hexists('userinfo','name'))
10 hdel(name,*keys)
#删除键里面对应key的键值对
conn.hdel('userinfo2', 'name', 'height')
11 hincrby(name, key, amount=1)
#默认加1
conn.hincrby('userinfo3','height')
12 hincrbyfloat(name, key, amount=1.0)
13 他们是一家 #批量添加
for i in range(1000):
conn.hset('hash_test', 'egg_%s' % i, '鸡蛋%s号' % i)
14 res=conn.hgetall('hash_test')
print(res)
15 hscan(name, cursor=0, match=None, count=None) 分批获取,获取多少个,约等于,它不单独用
res = conn.hscan('hash_test', cursor=0, count=20)
print(len(res[1]))
16 hscan_iter(name, match=None, count=None) # 获取所有,但是分批获取
res=conn.hscan_iter('hash_test',count=10) # 取出所有,每次拿10条,用完再取10条,直到取完,内部使用了hscan+生成器
for item in res:
print(item)
conn.close()
'''
hset
hget
hlen
hexisit
'''
标签:hash,name,res,redis,value,连接池,key,conn
From: https://www.cnblogs.com/whxx/p/17509931.html