redis缓存数据库
redis介绍与安装
缓存数据库,非关系型数据库(nosql),由c语言写的服务端用于在内存中存取数据(读取速度快)
速度快的原因有
纯内存操作
网络模型使用的IO多路复用
单进程,单线程架构,没有线程进程间的切换,更少的消耗资源
版本:最新7.x,稳定5.x
系统:mac,linux源码编译安装,win由微软编译成了安装包,由以下网址下载
最新5.x版本 https://github.com/tporadowski/redis/releases/
最新3.x版本 https://github.com/microsoftarchive/redis/releases
安装后,win系统中释放了两个命令:
- redis-server启动服务端,可以
-bind -b
绑定ip,-port -p
选择端口,不选择则按配置启动 - redis-cli启动客户端,默认连接本机的6379端口,也可
-h -p
选择
ps:当安装时,系统就会自动的将服务端添加到系统服务中,我们本地测试使用时可以不用配置了。
python-redis模块
pip install redis
连接redis
普通连接
import redis
conn = redis.Redis() # 默认不填,就是连接本地的6379端口
# conn = redis.Redis(host='127.0.0.1', port=6379) # 设置连接的端口地址再连接
""" web项目中的使用:
一定是不同的请求都要访问redis服务端,每一个请求都会起一个连接来访问服务端请求操作。
以下为用线程模拟多个请求去访问redis连接:
"""
def task():
conn = redis.Redis(connection_pool)
print(conn.get('name'))
for i in range(1000):
t = Tread(target=task)
t = start() # 同一时间出现过多连接的时候,可能导致连接数过多
连接池连接
限制项目中对redis服务端的连接数。
与进程池线程池的概念类似,先开辟几个固定的连接,每次需要连接redis,从这连接池中取即可。
"""pool.py 通过导模块实现单例模式,让redis连接池在整个项目中只会产生一次"""
import redis
POOL = redis.ConnectionPool(max_connections=10, host='127.0.0.1', port=6379)
调用连接池:
conn = redis.Redis(connection_pool=POOL) # 传入连接池对象即可
redis数据类型
字符串参数
>>> import redis
>>> conn = redis.Redis() # 默认不填,就是连接本地的6379端口
>>> conn.set("name","leethon") # 设置键值对
True
>>> conn.get("name") # 按键取值
b'leethon' # 取出的是bytes类型
>>> conn.set("name","lee") # 覆盖之前的name
True
>>> conn.get("name")
b'lee'
>>> conn.set("age","18",ex=10) # 设置10秒后过期清除
True
>>> conn.get("age") # 在10秒内可以取到
b'18'
>>> conn.get("age") # 等待十秒后再去取,找不到age了
>>> conn.get("age")
>>> conn.set("name","leethon",nx=True) # nx参数,当有name时放弃set设置
>>> conn.get("name")
b'lee'
>>> conn.set("name","leethon",xx=True) # xx参数,当没有name时放弃set设置
True
>>> conn.get("name")
b'leethon'
>>> conn.mset({"age":18,"hobby":"run"}) # 批量设置键值
True
>>> conn.get("age")
b'18'
>>> conn.mget("name","age","hobby") # 批量拿数据组织为列表
[b'leethon', b'18', b'run']
>>> conn.getset("hobby","python")
b'run'
>>> conn.get("hobby")
b'python'
>>> conn.strlen("hobby")
6
>>> conn.incr("age", 2) # 自增,第二个参数表示间隔
20
>>> conn.decr("age", 3) # 自减,第二个参数表示间隔
17
>>> conn.getrange('name',0,9) # 获取指定字节范围的
b'leethon is'
>>> conn.setrange('name',0,'everyone') # 修改指定位置的字符串
19
>>> conn.get('name')
b'everyoneis handsome'