redis介绍和安装
- redis 什么?
- 数据库就是个存数据的地方:只是不同数据库数据组织,存放形式不一样
- 关系型数据库:mysql、oracle、sqlserver、postgrasql
- 非关系型数据(no sql):redis,mongodb,clickhouse,infludb,elasticsearch,hadoop
- 没有sql:没有sql语句
- not olny sql 不仅仅是sql
- redis:一款纯内存存储的非关系型数据库(数据都在内存),速度非常快
- redis特点:
https://www.cnblogs.com/liuqingzheng/articles/9833534.html
- redis是一个key-value存储系统
- 数据类型丰富,支持5大数据类型:字符串,列表,hash(字典),集合,有序集合
- 纯内存操作
- 可以持久化:能都把内存数据,保存到硬盘上永久存储
- redis为什么这快?
- 纯内存,减少io
- 使用了 io多路复用的 epoll 网络模型
- 数据操作是单线程,避免了线程间切换
- 多个客户端同时操作,不会存在并发安全问题
安装
- 最新是7,公司里5、6比较多
- 开源软件,免费的,他们不支持win
- epoll模型不支持win
- 微软官方:基于源码修改 ⇢ \dashrightarrow ⇢ 编译成可执行文件
- 第三方:
https://github.com/tporadowski/redis/releases/
步骤
- win:下载安装包,一路下一步
- 安装目录在环境变量中:任意路径敲 redis-server reidis-cli 都能找到
- redis做成了服务,以后通过服务启动即可
- mac:官网下载,解压即可
-
win,mac:两个可执行文件:
- redis-server :等同于 mysqld
- reidis-cli :等同于mysql
启动,连接
-
启动方式
- 使用服务启动
- 使用命令启动:
redis-server
-
连接
1.本地:redis-cli
2.远端:redis-cli -h 地址 -p 端口(默认端口6379)
-
图形化客户端
- resp: https://github.com/lework/RedisDesktopManager-Windows/releases
- Navicate
连接上发现有16个库
-
放值
使用图形化客户端放入值 -
取值
cmd中连接Redis后:get key
redis普通连接和连接池
-
python 代码作为客户端—》连接
-
安装模块:
pip install redis
普通连接
from redis import Redis
coon = Redis(host='localhost', port=6379, db=0, decode_responses=True)
res= coon.get('name')
print(res)
coon.close()
连接池
import redis
POOL = redis.ConnectionPool(host='localhost', port=6379, max_connections=50)
from threading import Thread
def task():
coon = redis.Redis(connection_pool=POOL)
print(coon.get('name'))
coon.close()
if __name__ == '__main__':
for i in range(5):
t = Thread(target=task)
t.start()
redis字符串类型
conn为实例化得到对象
- 新增或修改:
conn.set(key, value, ex=None, px=None, nx=False, xx=False)
- ex:过期时间(秒)
- px:过期时间(毫秒)
- nx:如果设置为True,则只有key不存在时,当前set操作才执行,值存在,就修改不了,执行没效果
- xx:如果设置为True,则只有key存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值
- sex中nx为Ture:
conn.setnx(key, value)
- sex中ex传值:
conn.setex(name, value, time)
- sex中px传值:
conn.psetex(name, time_ms, value)
- 批量新增或修改:
conn.mset(*args, **kwargs)
- 获取值:
conn.get(key)
- 批量获取值:
conn.mget(keys, *args)
- 新增或修改值并返回之前的值:
conn.getset(key, value)
- 获取start到end的字符:
conn.getrange(key, start, end)
- 从offset位置开始修改成value:
conn.setrange(key, offset, value)
conn.setbit(key, offset, value)
conn.getbit(key, offset)
conn.bitcount(key, start=None, end=None)
conn.bitop(operation, dest, *keys)
- 统计长度:
conn.strlen(key)
- 自加整数:
conn.incr(key, amount=1)
key值为数字,amount默认1,执行一遍,值增加amount - 自加浮点型:
conn.incrbyfloat(key, amount=1.0)
- 自减整数:
conn.decr(self, key, amount=1)
- 自减浮点型:
conn.append(key, value)
redis hash类型
hash 类型,就是咱们python中的字典类型, 数据结构:数据的组织形式 底层存储 数组
⇢
\dashrightarrow
⇢ 根据key值使用hash函数得到结构,存到数组中
字典的key值必须可hash
字典的key值必须是不可变数据类型
hash 类型无序,跟放的先后顺序无关的
python 的字典是 有序的 字典+列表
- 新增或修改:
conn.hset(name, key, value)
- 批量新增或修改:
conn.hmset(name, mapping)
conn.hmset('userinfo2',{'name':'pyy',"age":33}) conn.hset('userinfo3',mapping={'name':'xxx',"age":33})
- 获取值:
conn.hget(name,key)
- 批量获取值:
conn.hmget(name, keys, *args)
- 取出hash中里的所有数据(k:v):
conn.hgetall(name)
- 获取hash中数据数量:
conn.hlen(name)
- 以列表获取所有key:
conn.hkeys(name)
- 以列表获取所有value:
conn.hvals(name)
- 验证hash中有无key值,返回布尔值:
conn.hexists(name, key)
- 批量删除值:
conn.hdel(name,*keys)
conn.hdel('userinfo', 'age', 'hobby')
- 将key值自增:
conn.hincrby(name, key, amount=1)
- 将key值自增(浮点型):
conn.hincrbyfloat(name, key, amount=1.0)
- 从name中cursor位置取出count个值:
conn.hscan(name, cursor=0, match=None, count=None)
- 一次性全取出,成迭代器:
conn.hscan_iter(name, match=None, count=None)
redis列表类型
进行操作列表类型的表
- 从列表最左边数据新增:
conn.lpush(name, values)
- 从列表最右边数据新增:
conn.rpush(name, values)
- 列表name存在时,从左边新增:
conn.lpushx(name, value)
- 列表name存在时,从右边新增:
conn.rpushx(name, value)
- 获取列表长度:
conn.llen(name)
- 以refvalue为参照物添加值:
conn.linsert(name, where, refvalue, value))
- 前:
where=before
- 后:
where=after
- 前:
- 修改index
conn.lset(name, index, value)
- 从左侧删count个value值:
conn.lrem(name, count, value)
- 从列表左侧删除并弹出:
conn.lpop(name)
- 从列表右侧删除并弹出:
conn.rpop(name)
- 取出index位置的值:
conn.lindex(name, index)
- 从start位置到end位置取出:
conn.lrange(name, start, end)
- 留下从start位置到end位置,其他全部删除:
conn.ltrim(name, start, end)
- 从列表src右侧弹出添加到dst左侧:
conn.rpoplpush(src, dst)
- 从左侧阻塞式弹出:
conn.blpop(keys, timeout)
- 如果列表内没值,timeout(秒)时间到返回None
- 从左侧阻塞式删除弹出:
conn.brpop(keys, timeout)
, - 阻塞式从列表src右侧弹出添加到dst左侧:
conn.brpoplpush(src, dst, timeout=0)